From 82a78e60ad74be96019fcf5b9d0c29060cfe1252 Mon Sep 17 00:00:00 2001 From: Eduardo Olivares Date: Mon, 15 Dec 2025 16:57:17 +0100 Subject: [PATCH 1/4] [ci_gen_kustomize_values] Add BGP L3 XL kustomize values templates This commit adds Jinja2 templates for generating kustomize values for the BGP L3 XL adoption scenario, including network values and EDPM common nodeset configurations. Co-authored-by: Luca Miccini Signed-off-by: Eduardo Olivares --- .../templates/bgp-l3-xl-adoption | 1 + .../common-bgp-edpm-values.yaml.j2 | 4 +- .../bgp-l3-xl/network-values/values.yaml.j2 | 127 ++++++++++-------- 3 files changed, 74 insertions(+), 58 deletions(-) create mode 120000 roles/ci_gen_kustomize_values/templates/bgp-l3-xl-adoption 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: From b4696e14df820110a49180f8d8b36f2219e20a2d Mon Sep 17 00:00:00 2001 From: Eduardo Olivares Date: Mon, 15 Dec 2025 16:58:06 +0100 Subject: [PATCH 2/4] [adoption_osp_deploy] Add BGP support to adoption OSP deployment This commit adds BGP networking support to the adoption OSP deployment role, including BGP-specific templates, patches, and configuration files for undercloud and overcloud deployments. Co-authored-by: Luca Miccini Signed-off-by: Eduardo Olivares --- .../adoption_bgp_post_undercloud.yaml | 32 +++ .../adoption_bgp_pre_undercloud.yaml | 61 +++++ roles/adoption_osp_deploy/README.md | 3 + roles/adoption_osp_deploy/defaults/main.yml | 2 + .../files/bgp-tht-cinder-patch | 10 + .../files/bgp-tht-frr-patch | 14 ++ .../tasks/config_files.yml | 9 + .../tasks/generate_adoption_vars.yml | 20 ++ .../tasks/prepare_overcloud.yml | 102 +++++++++ .../tasks/prepare_undercloud.yml | 50 +++++ .../templates/adoption_vars_bgp.yaml.j2 | 209 ++++++++++++++++++ .../os_net_config_overcloud_bgp.yml.j2 | 64 ++++++ .../os_net_config_undercloud_bgp.yml.j2 | 63 ++++++ .../tripleo-ansible-inventory_bgp.yaml.j2 | 68 ++++++ 14 files changed, 707 insertions(+) create mode 100644 hooks/playbooks/adoption_bgp_post_undercloud.yaml create mode 100644 hooks/playbooks/adoption_bgp_pre_undercloud.yaml create mode 100644 roles/adoption_osp_deploy/files/bgp-tht-cinder-patch create mode 100644 roles/adoption_osp_deploy/files/bgp-tht-frr-patch create mode 100644 roles/adoption_osp_deploy/templates/adoption_vars_bgp.yaml.j2 create mode 100644 roles/adoption_osp_deploy/templates/os_net_config_overcloud_bgp.yml.j2 create mode 100644 roles/adoption_osp_deploy/templates/os_net_config_undercloud_bgp.yml.j2 create mode 100644 roles/adoption_osp_deploy/templates/tripleo-ansible-inventory_bgp.yaml.j2 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/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 %} From 9e86ec63aede41e420539538a8b1e1ae0562c4cc Mon Sep 17 00:00:00 2001 From: Eduardo Olivares Date: Mon, 15 Dec 2025 16:58:23 +0100 Subject: [PATCH 3/4] [multiple] Add BGP L3 XL adoption scenario and supporting infrastructure This commit adds the BGP L3 XL adoption scenario configuration, including reproducer scenarios, networking definitions, BGP spines/leaves playbook updates, and adoption-specific scenario files. Co-authored-by: Luca Miccini Signed-off-by: Eduardo Olivares --- docs/dictionary/en-custom.txt | 1 + playbooks/bgp/prepare-bgp-spines-leaves.yaml | 69 +++ scenarios/adoption/bgp-l3-xl.yml | 489 ++++++++++++++++++ scenarios/reproducers/bgp-l3-xl.yml | 392 ++++---------- .../reproducers/networking-definition-bgp.yml | 298 +++++++++++ 5 files changed, 954 insertions(+), 295 deletions(-) create mode 100644 scenarios/adoption/bgp-l3-xl.yml create mode 100644 scenarios/reproducers/networking-definition-bgp.yml 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/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/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..7d14b126df 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 }}" @@ -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" From 9ea3b7c8b65561e5613542a02533969f39fb3bd9 Mon Sep 17 00:00:00 2001 From: Eduardo Olivares Date: Fri, 19 Dec 2025 10:14:57 +0100 Subject: [PATCH 4/4] reduce ram and cpus --- scenarios/reproducers/bgp-l3-xl.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scenarios/reproducers/bgp-l3-xl.yml b/scenarios/reproducers/bgp-l3-xl.yml index 7d14b126df..23358f6c73 100644 --- a/scenarios/reproducers/bgp-l3-xl.yml +++ b/scenarios/reproducers/bgp-l3-xl.yml @@ -716,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: @@ -737,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: @@ -770,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: