Skip to content

Commit a90e52a

Browse files
m-blue-mopenshift-merge-bot[bot]
authored andcommitted
[ci_gen_kustomize_values] Add eBGP leaf template support for BGP dt02
Allow parameterized leaf ASN and downlink peering mode in the leaf FRR template. Conditional graceful-shutdown and route-reflector-client for iBGP racks only, since FRR rejects route-reflector-client on eBGP peers (different ASN) and graceful-shutdown is not applicable for eBGP during normal operation. Adds ebgp_racks and ebgp_leaf_asn variables to control which racks use eBGP and their leaf ASN (formula: 64999 - rack_id). Applies to both IPv4 and IPv6 address families. Adds bgp_dt02 template directory for ci_gen_kustomize_values. Related: OSPRH-28085 Assisted-By: Claude Code Signed-off-by: Maor Blaustein <mblue@redhat.com>
1 parent 712dfb3 commit a90e52a

11 files changed

Lines changed: 325 additions & 4 deletions

File tree

playbooks/bgp/prepare-bgp-spines-leaves.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,11 @@
440440
leaf_id: "{{ (ansible_hostname.split('-')[-1] | int) % 2 }}" # always 2 leaves per rack
441441
rack_id: "{{ (ansible_hostname.split('-')[-1] | int) // 2 }}" # always 2 leaves per rack
442442
_ip_version: "{{ ip_version | default(4) | int }}"
443+
# ebgp_racks: comma-separated rack IDs that use eBGP (e.g. "1,2")
444+
# ebgp_leaf_asn: base ASN for eBGP leaves (default: 64999 - rack_id)
445+
_is_ebgp_rack: "{{ (rack_id | int) in (ebgp_racks | default('') | split(',') | select | map('int') | list) }}"
446+
downlink_remote_as: "{{ 'external' if _is_ebgp_rack else 'internal' }}"
447+
leaf_asn: "{{ ebgp_leaf_asn | default(64999 - (rack_id | int)) if _is_ebgp_rack else 64999 }}"
443448
tasks:
444449
- name: Obtain the connection for the eth0 interface
445450
ansible.builtin.command:

playbooks/bgp/templates/leaf-frr.conf.j2

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@ debug bgp neighbor-events
1313
debug bgp updates
1414
debug bgp update-groups
1515

16-
router bgp 64999
16+
{% set _downlink_as_mode = downlink_remote_as | default('internal') %}
17+
router bgp {{ leaf_asn | default(64999) }}
1718
{% if _router_id %}
1819
bgp router-id {{_router_id}}
1920
{% endif %}
2021
bgp log-neighbor-changes
22+
{% if _downlink_as_mode == 'internal' %}
2123
bgp graceful-shutdown
24+
{% endif %}
2225

2326
bgp graceful-restart
2427
bgp graceful-restart notification
@@ -27,7 +30,7 @@ router bgp 64999
2730
! bgp long-lived-graceful-restart stale-time 15
2831

