diff --git a/docs/dictionary/en-custom.txt b/docs/dictionary/en-custom.txt
index add6797c83..509aa64054 100644
--- a/docs/dictionary/en-custom.txt
+++ b/docs/dictionary/en-custom.txt
@@ -42,6 +42,7 @@ baseimg
baseurl
bashrc
bd
+bgp
blockquote
bmaas
bmc
diff --git a/hooks/playbooks/adoption_bgp_post_undercloud.yaml b/hooks/playbooks/adoption_bgp_post_undercloud.yaml
new file mode 100644
index 0000000000..9c953f721f
--- /dev/null
+++ b/hooks/playbooks/adoption_bgp_post_undercloud.yaml
@@ -0,0 +1,32 @@
+---
+# Copyright Red Hat, Inc.
+# All Rights Reserved.
+#
+# 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.
+
+- name: BGP post_undercloud hook
+ hosts: "{{ cifmw_target_host | default('localhost') }}"
+ gather_facts: false
+ tasks:
+ - name: Remove default route from UC
+ delegate_to: "{{ _vm }}"
+ become: true
+ ansible.builtin.command:
+ cmd: ip route del default via 192.168.111.1
+ failed_when: false
+ loop: >-
+ {{
+ _vm_groups['osp-underclouds'] | list
+ }}
+ loop_control:
+ loop_var: _vm
diff --git a/hooks/playbooks/adoption_bgp_pre_undercloud.yaml b/hooks/playbooks/adoption_bgp_pre_undercloud.yaml
new file mode 100644
index 0000000000..6511f0f0b8
--- /dev/null
+++ b/hooks/playbooks/adoption_bgp_pre_undercloud.yaml
@@ -0,0 +1,61 @@
+---
+# Copyright Red Hat, Inc.
+# All Rights Reserved.
+#
+# 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.
+
+- name: BGP pre_undercloud hook
+ hosts: "{{ cifmw_target_host | default('localhost') }}"
+ gather_facts: false
+ tasks:
+ - name: Add default route to UC and OC nodes
+ delegate_to: "{{ _vm }}"
+ become: true
+ ansible.builtin.command:
+ cmd: ip route add default via 192.168.111.1
+ loop: >-
+ {{
+ _vm_groups['osp-underclouds'] | list +
+ _vm_groups['osp-r0-computes'] | list +
+ _vm_groups['osp-r0-controllers'] | list +
+ _vm_groups['osp-r1-computes'] | list +
+ _vm_groups['osp-r1-controllers'] | list +
+ _vm_groups['osp-r2-computes'] | list +
+ _vm_groups['osp-r2-controllers'] | list
+ }}
+ loop_control:
+ loop_var: _vm
+ - name: Prefer IPv4 over IPv6 for name resolution
+ delegate_to: "{{ _vm }}"
+ become: true
+ ansible.builtin.lineinfile:
+ path: /etc/gai.conf
+ line: 'precedence ::ffff:0:0/96 100'
+ regexp: '^#?\s*precedence ::ffff:0:0/96' # Matches the line, even if commented
+ state: present
+ create: true
+ owner: root
+ group: root
+ mode: '0644'
+ loop: >-
+ {{
+ _vm_groups['osp-underclouds'] | list +
+ _vm_groups['osp-r0-computes'] | list +
+ _vm_groups['osp-r0-controllers'] | list +
+ _vm_groups['osp-r1-computes'] | list +
+ _vm_groups['osp-r1-controllers'] | list +
+ _vm_groups['osp-r2-computes'] | list +
+ _vm_groups['osp-r2-controllers'] | list
+ }}
+ loop_control:
+ loop_var: _vm
diff --git a/playbooks/bgp/prepare-bgp-spines-leaves.yaml b/playbooks/bgp/prepare-bgp-spines-leaves.yaml
index 02cc851648..53bea8643a 100644
--- a/playbooks/bgp/prepare-bgp-spines-leaves.yaml
+++ b/playbooks/bgp/prepare-bgp-spines-leaves.yaml
@@ -1,4 +1,60 @@
---
+- name: Start spines and leafs and add them to inventory
+ hosts: localhost
+ vars:
+ leafs_list:
+ - leaf-0
+ - leaf-1
+ - leaf-2
+ - leaf-3
+ - leaf-4
+ - leaf-5
+ spines_list:
+ - spine-0
+ - spine-1
+ routers_list:
+ - router-0
+ fabric_list: "{{ leafs_list + spines_list + routers_list }}"
+ tasks:
+ - name: Start spine and leaf VMs
+ delegate_to: hypervisor
+ become: true
+ community.libvirt.virt:
+ name: "cifmw-{{ item }}"
+ state: running
+ loop: "{{ fabric_list }}"
+
+ - name: Add leafs group to inventory
+ when: '"leafs" not in groups'
+ ansible.builtin.add_host:
+ name: "{{ item }}.utility"
+ group: leafs
+ loop: "{{ leafs_list }}"
+
+ - name: Add spines group to inventory
+ when: '"spines" not in groups'
+ ansible.builtin.add_host:
+ name: "{{ item }}.utility"
+ group: spines
+ loop: "{{ spines_list }}"
+
+ - name: Add routers group to inventory
+ when: '"routers" not in groups'
+ ansible.builtin.add_host:
+ name: "{{ item }}.utility"
+ group: routers
+ loop: "{{ routers_list }}"
+
+ - name: Check SSH connectivity
+ delegate_to: hypervisor
+ ansible.builtin.wait_for:
+ port: 22
+ host: "{{ item }}.utility"
+ search_regex: OpenSSH
+ delay: 10
+ timeout: 120
+ loop: "{{ fabric_list }}"
+
- name: Common spines and leaves configuration
hosts: "spines,leafs{{ router_bool | default(false) | ternary(',routers', '') }}"
tasks:
@@ -183,10 +239,13 @@
autoconnect: true
conn_name: "{{ item }}"
type: ethernet
+ ifname: "{{ router_downlink_ifs[loop_index | int] }}"
method4: disabled
method6: link-local
state: present
loop: "{{ router_downlink_conns }}"
+ loop_control:
+ index_var: loop_index
# uplink router IPv4 is configured for both IPv4 and IPv6 jobs
- name: Configure uplink router connections with nmcli when IPv4
@@ -453,6 +512,8 @@
autoconnect: true
conn_name: "{{ item }}"
ip4: "{{ leaf_ds_ip4 }}/30"
+ type: ethernet
+ ifname: "{{ downlink_ifs_rack3[loop_index | int] }}"
method4: manual
method6: link-local
state: present
@@ -470,6 +531,8 @@
autoconnect: true
conn_name: "{{ item }}"
ip4: "{{ leaf_ds_ip4 }}/30"
+ type: ethernet
+ ifname: "{{ leaf_downlink_ifs[loop_index | int] }}"
method4: manual
method6: link-local
state: present
@@ -513,6 +576,8 @@
conn_name: "{{ item }}"
ip4: "{{ _leaf_ds_ip4 }}/30"
ip6: "{{ _leaf_ds_ip6 }}/126"
+ type: ethernet
+ ifname: "{{ leaf_downlink_ifs[loop_index | int] }}"
method4: manual
method6: manual
state: present
@@ -549,8 +614,12 @@
conn_name: "{{ item }}"
method4: disabled
method6: link-local
+ type: ethernet
+ ifname: "{{ uplink_ifs[loop_index | int] }}"
state: present
loop: "{{ uplink_conns }}"
+ loop_control:
+ index_var: loop_index
- name: Enable FRR Zebra daemon
become: true
diff --git a/roles/adoption_osp_deploy/README.md b/roles/adoption_osp_deploy/README.md
index 89f929134f..de16add977 100644
--- a/roles/adoption_osp_deploy/README.md
+++ b/roles/adoption_osp_deploy/README.md
@@ -28,6 +28,9 @@ configure the OSP17.1 deployment.
* `cifmw_adoption_osp_deploy_overcloud_extra_args`: (String) The content of a
file which will be used with the -e option in the overcloud deploy command.
This is useful to specify private/restricted parameters.
+* `cifmw_adoption_osp_deploy_bgp`: (Boolean) Enable BGP support for the OSP
+ deployment. When enabled, uses BGP-specific network configurations and
+ templates. Defaults to `false`.
### Break point
diff --git a/roles/adoption_osp_deploy/defaults/main.yml b/roles/adoption_osp_deploy/defaults/main.yml
index 4c3e20016e..f9323b5cc4 100644
--- a/roles/adoption_osp_deploy/defaults/main.yml
+++ b/roles/adoption_osp_deploy/defaults/main.yml
@@ -30,3 +30,5 @@ cifmw_adoption_osp_deploy_adoption_vars_exclude_nets:
- "{{ cifmw_libvirt_manager_pub_net | default('ocpbm') }}"
cifmw_adoption_osp_deploy_overcloud_extra_args: ''
+
+cifmw_adoption_osp_deploy_bgp: false
diff --git a/roles/adoption_osp_deploy/files/bgp-tht-cinder-patch b/roles/adoption_osp_deploy/files/bgp-tht-cinder-patch
new file mode 100644
index 0000000000..5078c8064f
--- /dev/null
+++ b/roles/adoption_osp_deploy/files/bgp-tht-cinder-patch
@@ -0,0 +1,10 @@
+--- cinder-api-container-puppet.yaml.bkp 2025-08-29 18:07:23.465927047 +0000
++++ cinder-api-container-puppet.yaml 2025-08-29 18:07:57.061261925 +0000
+@@ -434,6 +434,7 @@
+ - {get_param: RootStackName}
+ name: "{{ item.service_name }}"
+ service_type: "{{ item.service_type }}"
++ timeout: 300
+ state: absent
+ loop:
+ - {service_name: cinderv2, service_type: volumev2}
diff --git a/roles/adoption_osp_deploy/files/bgp-tht-frr-patch b/roles/adoption_osp_deploy/files/bgp-tht-frr-patch
new file mode 100644
index 0000000000..ccd67b1ac2
--- /dev/null
+++ b/roles/adoption_osp_deploy/files/bgp-tht-frr-patch
@@ -0,0 +1,14 @@
+--- a/deployment/frr/frr-container-ansible.yaml
++++ b/deployment/frr/frr-container-ansible.yaml
+@@ -327,6 +327,11 @@ outputs:
+ - name: Wait to give FRR time to converge
+ wait_for:
+ timeout: {get_param: FrrConvergeTimeout}
++ - name: Remove temporary route
++ become: true
++ ansible.builtin.shell: |
++ sudo ip r del default
++ changed_when: false
+ update_tasks:
+ - name: Update FRR
+ when:
diff --git a/roles/adoption_osp_deploy/tasks/config_files.yml b/roles/adoption_osp_deploy/tasks/config_files.yml
index 28eab22e97..4c4a0e1a55 100644
--- a/roles/adoption_osp_deploy/tasks/config_files.yml
+++ b/roles/adoption_osp_deploy/tasks/config_files.yml
@@ -34,7 +34,16 @@
register: _original_config_download
delegate_to: "localhost"
+- name: Copy config download file as is (bgp)
+ when: cifmw_adoption_osp_deploy_bgp | bool
+ delegate_to: "osp-undercloud-0"
+ ansible.builtin.copy:
+ content: "{{ _original_config_download['content'] |b64decode | from_yaml | to_nice_yaml(indent=2, sort_keys=false) }}"
+ dest: "{{ ansible_user_dir }}/config_download_{{ _stack.stackname }}.yaml"
+ mode: "0644"
+
- name: Generate config download file
+ when: not (cifmw_adoption_osp_deploy_bgp | bool)
vars:
_ctlplane_net: "{{ cifmw_networking_env_definition.networks.ctlplane }}"
_hostname_map_translation: >-
diff --git a/roles/adoption_osp_deploy/tasks/generate_adoption_vars.yml b/roles/adoption_osp_deploy/tasks/generate_adoption_vars.yml
index a6913bc271..c61d50910b 100644
--- a/roles/adoption_osp_deploy/tasks/generate_adoption_vars.yml
+++ b/roles/adoption_osp_deploy/tasks/generate_adoption_vars.yml
@@ -22,6 +22,7 @@
- user_dir
- name: Generate adoption vars file
+ when: not (cifmw_adoption_osp_deploy_bgp | bool)
delegate_to: "controller-0"
vars:
_undercloud_name: "{{ _vm_groups['osp-underclouds'] | first }}"
@@ -44,3 +45,22 @@
src: "adoption_vars.yaml.j2"
dest: "{{ ansible_user_dir }}/adoption_vars.yaml"
mode: "0644"
+
+
+- name: Generate adoption vars file (BGP)
+ when: cifmw_adoption_osp_deploy_bgp | bool
+ delegate_to: "controller-0"
+ vars:
+ _undercloud_name: "{{ _vm_groups['osp-underclouds'] | first }}"
+ _undercloud_net: "{{ cifmw_networking_env_definition.instances[_undercloud_name] }}"
+ _undercloud_ip: "{{ _undercloud_net.networks.ctlplaner0[ip_version|default('ip_v4')] }}"
+ _controller_1_name: "{{ _vm_groups['osp-r0-controllers'] | first }}"
+ _controller_1_net: "{{ cifmw_networking_env_definition.instances[_controller_1_name] }}"
+ _controller_1_internalapi_ip: "99.99.0.9"
+ _compute_1_name: "{{ _vm_groups['osp-r0-computes'] | first }}"
+ _compute_1_net: "{{ cifmw_networking_env_definition.instances[_compute_1_name] }}"
+ _compute_1_ip: "{{ _compute_1_net.networks.ctlplaner0[ip_version|default('ip_v4')] }}"
+ ansible.builtin.template:
+ src: "adoption_vars_bgp.yaml.j2"
+ dest: "{{ ansible_user_dir }}/adoption_vars.yaml"
+ mode: "0644"
diff --git a/roles/adoption_osp_deploy/tasks/prepare_overcloud.yml b/roles/adoption_osp_deploy/tasks/prepare_overcloud.yml
index d259b8c866..149c281a29 100644
--- a/roles/adoption_osp_deploy/tasks/prepare_overcloud.yml
+++ b/roles/adoption_osp_deploy/tasks/prepare_overcloud.yml
@@ -137,12 +137,21 @@
script: "{{ _source_cmd }}; {{ _vip_provision_cmd }}"
- name: Create tripleo ansible inventory
+ when: not (cifmw_adoption_osp_deploy_bgp | bool)
delegate_to: "osp-undercloud-0"
ansible.builtin.template:
src: "tripleo-ansible-inventory.yaml.j2"
dest: "{{ ansible_user_dir }}/overcloud-deploy/{{ _overcloud_name }}/tripleo-ansible-inventory.yaml"
mode: "0644"
+ - name: Create tripleo ansible inventory (BGP)
+ when: cifmw_adoption_osp_deploy_bgp | bool
+ delegate_to: "osp-undercloud-0"
+ ansible.builtin.template:
+ src: "tripleo-ansible-inventory_bgp.yaml.j2"
+ dest: "{{ ansible_user_dir }}/overcloud-deploy/{{ _overcloud_name }}/tripleo-ansible-inventory.yaml"
+ mode: "0644"
+
- name: Ensure os-net-config and openvswitch is installed in overcloud nodes
become: true
delegate_to: "{{ overcloud_vm }}"
@@ -184,6 +193,78 @@
loop: "{{ _tripleo_nodes_stack[_overcloud_name] }}"
loop_control:
loop_var: overcloud_vm
+ when: not (cifmw_adoption_osp_deploy_bgp | bool)
+
+ - name: Generate os-net-config file for overcloud nodes (bgp)
+ become: true
+ delegate_to: "{{ overcloud_vm }}"
+ vars:
+ _node_net: "{{ cifmw_networking_env_definition.instances[overcloud_vm] }}"
+ _dns_server: "{{ _ctlplane_net.[dns_version|default('dns_v4')] }}"
+ _interface_mtu: 1500
+ vms:
+ osp-r0-compute-0:
+ ctlplane: '192.168.122.100'
+ left: '100.64.0.2'
+ right: '100.65.0.2'
+ main: '99.99.0.7'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0004'
+ osp-r0-compute-1:
+ ctlplane: '192.168.122.101'
+ left: '100.64.0.6'
+ right: '100.65.0.6'
+ main: '99.99.0.8'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0005'
+ osp-r1-compute-0:
+ ctlplane: '192.168.123.105'
+ left: '100.64.1.2'
+ right: '100.65.1.2'
+ main: '99.99.1.7'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0006'
+ osp-r1-compute-1:
+ ctlplane: '192.168.123.106'
+ left: '100.64.1.6'
+ right: '100.65.1.6'
+ main: '99.99.1.8'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0007'
+ osp-r2-compute-0:
+ ctlplane: '192.168.124.110'
+ left: '100.64.2.2'
+ right: '100.65.2.2'
+ main: '99.99.2.7'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0008'
+ osp-r2-compute-1:
+ ctlplane: '192.168.124.111'
+ left: '100.64.2.6'
+ right: '100.65.2.6'
+ main: '99.99.2.8'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0009'
+ osp-r0-controller-0:
+ ctlplane: '192.168.122.140'
+ left: '100.64.0.26'
+ right: '100.65.0.26'
+ main: '99.99.0.9'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0001'
+ osp-r1-controller-0:
+ ctlplane: '192.168.123.142'
+ left: '100.64.1.26'
+ right: '100.65.1.26'
+ main: '99.99.1.9'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0002'
+ osp-r2-controller-0:
+ ctlplane: '192.168.124.144'
+ left: '100.64.2.26'
+ right: '100.65.2.26'
+ main: '99.99.2.9'
+ main6: 'f00d:f00d:f00d:f00d:f00d:f00d:f00d:0003'
+ ansible.builtin.template:
+ src: "os_net_config_overcloud_bgp.yml.j2"
+ dest: /etc/os-net-config/tripleo_config.yaml
+ mode: "0644"
+ loop: "{{ _tripleo_nodes_stack[_overcloud_name] }}"
+ loop_control:
+ loop_var: overcloud_vm
+ when: cifmw_adoption_osp_deploy_bgp | bool
- name: Configure network interfaces for overcloud nodes
become: true
@@ -208,3 +289,24 @@
loop: "{{ _tripleo_nodes_stack[_overcloud_name] }}"
loop_control:
loop_var: overcloud_vm
+
+ - name: Apply patch to increase cinder-api timeout (bgp)
+ when: cifmw_adoption_osp_deploy_bgp | bool
+ delegate_to: "osp-undercloud-0"
+ become: true
+ block:
+ - name: Ensure patch package is installed in undercloud
+ ansible.builtin.dnf:
+ name: patch
+ state: present
+
+ - name: BGP workaround apply patch
+ ansible.posix.patch:
+ src: "{{ item.patch_file }}"
+ dest: "{{ item.dest_file }}"
+ strip: 1
+ loop:
+ - patch_file: files/bgp-tht-cinder-patch
+ dest_file: /usr/share/openstack-tripleo-heat-templates/deployment/cinder/cinder-api-container-puppet.yaml
+ - patch_file: files/bgp-tht-frr-patch
+ dest_file: /usr/share/openstack-tripleo-heat-templates/deployment/frr/frr-container-ansible.yaml
diff --git a/roles/adoption_osp_deploy/tasks/prepare_undercloud.yml b/roles/adoption_osp_deploy/tasks/prepare_undercloud.yml
index 522fb5ed0a..59630dae6e 100644
--- a/roles/adoption_osp_deploy/tasks/prepare_undercloud.yml
+++ b/roles/adoption_osp_deploy/tasks/prepare_undercloud.yml
@@ -59,6 +59,9 @@
openstack tripleo container image prepare
default --output-env-file
{{ ansible_user_dir }}/containers-prepare-parameters.yaml
+ {% if cifmw_adoption_osp_deploy_scenario.container_prepare_local_push_dest | default(false) | bool %}
+ --local-push-destination
+ {% endif %}
cifmw.general.ci_script:
output_dir: "{{ cifmw_basedir }}/artifacts"
script: "{{ _container_prepare_cmd }}"
@@ -106,6 +109,7 @@
mode: '0755'
- name: Generate os-net-config file
+ when: not (cifmw_adoption_osp_deploy_bgp | bool)
become: true
vars:
_undercloud_name: "{{ _vm_groups['osp-underclouds'] | first }}"
@@ -122,6 +126,24 @@
dest: /etc/os-net-config/tripleo_config.yaml
mode: "0644"
+ - name: Generate os-net-config file (bgp)
+ when: cifmw_adoption_osp_deploy_bgp | bool
+ become: true
+ vars:
+ _undercloud_name: "{{ _vm_groups['osp-underclouds'] | first }}"
+ _undercloud_net: "{{ cifmw_networking_env_definition.instances[_undercloud_name] }}"
+ _ctlplane_ip: "{{ _undercloud_net.networks.ctlplaner0[ip_version|default('ip_v4')] }}"
+ _ctlplane_vip: "{{ cifmw_adoption_osp_deploy_scenario.undercloud.ctlplane_vip }}"
+ _ctlplane_net: "{{ cifmw_networking_env_definition.networks.ctlplaner0}}"
+ _dns_server: "{{ _ctlplane_net[dns_version|default('dns_v4')] }}"
+ _gateway_ip: "{{ _ctlplane_net[gw_version|default('gw_v4')] }}"
+ _interface_mtu: "{{ _undercloud_net.networks.ctlplaner0.mtu }}"
+ _ctlplane_cidr: "{{ _undercloud_net.networks.ctlplaner0[prefix_length_version|default('prefix_length_v4')] }}"
+ ansible.builtin.template:
+ src: "os_net_config_undercloud_bgp.yml.j2"
+ dest: /etc/os-net-config/tripleo_config.yaml
+ mode: "0644"
+
- name: Copy undercloud.conf file to location to edit it
ansible.builtin.copy:
src: "/usr/share/python-tripleoclient/undercloud.conf.sample"
@@ -130,6 +152,7 @@
mode: "0644"
- name: Add environment specific vars for undercloud
+ when: not (cifmw_adoption_osp_deploy_bgp | bool)
vars:
_undercloud_name: "{{ _vm_groups['osp-underclouds'] | first }}"
_undercloud_net: "{{ cifmw_networking_env_definition.instances[_undercloud_name] }}"
@@ -185,6 +208,33 @@
combine(_env_undercloud, recursive=true, list_merge="append_rp")
}}
+- name: Add environment specific vars for undercloud (bgp)
+ when: cifmw_adoption_osp_deploy_bgp | bool
+ vars:
+ _undercloud_name: "{{ _vm_groups['osp-underclouds'] | first }}"
+ _undercloud_net: "{{ cifmw_networking_env_definition.instances[_undercloud_name] }}"
+ _undercloud_ip: "{{ _undercloud_net.networks.ctlplaner0[ip_version|default('ip_v4')] }}"
+ _undercloud_net_prefix: "{{ _undercloud_net.networks.ctlplaner0[prefix_length_version|default('prefix_length_v4')] }}"
+ _ctlplane_cidr: "{{ cifmw_networking_env_definition.networks.ctlplaner0[network_version|default('network_v4')] }}"
+ _interface_mtu: "{{ _undercloud_net.networks.ctlplaner0.mtu }}"
+ _env_undercloud:
+ config:
+ - section: DEFAULT
+ option: undercloud_ntp_servers
+ value: "{{ cifmw_adoption_osp_deploy_ntp_server }}"
+ - section: DEFAULT
+ option: container_images_file
+ value: "{{ ansible_user_dir }}/containers-prepare-parameters.yaml"
+ - section: DEFAULT
+ option: net_config_override
+ value: "/etc/os-net-config/tripleo_config.yaml"
+ ansible.builtin.set_fact:
+ _undercloud_conf: >-
+ {{
+ cifmw_adoption_osp_deploy_scenario.undercloud |
+ combine(_env_undercloud, recursive=true, list_merge="append_rp")
+ }}
+
- name: Copy undercloud overrides file if present and amend undercloud conf
when: cifmw_adoption_osp_deploy_scenario.undercloud.undercloud_parameters_override is defined
vars:
diff --git a/roles/adoption_osp_deploy/templates/adoption_vars_bgp.yaml.j2 b/roles/adoption_osp_deploy/templates/adoption_vars_bgp.yaml.j2
new file mode 100644
index 0000000000..182e244b10
--- /dev/null
+++ b/roles/adoption_osp_deploy/templates/adoption_vars_bgp.yaml.j2
@@ -0,0 +1,209 @@
+#jinja2: trim_blocks:True, lstrip_blocks:True
+source_mariadb_ip: 99.99.0.9
+source_ovndb_ip: 99.99.0.9
+edpm_node_hostname: {{ _compute_1_name }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+edpm_node_ip: {{ _compute_1_ip }}
+
+edpm_computes: |
+ {% for compute in _vm_groups['osp-r0-computes'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[compute] %}
+ ["{{ compute }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="{{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}"
+ {% endfor %}
+ {% for compute in _vm_groups['osp-r1-computes'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[compute] %}
+ ["{{ compute }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="{{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}"
+ {% endfor %}
+ {% for compute in _vm_groups['osp-r2-computes'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[compute] %}
+ ["{{ compute }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="{{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}"
+ {% endfor %}
+
+
+{% if _vm_groups['osp-r0-networkers'] | default([]) | length > 0 %}
+edpm_networkers: |
+ {% for networker in _vm_groups['osp-r0-networkers'] | default([]) %}
+ {% set node_nets = cifmw_networking_env_definition.instances[networker] %}
+ ["{{ networker }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="{{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}"
+ {% endfor %}
+ {% for networker in _vm_groups['osp-r1-networkers'] | default([]) %}
+ {% set node_nets = cifmw_networking_env_definition.instances[networker] %}
+ ["{{ networker }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="{{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}"
+ {% endfor %}
+ {% for networker in _vm_groups['osp-r2-networkers'] | default([]) %}
+ {% set node_nets = cifmw_networking_env_definition.instances[networker] %}
+ ["{{ networker }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="{{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}"
+ {% endfor %}
+{% endif %}
+
+
+source_galera_members: |
+ {% for controller in _vm_groups['osp-r0-controllers'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[controller] %}
+ ["{{ controller }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="99.99.0.9"
+ {% endfor %}
+ {% for controller in _vm_groups['osp-r1-controllers'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[controller] %}
+ ["{{ controller }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="99.99.1.9"
+ {% endfor %}
+ {% for controller in _vm_groups['osp-r2-controllers'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[controller] %}
+ ["{{ controller }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}"]="99.99.2.9"
+ {% endfor %}
+
+
+{% if _vm_groups['osp-r0-computes'] | default([]) | length > 0 %}
+edpm_nodes:
+ {% for compute in _vm_groups['osp-r0-computes'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[compute] %}
+ {{ compute }}:
+ hostName: {{ compute }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner0' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% for compute in _vm_groups['osp-r1-computes'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[compute] %}
+ {{ compute }}:
+ hostName: {{ compute }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner1' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% for compute in _vm_groups['osp-r2-computes'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[compute] %}
+ {{ compute }}:
+ hostName: {{ compute }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner2' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+{% endif %}
+
+edpm_nodes_networker:
+{% if _vm_groups['osp-r0-networkers'] | default([]) | length > 0 %}
+ {% for networker in _vm_groups['osp-r0-networkers'] | default([]) %}
+ {% set node_nets = cifmw_networking_env_definition.instances[networker] %}
+ {{ networker }}:
+ hostName: {{ networker }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner0' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% for networker in _vm_groups['osp-r1-networkers'] | default([]) %}
+ {% set node_nets = cifmw_networking_env_definition.instances[networker] %}
+ {{ networker }}:
+ hostName: {{ networker }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner1' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% for networker in _vm_groups['osp-r2-networkers'] | default([]) %}
+ {% set node_nets = cifmw_networking_env_definition.instances[networker] %}
+ {{ networker }}:
+ hostName: {{ networker }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner2' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+{% endif %}
+ {% for controller in _vm_groups['osp-r0-controllers'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[controller] %}
+ {{ controller }}:
+ hostName: {{ controller }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner0' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% for controller in _vm_groups['osp-r1-controllers'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[controller] %}
+ {{ controller }}:
+ hostName: {{ controller }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner1' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+ {% for controller in _vm_groups['osp-r2-controllers'] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[controller] %}
+ {{ controller }}:
+ hostName: {{ controller }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ansible:
+ ansibleHost: {{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}
+ networks:
+ {% for net in node_nets.networks.keys() if net not in cifmw_adoption_osp_deploy_adoption_vars_exclude_nets %}
+ - fixedIP: {{ node_nets.networks[net][ip_version|default('ip_v4')] }}
+ name: {{ net }}
+ subnetName: subnet1
+{% if net == 'ctlplaner2' %}
+ defaultRoute: true
+{% endif %}
+ {% endfor %}
+ {% endfor %}
+
+
+upstream_dns: {{ cifmw_networking_env_definition.networks.ctlplane[dns_version|default('dns_v4')] | first }}
+os_cloud_name: {{ cifmw_adoption_osp_deploy_scenario.stacks[0].stackname }}
+standalone_ip: {{ _undercloud_ip }}
diff --git a/roles/adoption_osp_deploy/templates/os_net_config_overcloud_bgp.yml.j2 b/roles/adoption_osp_deploy/templates/os_net_config_overcloud_bgp.yml.j2
new file mode 100644
index 0000000000..68174c8155
--- /dev/null
+++ b/roles/adoption_osp_deploy/templates/os_net_config_overcloud_bgp.yml.j2
@@ -0,0 +1,64 @@
+#jinja2: trim_blocks:True, lstrip_blocks:True
+network_config:
+- type: interface
+ name: nic1
+ mtu: {{ _interface_mtu }}
+ use_dhcp: true
+ routes: []
+- type: interface
+ name: nic2
+ mtu: {{ _interface_mtu }}
+{% if 'r0' in overcloud_vm %}
+ dns_servers: ['192.168.122.1', '192.168.125.1']
+{% elif 'r1' in overcloud_vm %}
+ dns_servers: ['192.168.123.1', '192.168.125.1']
+{% else %}
+ dns_servers: ['192.168.124.1', '192.168.125.1']
+{% endif %}
+ domain: []
+ routes:
+{% if 'r0' in overcloud_vm %}
+ - ip_netmask: 192.168.123.0/24
+ next_hop: 192.168.122.1
+ - ip_netmask: 192.168.124.0/24
+ next_hop: 192.168.122.1
+{% elif 'r1' in overcloud_vm %}
+ - ip_netmask: 192.168.122.0/24
+ next_hop: 192.168.123.1
+ - ip_netmask: 192.168.124.0/24
+ next_hop: 192.168.123.1
+{% else %}
+ - ip_netmask: 192.168.122.0/24
+ next_hop: 192.168.124.1
+ - ip_netmask: 192.168.123.0/24
+ next_hop: 192.168.124.1
+{% endif %}
+ use_dhcp: false
+ addresses:
+ - ip_netmask: {{ vms[overcloud_vm].ctlplane }}/24
+- type: interface
+ name: nic3
+ use_dhcp: false
+ addresses:
+ - ip_netmask:
+ {{ vms[overcloud_vm].left }}/30
+- type: interface
+ name: nic4
+ use_dhcp: false
+ addresses:
+ - ip_netmask:
+ {{ vms[overcloud_vm].right }}/30
+- type: interface
+ name: lo
+ use_dhcp: false
+ addresses:
+ - ip_netmask:
+ {{ vms[overcloud_vm].main }}/32
+ - ip_netmask:
+ {{ vms[overcloud_vm].main6 }}/128
+- type: ovs_bridge
+ name: br-ex
+ use_dhcp: false
+- type: ovs_bridge
+ name: br-vlan
+ use_dhcp: false
diff --git a/roles/adoption_osp_deploy/templates/os_net_config_undercloud_bgp.yml.j2 b/roles/adoption_osp_deploy/templates/os_net_config_undercloud_bgp.yml.j2
new file mode 100644
index 0000000000..63db02a6f4
--- /dev/null
+++ b/roles/adoption_osp_deploy/templates/os_net_config_undercloud_bgp.yml.j2
@@ -0,0 +1,63 @@
+#jinja2: trim_blocks:True, lstrip_blocks:True
+{% if ':' in _ctlplane_ip %}
+{% set _ctlplane_ip_cidr = 128 %}
+{% else %}
+{% set _ctlplane_ip_cidr = 32 %}
+{% endif %}
+{% if ':' in _ctlplane_vip %}
+{% set _ctlplane_vip_cidr = 128 %}
+{% else %}
+{% set _ctlplane_vip_cidr = 32 %}
+{% endif %}
+network_config:
+- type: interface
+ name: nic1
+ mtu: {{ _interface_mtu }}
+ use_dhcp: true
+ routes: []
+- type: ovs_bridge
+ name: br-ctlplane
+ mtu: {{ _interface_mtu }}
+ use_dhcp: false
+ dns_servers:
+ {% for _dns_ip in dns_server | default([]) %}
+ - {{ _dns_ip }}
+ {% endfor %}
+ - {{ _gateway_ip }}
+ domain: []
+ addresses:
+ - ip_netmask: {{ _ctlplane_ip }}/{{ _ctlplane_cidr }}
+ - ip_netmask: {{ _ctlplane_ip }}/{{ _ctlplane_ip_cidr }}
+ - ip_netmask: {{ _ctlplane_vip }}/{{ _ctlplane_vip_cidr }}
+ routes:
+ - ip_netmask: 192.168.123.0/24
+ next_hop: 192.168.122.1
+ - ip_netmask: 192.168.124.0/24
+ next_hop: 192.168.122.1
+ members:
+ - type: interface
+ name: {{ cifmw_adoption_osp_deploy_scenario.undercloud.os_net_config_iface |
+ default('nic2') }}
+ mtu: {{ _interface_mtu }}
+ # force the MAC address of the bridge to this interface
+ primary: true
+- type: interface
+ name: nic3
+ use_dhcp: false
+ addresses:
+ - ip_netmask:
+ 100.64.0.30/30
+- type: interface
+ name: nic4
+ use_dhcp: false
+ addresses:
+ - ip_netmask:
+ 100.65.0.30/30
+- type: interface
+ name: lo
+ use_dhcp: false
+ addresses:
+ - ip_netmask:
+ 99.99.0.33/32
+ - ip_netmask:
+ f00d:f00d:f00d:f00d:f00d:f00d:f00d:25/128
diff --git a/roles/adoption_osp_deploy/templates/tripleo-ansible-inventory_bgp.yaml.j2 b/roles/adoption_osp_deploy/templates/tripleo-ansible-inventory_bgp.yaml.j2
new file mode 100644
index 0000000000..9e947009c4
--- /dev/null
+++ b/roles/adoption_osp_deploy/templates/tripleo-ansible-inventory_bgp.yaml.j2
@@ -0,0 +1,68 @@
+#jinja2: trim_blocks:True, lstrip_blocks:True
+{% for group, role in cifmw_adoption_osp_deploy_scenario.roles_groups_map.items() %}
+{{ role }}:
+ hosts:
+ {% for node in _vm_groups[group] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[node] %}
+ {{ node }}:
+ {% if 'ctlplaner0' in node_nets.networks %}
+ ansible_host: {{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}
+ canonical_hostname: {{ node }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ctlplane_ip: {{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}
+ {% elif 'ctlplaner1' in node_nets.networks %}
+ ansible_host: {{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}
+ canonical_hostname: {{ node }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ctlplane_ip: {{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}
+ {% else %}
+ ansible_host: {{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}
+ canonical_hostname: {{ node }}.{{ cifmw_adoption_osp_deploy_scenario.cloud_domain }}
+ ctlplane_ip: {{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}
+ {% endif %}
+ {% for network_name, net in node_nets.networks.items() %}
+ {% if 'vlan_id' in net %}
+ {% set net_name = ['storage_mgmt'] if network_name == 'storagemgmt' else [network_name] %}
+ {% set net_name = ['internal_api'] if network_name == 'internalapi' else [network_name] %}
+ {{ net_name[0] }}_ip: {{ net[ip_version|default('ip_v4')] }}
+ {% endif %}
+ {% endfor %}
+ {% endfor %}
+ vars:
+ ansible_ssh_common_args: -o StrictHostKeyChecking=no
+ ansible_ssh_user: zuul
+{% endfor %}
+Undercloud:
+ hosts:
+ undercloud: {}
+ vars:
+ ansible_connection: local
+ ansible_host: localhost
+allovercloud:
+ children:
+ {% for _, role in cifmw_adoption_osp_deploy_scenario.roles_groups_map.items() %}
+ {{ role }}: {}
+ {% endfor %}
+computes:
+ children:
+ {% for group, role in cifmw_adoption_osp_deploy_scenario.roles_groups_map.items() %}
+ {% if 'osp' in group and 'compute' in group %}
+ {{ role }}: {}
+ {% endif %}
+ {% endfor %}
+{{ _overcloud_name }}:
+ hosts:
+ {% for group, _ in cifmw_adoption_osp_deploy_scenario.roles_groups_map.items() %}
+ {% if 'osp' in group and ('compute' in group or 'controller' in group) %}
+ {% for node in _vm_groups[group] %}
+ {% set node_nets = cifmw_networking_env_definition.instances[node] %}
+ {{ node }}:
+ ansible_user: tripleo-admin
+ {% if 'ctlplaner0' in node_nets.networks %}
+ ansible_host: {{ node_nets.networks.ctlplaner0[ip_version|default('ip_v4')] }}
+ {% elif 'ctlplaner1' in node_nets.networks %}
+ ansible_host: {{ node_nets.networks.ctlplaner1[ip_version|default('ip_v4')] }}
+ {% else %}
+ ansible_host: {{ node_nets.networks.ctlplaner2[ip_version|default('ip_v4')] }}
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+ {% endfor %}
diff --git a/roles/ci_gen_kustomize_values/templates/bgp-l3-xl-adoption b/roles/ci_gen_kustomize_values/templates/bgp-l3-xl-adoption
new file mode 120000
index 0000000000..43886fd2df
--- /dev/null
+++ b/roles/ci_gen_kustomize_values/templates/bgp-l3-xl-adoption
@@ -0,0 +1 @@
+bgp-l3-xl
\ No newline at end of file
diff --git a/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2 b/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2
index 05d4e436de..e5be4addbd 100644
--- a/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2
+++ b/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2
@@ -2,7 +2,9 @@
{% set instances_names = [] %}
{% set rack = 'r' ~ rack_number %}
{% for _inst in cifmw_networking_env_definition.instances.keys() %}
-{% if _inst.startswith('-'.join([rack, node_type])) %}
+{% if _inst.startswith('-'.join([rack, node_type])) or _inst.startswith('-'.join(['osp', rack, node_type])) %}
+{% set _ = instances_names.append(_inst) %}
+{% elif node_type == 'networker' and _inst.startswith('-'.join(['osp', rack, 'controller'])) %}
{% set _ = instances_names.append(_inst) %}
{% endif %}
{% endfor %}
diff --git a/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/network-values/values.yaml.j2 b/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/network-values/values.yaml.j2
index 1c80b592cf..17d6c95113 100644
--- a/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/network-values/values.yaml.j2
+++ b/roles/ci_gen_kustomize_values/templates/bgp-l3-xl/network-values/values.yaml.j2
@@ -49,117 +49,130 @@ data:
{% endif %}
{% endfor %}
-{% for network in cifmw_networking_env_definition.networks.values() %}
-{% if network.network_name != 'ctlplane_ocp_nad' %}
-{% set ns.lb_tools = {} %}
+{% set filtered_networks = cifmw_networking_env_definition.networks.values() | selectattr('network_name', '!=', 'ctlplane_ocp_nad') | list %}
+{% for network in filtered_networks %}
+{% set ns.lb_tools = {} %}
{{ network.network_name }}:
dnsDomain: {{ network.search_domain }}
-{% if network.tools is defined and network.tools.keys() | length > 0 %}
+{% if network.tools is defined and network.tools.keys() | length > 0 %}
subnets:
-{% for tool in network.tools.keys() %}
-{% if tool is match('.*lb$') %}
-{% set _ = ns.lb_tools.update({tool: []}) %}
-{% endif %}
-{% endfor %}
-{% if network.network_name != 'ctlplane' %}
+{% for tool in network.tools.keys() %}
+{% if tool is match('.*lb$') %}
+{% set _ = ns.lb_tools.update({tool: []}) %}
+{% endif %}
+{% endfor %}
+{% if network.network_name != 'ctlplane' %}
- allocationRanges:
-{% for range in network.tools.netconfig.ipv4_ranges %}
+{% for range in network.tools.netconfig.ipv4_ranges %}
- end: {{ range.end }}
start: {{ range.start }}
-{% endfor %}
+{% endfor %}
cidr: {{ network.network_v4 }}
-{% if network.gw_v4 is defined %}
+{% if network.gw_v4 is defined %}
gateway: {{ network.gw_v4 }}
-{% endif %}
+{% endif %}
name: subnet1
-{% if network.vlan_id is defined %}
+{% if network.vlan_id is defined %}
vlan: {{ network.vlan_id }}
-{% endif %}
-{% else %}
-{% for rack in ['r0', 'r1', 'r2'] %}
-{% set rack_subnet = cifmw_networking_env_definition.networks[network.network_name + rack] %}
+{% endif %}
+{% else %}
+{% for rack in ['r0', 'r1', 'r2'] %}
+{% set rack_subnet = cifmw_networking_env_definition.networks[network.network_name + rack] %}
- allocationRanges:
-{% for range in rack_subnet.tools.netconfig.ipv4_ranges %}
+{% for range in rack_subnet.tools.netconfig.ipv4_ranges %}
- end: {{ range.end }}
start: {{ range.start }}
-{% endfor %}
+{% endfor %}
cidr: {{ rack_subnet.network_v4 }}
-{% if rack_subnet.gw_v4 is defined %}
+{% if rack_subnet.gw_v4 is defined %}
gateway: {{ rack_subnet.gw_v4 }}
-{% endif %}
+{% endif %}
name: {{ 'subnet' ~ loop.index0 }}
-{% if rack_subnet.vlan_id is defined %}
+{% if rack_subnet.vlan_id is defined %}
vlan: {{ rack_subnet.vlan_id }}
-{% endif %}
-{% endfor %}
-{% endif %}
-{% if ns.lb_tools | length > 0 %}
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if ns.lb_tools | length > 0 %}
lb_addresses:
-{% for tool in ns.lb_tools.keys() %}
-{% set lb_range_network = network if network.network_name != "ctlplane" else cifmw_networking_env_definition.networks.ctlplane_ocp_nad %}
-{% for lb_range in lb_range_network.tools[tool].ipv4_ranges %}
+{% for tool in ns.lb_tools.keys() %}
+{% set lb_range_network = network if network.network_name != "ctlplane" else cifmw_networking_env_definition.networks.ctlplane_ocp_nad %}
+{% for lb_range in lb_range_network.tools[tool].ipv4_ranges %}
- {{ lb_range.start }}-{{ lb_range.end }}
-{% set _ = ns.lb_tools[tool].append(lb_range.start) %}
-{% endfor %}
+{% set _ = ns.lb_tools[tool].append(lb_range.start) %}
+{% endfor %}
endpoint_annotations:
{{ tool }}.universe.tf/address-pool: {{ network.network_name }}
{{ tool }}.universe.tf/allow-shared-ip: {{ network.network_name }}
{{ tool }}.universe.tf/loadBalancerIPs: {{ ','.join(ns.lb_tools[tool]) }}
-{% endfor %}
-{% endif %}
-{% endif %}
+{% endfor %}
+{% endif %}
+{% endif %}
prefix-length: {{ network.network_v4 | ansible.utils.ipaddr('prefix') }}
mtu: {{ network.mtu | default(1500) }}
-{% if network.vlan_id is defined %}
+{% if network.vlan_id is defined %}
vlan: {{ network.vlan_id }}
-{% if ns.interfaces[network.network_name] is defined %}
+{% if ns.interfaces[network.network_name] is defined %}
iface: {{ network.network_name }}
base_iface: {{ ns.interfaces[network.network_name] }}
-{% endif %}
-{% elif network.network_name == "ctlplane" %}
+{% endif %}
+{% elif network.network_name == "ctlplane" %}
iface: {{ ns.interfaces[network.network_name] }}
-{% elif ns.interfaces[network.network_name] is defined %}
+{% elif ns.interfaces[network.network_name] is defined %}
iface: {{ network.network_name }}
-{% endif %}
-{% if network.tools.multus is defined %}
+{% endif %}
+{% if network.tools.multus is defined %}
net-attach-def: |
{
"cniVersion": "0.3.1",
"name": "{{ network.network_name }}",
"type": "bridge",
+{% if network.network_name == "storage" %}
+ "isDefaultGateway": false,
+{% else %}
"isDefaultGateway": true,
+{% endif %}
"isGateway": true,
"forceAddress": false,
+{% if network.network_name == "ctlplane" %}
"ipMasq": true,
+{% else %}
+ "ipMasq": false,
+{% endif %}
"hairpinMode": true,
-{% if network.network_name == "octavia" %}
- "bridge": "octbr",
-{% elif network.network_name == "ctlplane" %}
+{% if network.network_name == "ctlplane" %}
"bridge": "ospbr",
-{% else %}
+{% else %}
"bridge": "{{ network.network_name }}",
-{% endif %}
+{% endif %}
"ipam": {
"type": "whereabouts",
-{% if network.network_name == "octavia" and network.tools.multus.ipv4_routes | default([]) | length > 0 %}
+{% if network.network_name == "octavia" and network.tools.multus.ipv4_routes | default([]) | length > 0 %}
"routes": [
-{% for route in network.tools.multus.ipv4_routes %}
+{% for route in network.tools.multus.ipv4_routes %}
{
"dst": "{{ route.destination }}",
"gw": "{{ route.gateway }}"
}{% if not loop.last %},{% endif %}
-{% endfor %}
+{% endfor %}
+ ],
+{% elif network.network_name == "storage" %}
+ "routes": [
+ {"dst": "172.31.0.0/24", "gw": "{{ network.network_v4 |ansible.utils.nthhost(1) }}"},
+ {"dst": "192.168.188.0/24", "gw": "{{ network.network_v4 |ansible.utils.nthhost(1) }}"},
+ {"dst": "99.99.0.0/16", "gw": "{{ network.network_v4 |ansible.utils.nthhost(1) }}"}
],
-{% endif %}
-{% set range_network = network if network.network_name != "ctlplane" else cifmw_networking_env_definition.networks.ctlplane_ocp_nad %}
+{% endif %}
+{% set range_network = network if network.network_name != "ctlplane" else cifmw_networking_env_definition.networks.ctlplane_ocp_nad %}
+{% if network.network_name != "storage" %}
+ "gateway": "{{ range_network.network_v4 |ansible.utils.nthhost(1) }}",
+{% endif %}
"range": "{{ range_network.network_v4 }}",
"range_start": "{{ range_network.tools.multus.ipv4_ranges.0.start }}",
- "range_end": "{{ range_network.tools.multus.ipv4_ranges.0.end }}",
- "gateway": "{{ range_network.network_v4 |ansible.utils.nthhost(1) }}"
+ "range_end": "{{ range_network.tools.multus.ipv4_ranges.0.end }}"
}
}
-{% endif %}
-{% endif %}
+{% endif %}
{% endfor %}
dns-resolver:
diff --git a/scenarios/adoption/bgp-l3-xl.yml b/scenarios/adoption/bgp-l3-xl.yml
new file mode 100644
index 0000000000..dde8673f5a
--- /dev/null
+++ b/scenarios/adoption/bgp-l3-xl.yml
@@ -0,0 +1,489 @@
+---
+# By default, the OSP VMs will run using a default image.
+# In upstream, it's usually latest centos-stream-9
+# For downstream, it's usually rhel-9.4 image, depending on
+# the job configuration.
+#
+# Since OSP infra must use an older RHEL image, you can override it
+# by setting "osp_base_img_url" to point to the downstream QCOW2 image,
+# and "osp_base_img_sha256" holding the SHA256SUM of the image.
+#
+# We can't automatically discover the image, the role/module sets the
+# value globally, and it would clash with the needs for RHOSO images.
+
+# Use anchor to avoid repetitions. This block is common to all of OSP nodes.
+_osp_img_data: &osp_base_conf
+ image_local_dir: "{{ cifmw_basedir }}/images/"
+ disk_file_name: osp-base.qcow2
+ image_url: "{{ osp_base_img_url | default(cifmw_discovered_image_url) }}"
+ sha256_image_name: >-
+ {{ osp_base_img_sha256 | default(cifmw_discovered_hash) }}
+
+cifmw_architecture_scenario: bgp-l3-xl-adoption
+cifmw_arch_automation_file: "bgp-l3-xl-adoption.yaml"
+
+libvirt_manager_patch_layout:
+ vms:
+ # Let's remove the default computes, since we want to adopt the
+ # OSP ones
+ compute:
+ <<: *osp_base_conf
+ amount: 0
+ osp-undercloud:
+ <<: *osp_base_conf
+ amount: 1
+ memory: 16
+ cpus: 8
+ disksize: 80
+ nets:
+ - ocpbm
+ - r0_tr
+ spineleafnets:
+ - # rack0 - undercloud
+ - "l00-node4"
+ - "l01-node4"
+ osp-r0-controller:
+ <<: *osp_base_conf
+ amount: 1
+ memory: 16
+ cpus: 8
+ disksize: 80
+ nets:
+ - ocpbm
+ - r0_tr
+ spineleafnets:
+ - # rack0 - controller0
+ - "l00-node3"
+ - "l01-node3"
+ osp-r1-controller:
+ <<: *osp_base_conf
+ amount: 1
+ memory: 16
+ cpus: 8
+ disksize: 80
+ nets:
+ - ocpbm
+ - r1_tr
+ spineleafnets:
+ - # rack1 - controller1
+ - "l10-node3"
+ - "l11-node3"
+ osp-r2-controller:
+ <<: *osp_base_conf
+ amount: 1
+ memory: 16
+ cpus: 8
+ disksize: 80
+ nets:
+ - ocpbm
+ - r2_tr
+ spineleafnets:
+ - # rack2 - controller2
+ - "l20-node3"
+ - "l21-node3"
+ osp-r0-compute:
+ <<: *osp_base_conf
+ amount: 2
+ memory: 4
+ cpus: 4
+ disksize: 20
+ nets:
+ - ocpbm
+ - r0_tr
+ spineleafnets:
+ - # rack0 - compute0
+ - "l00-node0"
+ - "l01-node0"
+ - # rack0 - compute0
+ - "l00-node1"
+ - "l01-node1"
+ osp-r1-compute:
+ <<: *osp_base_conf
+ amount: 2
+ memory: 4
+ cpus: 4
+ disksize: 20
+ nets:
+ - ocpbm
+ - r1_tr
+ spineleafnets:
+ - # rack1 - compute0
+ - "l10-node0"
+ - "l11-node0"
+ - # rack1 - compute1
+ - "l10-node1"
+ - "l11-node1"
+ osp-r2-compute:
+ <<: *osp_base_conf
+ amount: 2
+ memory: 4
+ cpus: 4
+ disksize: 20
+ nets:
+ - ocpbm
+ - r2_tr
+ spineleafnets:
+ - # rack2 - compute0
+ - "l20-node0"
+ - "l21-node0"
+ - # rack2 - compute1
+ - "l20-node1"
+ - "l21-node1"
+
+ router:
+ root_part_id: >-
+ {{
+ (cifmw_repo_setup_os_release is defined and cifmw_repo_setup_os_release == 'rhel') |
+ ternary(4, 1)
+ }}
+ image_url: "{{ cifmw_discovered_image_url }}"
+ sha256_image_name: "{{ cifmw_discovered_hash }}"
+ image_local_dir: "{{ cifmw_basedir }}/images/"
+ disk_file_name: "base-os.qcow2"
+ amount: 1
+ disksize: 25
+ memory: 4
+ cpus: 2
+ nets: # nets common to all the router nodes
+ - "ocpbm"
+ spineleafnets:
+ - # router - ocp_tester
+ - "s0-rtr"
+ - "s1-rtr"
+ - "rtr-ocp"
+ spine:
+ root_part_id: >-
+ {{
+ (cifmw_repo_setup_os_release is defined and cifmw_repo_setup_os_release == 'rhel') |
+ ternary(4, 1)
+ }}
+ image_url: "{{ cifmw_discovered_image_url }}"
+ sha256_image_name: "{{ cifmw_discovered_hash }}"
+ image_local_dir: "{{ cifmw_basedir }}/images/"
+ disk_file_name: "base-os.qcow2"
+ amount: 2
+ disksize: 25
+ memory: 4
+ cpus: 2
+ nets: # nets common to all the spine nodes
+ - "ocpbm"
+ spineleafnets:
+ - # spine0
+ - "l00-s0"
+ - "l01-s0"
+ - "l10-s0"
+ - "l11-s0"
+ - "l20-s0"
+ - "l21-s0"
+ - "s0-rtr"
+ - # spine1
+ - "l00-s1"
+ - "l01-s1"
+ - "l10-s1"
+ - "l11-s1"
+ - "l20-s1"
+ - "l21-s1"
+ - "s1-rtr"
+ leaf:
+ root_part_id: >-
+ {{
+ (cifmw_repo_setup_os_release is defined and cifmw_repo_setup_os_release == 'rhel') |
+ ternary(4, 1)
+ }}
+ image_url: "{{ cifmw_discovered_image_url }}"
+ sha256_image_name: "{{ cifmw_discovered_hash }}"
+ image_local_dir: "{{ cifmw_basedir }}/images/"
+ disk_file_name: "base-os.qcow2"
+ amount: 6
+ disksize: 25
+ memory: 4
+ cpus: 2
+ nets: # nets common to all the leaf nodes
+ - "ocpbm"
+ spineleafnets:
+ - # rack0 - leaf00
+ - "l00-s0"
+ - "l00-s1"
+ - "l00-node0"
+ - "l00-node1"
+ - "l00-node2"
+ - "l00-ocp0"
+ - "l00-ocp1"
+ - "l00-ocp2"
+ - "l00-node3"
+ - "l00-node4"
+ - # rack0 - leaf01
+ - "l01-s0"
+ - "l01-s1"
+ - "l01-node0"
+ - "l01-node1"
+ - "l01-node2"
+ - "l01-ocp0"
+ - "l01-ocp1"
+ - "l01-ocp2"
+ - "l01-node3"
+ - "l01-node4"
+ - # rack1 - leaf10
+ - "l10-s0"
+ - "l10-s1"
+ - "l10-node0"
+ - "l10-node1"
+ - "l10-node2"
+ - "l10-ocp0"
+ - "l10-ocp1"
+ - "l10-ocp2"
+ - "l10-node3"
+ - "l10-node4"
+ - # rack1 - leaf11
+ - "l11-s0"
+ - "l11-s1"
+ - "l11-node0"
+ - "l11-node1"
+ - "l11-node2"
+ - "l11-ocp0"
+ - "l11-ocp1"
+ - "l11-ocp2"
+ - "l11-node3"
+ - "l11-node4"
+ - # rack2 - leaf20
+ - "l20-s0"
+ - "l20-s1"
+ - "l20-node0"
+ - "l20-node1"
+ - "l20-node2"
+ - "l20-ocp0"
+ - "l20-ocp1"
+ - "l20-ocp2"
+ - "l20-node3"
+ - "l20-node4"
+ - # rack2 - leaf21
+ - "l21-s0"
+ - "l21-s1"
+ - "l21-node0"
+ - "l21-node1"
+ - "l21-node2"
+ - "l21-ocp0"
+ - "l21-ocp1"
+ - "l21-ocp2"
+ - "l21-node3"
+ - "l21-node4"
+
+
+ # set to zero
+ r0-compute:
+ amount: 0
+ <<: *osp_base_conf
+ r1-compute:
+ amount: 0
+ <<: *osp_base_conf
+ r2-compute:
+ amount: 0
+ <<: *osp_base_conf
+ r0-networker:
+ amount: 0
+ <<: *osp_base_conf
+ r1-networker:
+ amount: 0
+ <<: *osp_base_conf
+ r2-networker:
+ amount: 0
+ <<: *osp_base_conf
+
+
+cifmw_libvirt_manager_default_gw_nets:
+ - ocpbm
+ - r0_tr
+ - r1_tr
+ - r2_tr
+cifmw_networking_mapper_interfaces_info_translations:
+ osp_trunk:
+ - controlplane
+ - ctlplane
+ r0_tr:
+ - ctlplaner0
+ r1_tr:
+ - ctlplaner1
+ r2_tr:
+ - ctlplaner2
+
+networking_mapper_definition_patch:
+ networks:
+ ctlplane:
+ network: "192.168.125.0/24"
+ gateway: "192.168.125.1"
+ dns:
+ - "192.168.122.1"
+ mtu: 1500
+
+ ctlplaner0:
+ network: "192.168.122.0/24"
+ gateway: "192.168.122.1"
+ dns:
+ - "192.168.122.1"
+ mtu: 1500
+
+ ctlplaner1:
+ network: "192.168.123.0/24"
+ gateway: "192.168.123.1"
+ dns:
+ - "192.168.123.1"
+ mtu: 1500
+
+ ctlplaner2:
+ network: "192.168.124.0/24"
+ gateway: "192.168.124.1"
+ dns:
+ - "192.168.124.1"
+ mtu: 1500
+
+ internalapi:
+ network: "172.17.0.0/24"
+ vlan: 20
+ mtu: 1500
+
+ storage:
+ network: "172.18.0.0/24"
+ vlan: 21
+ mtu: 1500
+
+ tenant:
+ network: "172.19.0.0/24"
+ vlan: 22
+ mtu: 1500
+
+ octavia:
+ vlan: 23
+ mtu: 1500
+ network: "172.23.0.0/24"
+
+ # Not really used, but required by architecture
+ # https://github.com/openstack-k8s-operators/architecture/blob/main/lib/networking/netconfig/kustomization.yaml#L28-L36
+ external:
+ network: "192.168.32.0/20"
+ vlan: 99
+ mtu: 1500
+
+ # ensure ranges do not collide even if we don't create these vms
+ group-templates:
+ r0-computes:
+ network-template:
+ range:
+ start: 200
+ length: 5
+ r1-computes:
+ network-template:
+ range:
+ start: 205
+ length: 5
+ r2-computes:
+ network-template:
+ range:
+ start: 210
+ length: 5
+ r0-networkers:
+ network-template:
+ range:
+ start: 215
+ length: 5
+ r1-networkers:
+ network-template:
+ range:
+ start: 220
+ length: 5
+ r2-networkers:
+ network-template:
+ range:
+ start: 225
+ length: 5
+
+ osp-r0-controllers:
+ network-template:
+ range:
+ start: 140
+ length: 2
+ networks:
+ ctlplaner0: {}
+ external:
+ trunk-parent: ctlplaner0
+ internalapi:
+ trunk-parent: ctlplaner0
+ tenant:
+ trunk-parent: ctlplaner0
+ storage:
+ trunk-parent: ctlplaner0
+ osp-r1-controllers:
+ network-template:
+ range:
+ start: 142
+ length: 2
+ networks:
+ ctlplaner1: {}
+ external:
+ trunk-parent: ctlplaner1
+ internalapi:
+ trunk-parent: ctlplaner1
+ tenant:
+ trunk-parent: ctlplaner1
+ storage:
+ trunk-parent: ctlplaner1
+ osp-r2-controllers:
+ network-template:
+ range:
+ start: 144
+ length: 2
+ networks:
+ ctlplaner2: {}
+ external:
+ trunk-parent: ctlplaner2
+ internalapi:
+ trunk-parent: ctlplaner2
+ tenant:
+ trunk-parent: ctlplaner2
+ storage:
+ trunk-parent: ctlplaner2
+ osp-r0-computes:
+ network-template:
+ range:
+ start: 100
+ length: 5
+ networks:
+ ctlplaner0: {}
+ internalapi:
+ trunk-parent: ctlplaner0
+ tenant:
+ trunk-parent: ctlplaner0
+ storage:
+ trunk-parent: ctlplaner0
+ osp-r1-computes:
+ network-template:
+ range:
+ start: 105
+ length: 5
+ networks:
+ ctlplaner1: {}
+ internalapi:
+ trunk-parent: ctlplaner1
+ tenant:
+ trunk-parent: ctlplaner1
+ storage:
+ trunk-parent: ctlplaner1
+ osp-r2-computes:
+ network-template:
+ range:
+ start: 110
+ length: 5
+ networks:
+ ctlplaner2: {}
+ internalapi:
+ trunk-parent: ctlplaner2
+ tenant:
+ trunk-parent: ctlplaner2
+ storage:
+ trunk-parent: ctlplaner2
+ osp-underclouds:
+ network-template:
+ range:
+ start: 95
+ length: 1
+ networks:
+ ctlplaner0: {}
diff --git a/scenarios/reproducers/bgp-l3-xl.yml b/scenarios/reproducers/bgp-l3-xl.yml
index 1bd1c30b07..23358f6c73 100644
--- a/scenarios/reproducers/bgp-l3-xl.yml
+++ b/scenarios/reproducers/bgp-l3-xl.yml
@@ -47,36 +47,48 @@ cifmw_libvirt_manager_network_interface_types:
l00-node0: network
l00-node1: network
l00-node2: network
+ l00-node3: network
+ l00-node4: network
l00-ocp0: network
l00-ocp1: network
l00-ocp2: network
l01-node0: network
l01-node1: network
l01-node2: network
+ l01-node3: network
+ l01-node4: network
l01-ocp0: network
l01-ocp1: network
l01-ocp2: network
l10-node0: network
l10-node1: network
l10-node2: network
+ l10-node3: network
+ l10-node4: network
l10-ocp0: network
l10-ocp1: network
l10-ocp2: network
l11-node0: network
l11-node1: network
l11-node2: network
+ l11-node3: network
+ l11-node4: network
l11-ocp0: network
l11-ocp1: network
l11-ocp2: network
l20-node0: network
l20-node1: network
l20-node2: network
+ l20-node3: network
+ l20-node4: network
l20-ocp0: network
l20-ocp1: network
l20-ocp2: network
l21-node0: network
l21-node1: network
l21-node2: network
+ l21-node3: network
+ l21-node4: network
l21-ocp0: network
l21-ocp1: network
l21-ocp2: network
@@ -193,6 +205,16 @@ cifmw_libvirt_manager_configuration:
l00-node2
+ l00-node3: |
+
+ l00-node3
+
+
+ l00-node4: |
+
+ l00-node4
+
+
l00-ocp0: |
l00-ocp0
@@ -223,6 +245,16 @@ cifmw_libvirt_manager_configuration:
l01-node2
+ l01-node3: |
+
+ l01-node3
+
+
+ l01-node4: |
+
+ l01-node4
+
+
l01-ocp0: |
l01-ocp0
@@ -254,6 +286,16 @@ cifmw_libvirt_manager_configuration:
l10-node2
+ l10-node3: |
+
+ l10-node3
+
+
+ l10-node4: |
+
+ l10-node4
+
+
l10-ocp0: |
l10-ocp0
@@ -284,6 +326,16 @@ cifmw_libvirt_manager_configuration:
l11-node2
+ l11-node3: |
+
+ l11-node3
+
+
+ l11-node4: |
+
+ l11-node4
+
+
l11-ocp0: |
l11-ocp0
@@ -315,6 +367,16 @@ cifmw_libvirt_manager_configuration:
l20-node2
+ l20-node3: |
+
+ l20-node3
+
+
+ l20-node4: |
+
+ l20-node4
+
+
l20-ocp0: |
l20-ocp0
@@ -345,6 +407,16 @@ cifmw_libvirt_manager_configuration:
l21-node2
+ l21-node3: |
+
+ l21-node3
+
+
+ l21-node4: |
+
+ l21-node4
+
+
l21-ocp0: |
l21-ocp0
@@ -430,7 +502,7 @@ cifmw_libvirt_manager_configuration:
- ocpbm
- osp_trunk
r0-compute: &r0_compute_def
- amount: 2
+ amount: 0
root_part_id: >-
{{
(cifmw_repo_setup_os_release is defined and cifmw_repo_setup_os_release == 'rhel') |
@@ -454,8 +526,12 @@ cifmw_libvirt_manager_configuration:
- "l00-node1"
- "l01-node1"
r1-compute:
- amount: 2
- root_part_id: "{{ cifmw_root_partition_id }}"
+ amount: 0
+ root_part_id: >-
+ {{
+ (cifmw_repo_setup_os_release is defined and cifmw_repo_setup_os_release == 'rhel') |
+ ternary(4, 1)
+ }}
uefi: "{{ cifmw_use_uefi }}"
image_url: "{{ cifmw_discovered_image_url }}"
sha256_image_name: "{{ cifmw_discovered_hash }}"
@@ -475,8 +551,12 @@ cifmw_libvirt_manager_configuration:
- "l10-node1"
- "l11-node1"
r2-compute:
- amount: 2
- root_part_id: "{{ cifmw_root_partition_id }}"
+ amount: 0
+ root_part_id: >-
+ {{
+ (cifmw_repo_setup_os_release is defined and cifmw_repo_setup_os_release == 'rhel') |
+ ternary(4, 1)
+ }}
uefi: "{{ cifmw_use_uefi }}"
image_url: "{{ cifmw_discovered_image_url }}"
sha256_image_name: "{{ cifmw_discovered_hash }}"
@@ -636,8 +716,8 @@ cifmw_libvirt_manager_configuration:
image_local_dir: "{{ cifmw_basedir }}/images/"
disk_file_name: "base-os.qcow2"
disksize: 25
- memory: 4
- cpus: 2
+ memory: 2
+ cpus: 1
nets: # nets common to all the router nodes
- "ocpbm"
spineleafnets:
@@ -657,8 +737,8 @@ cifmw_libvirt_manager_configuration:
image_local_dir: "{{ cifmw_basedir }}/images/"
disk_file_name: "base-os.qcow2"
disksize: 25
- memory: 4
- cpus: 2
+ memory: 2
+ cpus: 1
nets: # nets common to all the spine nodes
- "ocpbm"
spineleafnets:
@@ -690,8 +770,8 @@ cifmw_libvirt_manager_configuration:
image_local_dir: "{{ cifmw_basedir }}/images/"
disk_file_name: "base-os.qcow2"
disksize: 25
- memory: 4
- cpus: 2
+ memory: 2
+ cpus: 1
nets: # nets common to all the leaf nodes
- "ocpbm"
spineleafnets:
@@ -704,6 +784,8 @@ cifmw_libvirt_manager_configuration:
- "l00-ocp0"
- "l00-ocp1"
- "l00-ocp2"
+ - "l00-node3"
+ - "l00-node4"
- # rack0 - leaf01
- "l01-s0"
- "l01-s1"
@@ -713,6 +795,8 @@ cifmw_libvirt_manager_configuration:
- "l01-ocp0"
- "l01-ocp1"
- "l01-ocp2"
+ - "l01-node3"
+ - "l01-node4"
- # rack1 - leaf10
- "l10-s0"
- "l10-s1"
@@ -722,6 +806,7 @@ cifmw_libvirt_manager_configuration:
- "l10-ocp0"
- "l10-ocp1"
- "l10-ocp2"
+ - "l10-node3"
- # rack1 - leaf11
- "l11-s0"
- "l11-s1"
@@ -731,6 +816,7 @@ cifmw_libvirt_manager_configuration:
- "l11-ocp0"
- "l11-ocp1"
- "l11-ocp2"
+ - "l11-node3"
- # rack2 - leaf20
- "l20-s0"
- "l20-s1"
@@ -740,6 +826,7 @@ cifmw_libvirt_manager_configuration:
- "l20-ocp0"
- "l20-ocp1"
- "l20-ocp2"
+ - "l20-node3"
- # rack2 - leaf21
- "l21-s0"
- "l21-s1"
@@ -749,6 +836,7 @@ cifmw_libvirt_manager_configuration:
- "l21-ocp0"
- "l21-ocp1"
- "l21-ocp2"
+ - "l21-node3"
## devscript support for OCP deploy
cifmw_devscripts_config_overrides:
@@ -763,13 +851,12 @@ cifmw_devscripts_enable_ocp_nodes_host_routing: true
# controller-0 as-is and be consumed by the `deploy-va.sh` script.
# Please note, all paths are on the controller-0, meaning managed by the
# Framework. Please do not edit them!
-_arch_repo: "{{ cifmw_architecture_repo }}"
cifmw_architecture_scenario: bgp-l3-xl
cifmw_kustomize_deploy_architecture_examples_path: "examples/dt/"
cifmw_arch_automation_file: "bgp-l3-xl.yaml"
cifmw_architecture_automation_file: >-
{{
- (_arch_repo,
+ (cifmw_architecture_repo,
'automation/vars',
cifmw_arch_automation_file) |
path_join
@@ -777,7 +864,7 @@ cifmw_architecture_automation_file: >-
cifmw_kustomize_deploy_metallb_source_files: >-
{{
- (_arch_repo,
+ (cifmw_architecture_repo,
'examples/dt/bgp-l3-xl/metallb') |
path_join
}}
@@ -795,9 +882,10 @@ pre_deploy:
extra_vars:
num_racks: "{{ num_racks }}"
router_bool: true
- edpm_nodes_per_rack: 3
+ edpm_nodes_per_rack: 5
ocp_nodes_per_rack: 3
router_uplink_ip: 100.64.10.1
+ cifmw_repo_setup_rhos_release_rpm: "{{ cifmw_repo_setup_rhos_release_rpm }}"
# post_deploy:
# - name: BGP computes configuration
@@ -822,289 +910,3 @@ cifmw_networking_mapper_interfaces_info_translations:
- ctlplaner1
r2_tr:
- ctlplaner2
-
-
-cifmw_networking_definition:
- networks:
- ctlplane:
- network: "192.168.125.0/24"
- gateway: "192.168.125.1"
- dns:
- - "192.168.125.1"
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- metallb:
- ranges:
- - start: 80
- end: 90
- netconfig:
- ranges:
- - start: 100
- end: 120
- - start: 150
- end: 200
-
- ctlplane_ocp_nad:
- network: "192.168.126.0/24"
- gateway: "192.168.126.1"
- dns:
- - "192.168.126.1"
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- metallb:
- ranges:
- - start: 80
- end: 90
-
- ctlplaner0:
- network: "192.168.122.0/24"
- gateway: "192.168.122.1"
- dns:
- - "192.168.122.1"
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- metallb:
- ranges:
- - start: 80
- end: 90
- netconfig:
- ranges:
- - start: 100
- end: 130
- - start: 150
- end: 200
-
- ctlplaner1:
- network: "192.168.123.0/24"
- gateway: "192.168.123.1"
- dns:
- - "192.168.123.1"
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- netconfig:
- ranges:
- - start: 100
- end: 130
- - start: 150
- end: 170
- metallb:
- ranges:
- - start: 80
- end: 90
- ctlplaner2:
- network: "192.168.124.0/24"
- gateway: "192.168.124.1"
- dns:
- - "192.168.124.1"
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- netconfig:
- ranges:
- - start: 100
- end: 130
- - start: 150
- end: 170
- metallb:
- ranges:
- - start: 80
- end: 90
-
- internalapi:
- network: "172.17.0.0/24"
- vlan: 20
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- metallb:
- ranges:
- - start: 80
- end: 90
- netconfig:
- ranges:
- - start: 100
- end: 250
-
- storage:
- network: "172.18.0.0/24"
- vlan: 21
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- metallb:
- ranges:
- - start: 80
- end: 90
- netconfig:
- ranges:
- - start: 100
- end: 250
-
- tenant:
- network: "172.19.0.0/24"
- vlan: 22
- mtu: 1500
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- metallb:
- ranges:
- - start: 80
- end: 90
- netconfig:
- ranges:
- - start: 100
- end: 250
-
- octavia:
- vlan: 23
- mtu: 1500
- network: "172.23.0.0/24"
- tools:
- multus:
- ranges:
- - start: 30
- end: 70
- netconfig:
- ranges:
- - start: 100
- end: 250
-
- # Not really used, but required by architecture
- # https://github.com/openstack-k8s-operators/architecture/blob/main/lib/networking/netconfig/kustomization.yaml#L28-L36
- external:
- network: "192.168.32.0/20"
- vlan: 99
- mtu: 1500
- tools:
- netconfig:
- ranges:
- - start: 130
- end: 250
-
- group-templates:
- r0-computes:
- network-template:
- range:
- start: 100
- length: 5
- networks:
- ctlplaner0: {}
- internalapi:
- trunk-parent: ctlplaner0
- tenant:
- trunk-parent: ctlplaner0
- storage:
- trunk-parent: ctlplaner0
- r1-computes:
- network-template:
- range:
- start: 110
- length: 5
- networks:
- ctlplaner1: {}
- internalapi:
- trunk-parent: ctlplaner1
- tenant:
- trunk-parent: ctlplaner1
- storage:
- trunk-parent: ctlplaner1
- r2-computes:
- network-template:
- range:
- start: 120
- length: 5
- networks:
- ctlplaner2: {}
- internalapi:
- trunk-parent: ctlplaner2
- tenant:
- trunk-parent: ctlplaner2
- storage:
- trunk-parent: ctlplaner2
- r0-networkers:
- network-template:
- range:
- start: 200
- length: 5
- networks:
- ctlplaner0: {}
- internalapi:
- trunk-parent: ctlplaner0
- tenant:
- trunk-parent: ctlplaner0
- storage:
- trunk-parent: ctlplaner0
- r1-networkers:
- network-template:
- range:
- start: 210
- length: 5
- networks:
- ctlplaner1: {}
- internalapi:
- trunk-parent: ctlplaner1
- tenant:
- trunk-parent: ctlplaner1
- storage:
- trunk-parent: ctlplaner1
- r2-networkers:
- network-template:
- range:
- start: 220
- length: 5
- networks:
- ctlplaner2: {}
- internalapi:
- trunk-parent: ctlplaner2
- tenant:
- trunk-parent: ctlplaner2
- storage:
- trunk-parent: ctlplaner2
- ocps:
- network-template:
- range:
- start: 10
- length: 10
- networks:
- ctlplane: {}
- ocp_workers:
- network-template:
- range:
- start: 20
- length: 10
- networks:
- ctlplane: {}
-
- instances:
- controller-0:
- networks:
- ctlplane:
- ip: "192.168.125.9"
diff --git a/scenarios/reproducers/networking-definition-bgp.yml b/scenarios/reproducers/networking-definition-bgp.yml
new file mode 100644
index 0000000000..27500524b1
--- /dev/null
+++ b/scenarios/reproducers/networking-definition-bgp.yml
@@ -0,0 +1,298 @@
+cifmw_networking_definition:
+ networks:
+ ctlplane:
+ network: "192.168.125.0/24"
+ gateway: "192.168.125.1"
+ dns:
+ - "192.168.125.1"
+ mtu: 1500
+ tools:
+ multus:
+ ranges:
+ - start: 30
+ end: 70
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+ netconfig:
+ ranges:
+ - start: 100
+ end: 120
+ - start: 150
+ end: 200
+
+ ctlplane_ocp_nad:
+ network: "192.168.126.0/24"
+ gateway: "192.168.126.1"
+ dns:
+ - "192.168.126.1"
+ mtu: 1500
+ tools:
+ multus:
+ ranges:
+ - start: 30
+ end: 70
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+
+ ctlplaner0:
+ network: "192.168.122.0/24"
+ gateway: "192.168.122.1"
+ dns:
+ - "192.168.122.1"
+ mtu: 1500
+ tools:
+ multus:
+ ranges:
+ - start: 30
+ end: 70
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+ netconfig:
+ ranges:
+ - start: 100
+ end: 130
+ - start: 150
+ end: 200
+
+ ctlplaner1:
+ network: "192.168.123.0/24"
+ gateway: "192.168.123.1"
+ dns:
+ - "192.168.123.1"
+ mtu: 1500
+ tools:
+ multus:
+ ranges:
+ - start: 30
+ end: 70
+ netconfig:
+ ranges:
+ - start: 100
+ end: 130
+ - start: 150
+ end: 170
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+ ctlplaner2:
+ network: "192.168.124.0/24"
+ gateway: "192.168.124.1"
+ dns:
+ - "192.168.124.1"
+ mtu: 1500
+ tools:
+ multus:
+ ranges:
+ - start: 30
+ end: 70
+ netconfig:
+ ranges:
+ - start: 100
+ end: 130
+ - start: 150
+ end: 170
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+
+ internalapi:
+ network: "172.17.0.0/24"
+ vlan: 20
+ mtu: 1500
+ tools:
+ multus:
+ ipv4_routes:
+ - destination: "172.31.0.0/24"
+ gateway: "172.17.0.1"
+ - destination: "192.168.188.0/24"
+ gateway: "172.17.0.1"
+ - destination: "99.99.0.0/16"
+ gateway: "172.17.0.1"
+ ranges:
+ - start: 30
+ end: 70
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+ netconfig:
+ ranges:
+ - start: 100
+ end: 250
+
+ storage:
+ network: "172.18.0.0/24"
+ vlan: 21
+ mtu: 1500
+ tools:
+ multus:
+ ipv4_routes:
+ - destination: "172.31.0.0/24"
+ gateway: "172.18.0.1"
+ - destination: "192.168.188.0/24"
+ gateway: "172.18.0.1"
+ - destination: "99.99.0.0/16"
+ gateway: "172.18.0.1"
+ ranges:
+ - start: 30
+ end: 70
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+ netconfig:
+ ranges:
+ - start: 100
+ end: 250
+
+ tenant:
+ network: "172.19.0.0/24"
+ vlan: 22
+ mtu: 1500
+ tools:
+ multus:
+ ranges:
+ - start: 30
+ end: 70
+ metallb:
+ ranges:
+ - start: 80
+ end: 90
+ netconfig:
+ ranges:
+ - start: 100
+ end: 250
+
+ octavia:
+ vlan: 23
+ mtu: 1500
+ network: "172.23.0.0/24"
+ tools:
+ multus:
+ ranges:
+ - start: 30
+ end: 70
+ netconfig:
+ ranges:
+ - start: 100
+ end: 250
+
+ # Not really used, but required by architecture
+ # https://github.com/openstack-k8s-operators/architecture/blob/main/lib/networking/netconfig/kustomization.yaml#L28-L36
+ external:
+ network: "192.168.32.0/20"
+ vlan: 99
+ mtu: 1500
+ tools:
+ netconfig:
+ ranges:
+ - start: 130
+ end: 250
+
+ group-templates:
+ r0-computes:
+ network-template:
+ range:
+ start: 100
+ length: 5
+ networks:
+ ctlplaner0: {}
+ internalapi:
+ trunk-parent: ctlplaner0
+ tenant:
+ trunk-parent: ctlplaner0
+ storage:
+ trunk-parent: ctlplaner0
+ r1-computes:
+ network-template:
+ range:
+ start: 110
+ length: 5
+ networks:
+ ctlplaner1: {}
+ internalapi:
+ trunk-parent: ctlplaner1
+ tenant:
+ trunk-parent: ctlplaner1
+ storage:
+ trunk-parent: ctlplaner1
+ r2-computes:
+ network-template:
+ range:
+ start: 120
+ length: 5
+ networks:
+ ctlplaner2: {}
+ internalapi:
+ trunk-parent: ctlplaner2
+ tenant:
+ trunk-parent: ctlplaner2
+ storage:
+ trunk-parent: ctlplaner2
+ r0-networkers:
+ network-template:
+ range:
+ start: 200
+ length: 5
+ networks:
+ ctlplaner0: {}
+ internalapi:
+ trunk-parent: ctlplaner0
+ tenant:
+ trunk-parent: ctlplaner0
+ storage:
+ trunk-parent: ctlplaner0
+ r1-networkers:
+ network-template:
+ range:
+ start: 210
+ length: 5
+ networks:
+ ctlplaner1: {}
+ internalapi:
+ trunk-parent: ctlplaner1
+ tenant:
+ trunk-parent: ctlplaner1
+ storage:
+ trunk-parent: ctlplaner1
+ r2-networkers:
+ network-template:
+ range:
+ start: 220
+ length: 5
+ networks:
+ ctlplaner2: {}
+ internalapi:
+ trunk-parent: ctlplaner2
+ tenant:
+ trunk-parent: ctlplaner2
+ storage:
+ trunk-parent: ctlplaner2
+ ocps:
+ network-template:
+ range:
+ start: 10
+ length: 10
+ networks:
+ ctlplane: {}
+ ocp_workers:
+ network-template:
+ range:
+ start: 20
+ length: 10
+ networks:
+ ctlplane: {}
+
+ instances:
+ controller-0:
+ networks:
+ ctlplane:
+ ip: "192.168.125.9"