From 2c45245003f9c4b6335b697aef6992bc981455f0 Mon Sep 17 00:00:00 2001 From: Steve Keay Date: Tue, 4 Aug 2026 12:02:38 +0100 Subject: [PATCH 1/2] Handle multiple network leaf pairs in vlan_group naming convention --- .../tests/test_vlan_group_name_convention.py | 19 ++++++++++++++++++- .../vlan_group_name_convention.py | 11 +++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/python/ironic-understack/ironic_understack/tests/test_vlan_group_name_convention.py b/python/ironic-understack/ironic_understack/tests/test_vlan_group_name_convention.py index cb96b63be..6ee059564 100644 --- a/python/ironic-understack/ironic_understack/tests/test_vlan_group_name_convention.py +++ b/python/ironic-understack/ironic_understack/tests/test_vlan_group_name_convention.py @@ -44,7 +44,7 @@ def test_vlan_group_name_single_cab(): } -def test_vlan_group_name_pair_cab(): +def test_vlan_group_name_pair_cab_dash_one(): assert vlan_group_names( [ port("a1-1-1.abc1"), @@ -61,6 +61,23 @@ def test_vlan_group_name_pair_cab(): } +def test_vlan_group_name_pair_cab_dash_two(): + assert vlan_group_names( + [ + port("a1-1-2.abc1"), + port("a1-2-2.abc1"), + port("a1-1-1f.abc1"), + port("a1-2-1f.abc1"), + ], + mapping, + ) == { + "a1-1-2.abc1": "a1-1-2/a1-2-2-network", + "a1-2-2.abc1": "a1-1-2/a1-2-2-network", + "a1-1-1f.abc1": "a1-1/a1-2-storage", + "a1-2-1f.abc1": "a1-1/a1-2-storage", + } + + def test_vlan_group_name_with_domain(): assert vlan_group_names( [ diff --git a/python/ironic-understack/ironic_understack/vlan_group_name_convention.py b/python/ironic-understack/ironic_understack/vlan_group_name_convention.py index cf5802fac..ad4dee9f0 100644 --- a/python/ironic-understack/ironic_understack/vlan_group_name_convention.py +++ b/python/ironic-understack/ironic_understack/vlan_group_name_convention.py @@ -30,6 +30,10 @@ def vlan_group_names( racks separated by a slash: ["a11-12-1", "a11-13-1"] => "a11-12/a11-13-network" + + In a pair of racks using -2 switches, we add a -2 to the cabinet name: + + ["a11-12-2", "a11-13-2"] => "a11-12-2/a11-13-2-network" """ assert_consistent_data_center(ports) assert_single_or_paired_racks(ports) @@ -42,9 +46,16 @@ def vlan_group_names( vlan_group_names = {} for switch_category, ports_in_group in vlan_groups.items(): rack_names = {p.rack_name for p in ports_in_group} + switch_suffixes = {p.switch_suffix for p in ports_in_group} + + if len(rack_names) > 1 and switch_suffixes == {"2"}: + rack_names = {f"{rack_name}-2" for rack_name in rack_names} + vlan_group_name = "/".join(sorted(rack_names)) + "-" + switch_category + for p in ports_in_group: vlan_group_names[p.switch_system_name] = vlan_group_name + return vlan_group_names From 2724f390fb3c5c98fde104d16edb9ef7f5b30216 Mon Sep 17 00:00:00 2001 From: Steve Keay Date: Fri, 7 Aug 2026 13:29:10 +0100 Subject: [PATCH 2/2] Extend special-case vlan group naming to handle -3, -4, etc., switches --- .../ironic_understack/vlan_group_name_convention.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/ironic-understack/ironic_understack/vlan_group_name_convention.py b/python/ironic-understack/ironic_understack/vlan_group_name_convention.py index ad4dee9f0..a99da8caf 100644 --- a/python/ironic-understack/ironic_understack/vlan_group_name_convention.py +++ b/python/ironic-understack/ironic_understack/vlan_group_name_convention.py @@ -48,8 +48,11 @@ def vlan_group_names( rack_names = {p.rack_name for p in ports_in_group} switch_suffixes = {p.switch_suffix for p in ports_in_group} - if len(rack_names) > 1 and switch_suffixes == {"2"}: - rack_names = {f"{rack_name}-2" for rack_name in rack_names} + # Special case naming for pairs of racks that have multiple leaf pairs. + # (We don't handle multiple pairs in a single rack.) + if switch_suffixes in [{"2"}, {"3"}, {"4"}, {"5"}, {"6"}]: + suffix = next(iter(switch_suffixes)) + rack_names = {f"{rack_name}-{suffix}" for rack_name in rack_names} vlan_group_name = "/".join(sorted(rack_names)) + "-" + switch_category