2932
neighbor downlink peer-group
30-
neighbor downlink remote-as internal
33+
neighbor downlink remote-as {{ _downlink_as_mode }}
3134
neighbor downlink bfd
3235
neighbor downlink bfd profile tripleo
3336
{# TODO: remove the next if when RHEL-63205 is fixed #}
@@ -53,9 +56,11 @@ router bgp 64999
5356

5457
address-family ipv4 unicast
5558
redistribute connected
56-
neighbor downlink route-reflector-client
5759
neighbor downlink default-originate
5860
neighbor downlink next-hop-self
61+
{% if _downlink_as_mode == 'internal' %}
62+
neighbor downlink route-reflector-client
63+
{% endif %}
5964
neighbor downlink prefix-list only-host-prefixes out
6065
neighbor uplink allowas-in origin
6166
neighbor uplink prefix-list only-default-host-prefixes in
@@ -64,9 +69,11 @@ router bgp 64999
6469
address-family ipv6 unicast
6570
redistribute connected
6671
neighbor downlink activate
67-
neighbor downlink route-reflector-client
6872
neighbor downlink default-originate
6973
neighbor downlink next-hop-self
74+
{% if _downlink_as_mode == 'internal' %}
75+
neighbor downlink route-reflector-client
76+
{% endif %}
7077
neighbor uplink activate
7178
neighbor uplink allowas-in origin
7279
neighbor uplink prefix-list only-default-host-prefixes in
@@ -76,7 +83,9 @@ router bgp 64999
7683
neighbor uplink activate
7784
neighbor uplink allowas-in origin
7885
neighbor downlink activate
86+
{% if _downlink_as_mode == 'internal' %}
7987
neighbor downlink route-reflector-client
88+
{% endif %}
8089
exit-address-family
8190

8291
ip prefix-list only-default-host-prefixes permit 0.0.0.0/0
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# See the OWNERS docs at https://www.kubernetes.dev/docs/guide/owners/
2+
3+
approvers:
4+
- bgp-team
5+
6+
reviewers:
7+
- bgp-team
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# source: bgp_dt02/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2
2+
{% set instances_names = [] %}
3+
{% set rack = 'r' ~ rack_number %}
4+
{% for _inst in cifmw_networking_env_definition.instances.keys() %}
5+
{% if _inst.startswith('-'.join([rack, node_type])) %}
6+
{% set _ = instances_names.append(_inst) %}
7+
{% endif %}
8+
{% endfor %}
9+
data:
10+
ssh_keys:
11+
authorized: {{ cifmw_ci_gen_kustomize_values_ssh_authorizedkeys | b64encode }}
12+
private: {{ cifmw_ci_gen_kustomize_values_ssh_private_key | b64encode }}
13+
public: {{ cifmw_ci_gen_kustomize_values_ssh_public_key | b64encode }}
14+
nova:
15+
migration:
16+
ssh_keys:
17+
private: {{ cifmw_ci_gen_kustomize_values_migration_priv_key | b64encode }}
18+
public: {{ cifmw_ci_gen_kustomize_values_migration_pub_key | b64encode }}
19+
nodeset:
20+
ansible:
21+
ansibleUser: "zuul"
22+
ansibleVars:
23+
edpm_fips_mode: "{{ 'enabled' if cifmw_fips_enabled|default(false)|bool else 'check' }}"
24+
timesync_ntp_servers:
25+
- hostname: "{{ cifmw_ci_gen_kustomize_values_ntp_srv | default('pool.ntp.org') }}"
26+
edpm_sshd_allowed_ranges:
27+
{% set sshd_allowed_range = cifmw_ci_gen_kustomize_values_sshd_ranges | default([]) %}
28+
{% for rack in ['r0', 'r1', 'r2'] %}
29+
{% set _ = sshd_allowed_range.append(cifmw_networking_env_definition.networks['ctlplane' + rack].network_v4) %}
30+
{% endfor %}
31+
{% for range in sshd_allowed_range %}
32+
- "{{ range }}"
33+
{% endfor %}
34+
nodes:
35+
{% for instance in instances_names %}
36+
{{ instance }}:
37+
ansible:
38+
{% set ctlplane_rack = 'ctlplane' + rack %}
39+
ansibleHost: {{ cifmw_networking_env_definition.instances[instance].networks[ctlplane_rack].ip_v4 }}
40+
{% if original_content.data.nodeset.nodes['edpm-' ~ instance].ansible.ansibleVars is defined %}
41+
ansibleVars: {{ original_content.data.nodeset.nodes['edpm-' ~ instance].ansible.ansibleVars }}
42+
{% endif %}
43+
hostName: {{ instance }}
44+
networks:
45+
{% for net in cifmw_networking_env_definition.instances[instance].networks.keys() %}
46+
{% if 'storagemgmt' not in net %}
47+
- name: {{ net if net != ctlplane_rack else 'ctlplane' }}
48+
subnetName: {{ 'subnet1' if net != ctlplane_rack else 'subnet' ~ rack_number }}
49+
{% if 'ctlplane' in net %}
50+
defaultRoute: true
51+
fixedIP: {{ cifmw_networking_env_definition.instances[instance].networks[ctlplane_rack].ip_v4 }}
52+
{% endif %}
53+
{% endif %}
54+
{% endfor %}
55+
{% set peer_suffix = 1 if 'compute' in instance else 5 %}
56+
- name: BgpNet0
57+
subnetName: subnet{{ rack_number }}
58+
fixedIP: 100.64.{{ rack_number }}.{{ peer_suffix + 1 }}
59+
- name: BgpNet1
60+
subnetName: subnet{{ rack_number }}
61+
fixedIP: 100.65.{{ rack_number }}.{{ peer_suffix + 1 }}
62+
- name: BgpMainNet
63+
subnetName: subnet{{ rack_number }}
64+
fixedIP: 99.99.{{ rack_number }}.{{ peer_suffix + 1 }}
65+
- name: BgpMainNetV6
66+
subnetName: subnet{{ rack_number }}
67+
fixedIP: f00d:f00d:f00d:f00d:f00d:f00d:f00d:00{{ (rack_number | int) + 1 }}{{ 2 if 'compute' in instance else 3 }}
68+
{% endfor %}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
# source: bgp_dt02/edpm-r0-compute-nodeset-values/values.yaml.j2
3+
{% set node_type = "compute" %}
4+
{% set rack_number = 0 %}
5+
{% include 'templates/bgp_dt02/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2' %}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
# source: bgp_dt02/edpm-r0-networker-nodeset-values/values.yaml.j2
3+
{% set node_type = "networker" %}
4+
{% set rack_number = 0 %}
5+
{% include 'templates/bgp_dt02/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2' %}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
# source: bgp_dt02/edpm-r1-compute-nodeset-values/values.yaml.j2
3+
{% set node_type = "compute" %}
4+
{% set rack_number = 1 %}
5+
{% include 'templates/bgp_dt02/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2' %}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
# source: bgp_dt02/edpm-r1-networker-nodeset-values/values.yaml.j2
3+
{% set node_type = "networker" %}
4+
{% set rack_number = 1 %}
5+
{% include 'templates/bgp_dt02/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2' %}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
# source: bgp_dt02/edpm-r2-compute-nodeset-values/values.yaml.j2
3+
{% set node_type = "compute" %}
4+
{% set rack_number = 2 %}
5+
{% include 'templates/bgp_dt02/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2' %}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
# source: bgp_dt02/edpm-r2-networker-nodeset-values/values.yaml.j2
3+
{% set node_type = "networker" %}
4+
{% set rack_number = 2 %}
5+
{% include 'templates/bgp_dt02/edpm-common-nodeset-values/common-bgp-edpm-values.yaml.j2' %}

0 commit comments

Comments
 (0)