Merge "Add ovn clustering support"

This commit is contained in:
Zuul 2021-06-18 17:01:11 +00:00 committed by Gerrit Code Review
commit 8f7a948dcb
5 changed files with 118 additions and 15 deletions

View File

@ -439,6 +439,7 @@ calico_felix_sha256: ae0bed304702097cee0ad5d9b4abb07b263deeb46ac21f2bcb0118d5bf4
calico_felix_validate_certs: yes
# OVN Defaults
neutron_ovn_primary_cluster_node: "{{ groups[neutron_services['neutron-ovn-northd']['group']] | first }}"
neutron_ovn_northd_service_name: ovn-northd
neutron_ovn_controller_service_name: ovn-controller
neutron_ovn_l3_scheduler: leastloaded

View File

@ -128,3 +128,14 @@
listen:
- "Restart neutron services"
- "venv changed"
- name: start ovn-central service
service:
name: ovn-central
state: started
# (NOTE) Restarting twice to cleanup some pid.
- name: restart ovn-central service
service:
name: ovn-central
state: restarted

View File

@ -0,0 +1,86 @@
---
# (c) 2021, Satish Patel <satish.txt@gmail.com>
#
# Copyright
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# checking if ovn db are clustered or not, if not then this is fresh node.
- name: Check if ovn db is clustered
command: ovsdb-tool db-is-clustered /var/lib/ovn/ovnnb_db.db
ignore_errors: true
failed_when: false
register: _check_cluster_db
tags:
- skip_ansible_lint
# We need to clean existing ovn db/lock file before cluster join.
- name: Clean up db/lock files before creating ovn cluster
when:
- _check_cluster_db.rc != 0
block:
- name: Stop ovn services
service:
name: "{{ item }}"
state: stopped
with_items:
- ovn-northd
- ovn-central
- name: Clean up ovn db directory
file:
path: /var/lib/ovn/
state: absent
# We are finding leader node so new nodes use leader to join cluster.
- name: Find leader node in ovn cluster
shell: ovs-appctl -t /var/run/ovn/ovnnb_db.ctl cluster/status OVN_Northbound | sed 's/ //g' | grep -oP '(?<=Role:).*'
args:
executable: /bin/bash
ignore_errors: true
delegate_to: "{{ item }}"
with_items: "{{ groups['neutron_ovn_northd'] }}"
run_once: true
failed_when: false
register: _find_leader
tags:
- skip_ansible_lint
# set leader_node variable
- name: Set leader_node fact
set_fact:
leader_node: "{{ (_find_leader.results | selectattr('stdout', 'search', 'leader')) | map(attribute='item') | list }}"
# This play only run first time to build cluster using primary node.
- name: Setup ovn cluster using primary node.
template:
src: ovn-central.j2
dest: "/etc/default/ovn-central"
when:
- "inventory_hostname == neutron_ovn_primary_cluster_node"
- _check_cluster_db.rc != 0
- not leader_node
notify:
- start ovn-central service
- restart ovn-central service
# This play will add nodes in existing cluster using leader_node var.
- name: Join new nodes to ovn cluster using leader node
template:
src: ovn-central.j2
dest: "/etc/default/ovn-central"
when:
- _check_cluster_db.rc != 0
notify:
- start ovn-central service
- restart ovn-central service

View File

@ -20,21 +20,6 @@
- (neutron_services['neutron-ovn-northd']['group'] in group_names) or
(neutron_services['neutron-ovn-controller']['group'] in group_names)
- name: Create ovsdb-server Listener
command: "ovs-vsctl set-manager ptcp:6640"
when:
- neutron_services['neutron-ovn-northd']['group'] in group_names
- name: Configure OVN Northbound Listener
command: "ovn-nbctl set-connection ptcp:6641:{{ openstack_service_bind_address }} -- set connection . inactivity_probe=60000"
when:
- neutron_services['neutron-ovn-northd']['group'] in group_names
- name: Configure OVN Southbound Listener
command: "ovn-sbctl set-connection ptcp:6642:{{ openstack_service_bind_address }} -- set connection . inactivity_probe=60000"
when:
- neutron_services['neutron-ovn-northd']['group'] in group_names
# (NOTE) This makes all computes eligible to be gateway nodes
- name: Set CMS Options for Gateway Scheduling
command: "ovs-vsctl set open . external-ids:ovn-cms-options=enable-chassis-as-gw"
@ -99,3 +84,6 @@
- neutron_provider_networks.network_mappings is defined
- neutron_services['neutron-ovn-controller']['group'] in group_names
- include_tasks: ovn_cluster_setup.yml
when:
- neutron_services['neutron-ovn-northd']['group'] in group_names

17
templates/ovn-central.j2 Normal file
View File

@ -0,0 +1,17 @@
# {{ ansible_managed }}
# OVN cluster parameters
OVN_CTL_OPTS=" \
--db-nb-create-insecure-remote=yes \
--db-sb-create-insecure-remote=yes \
--db-nb-addr={{ ansible_host }} \
--db-sb-addr={{ ansible_host }} \
--db-nb-cluster-local-addr={{ ansible_host }} \
--db-sb-cluster-local-addr={{ ansible_host }} \
{% if leader_node %}
--db-nb-cluster-remote-addr={% for item in leader_node %}{{ item }} {% endfor %} \
--db-sb-cluster-remote-addr={% for item in leader_node %}{{ item }} {% endfor %} \
{% endif %}
--ovn-northd-nb-db=tcp:{{ groups['neutron_ovn_northd'] | map('extract', hostvars, ['ansible_host']) | join(':6641,tcp:') }}:6641 \
--ovn-northd-sb-db=tcp:{{ groups['neutron_ovn_northd'] | map('extract', hostvars, ['ansible_host']) | join(':6642,tcp:') }}:6642 \
"