diff --git a/python/nova-understack/ironic_understack/conf.py b/python/nova-understack/ironic_understack/conf.py index 62f6e82ee..85df4395b 100644 --- a/python/nova-understack/ironic_understack/conf.py +++ b/python/nova-understack/ironic_understack/conf.py @@ -27,6 +27,26 @@ def setup_conf(): help="Controls if Nova should inject storage IPs to config drive.", default=True, ), + cfg.StrOpt( + "storage_target_a_prefix", + help="Storage Networking Target Prefix A-side", + default="100.127.0.0/17", + ), + cfg.StrOpt( + "storage_target_b_prefix", + help="Storage Networking Target Prefix B-side", + default="100.127.128.0/17", + ), + cfg.StrOpt( + "storage_client_a_prefix", + help="Storage Networking Client Prefix A-side", + default="100.126.0.0/17", + ), + cfg.StrOpt( + "storage_client_b_prefix", + help="Storage Networking Client Prefix B-side", + default="100.126.128.0/17", + ), ] cfg.CONF.register_group(grp) cfg.CONF.register_opts(opts, group=grp) diff --git a/python/nova-understack/ironic_understack/nautobot_client.py b/python/nova-understack/ironic_understack/nautobot_client.py index 2a0a1c2f0..488bbc6ea 100644 --- a/python/nova-understack/ironic_understack/nautobot_client.py +++ b/python/nova-understack/ironic_understack/nautobot_client.py @@ -4,6 +4,7 @@ from uuid import UUID import requests +from oslo_config import cfg @dataclass @@ -30,12 +31,20 @@ def address(self) -> str: @property def target_network(self) -> ipaddress.IPv4Network: """Returns the respective target-side network.""" - third_octet = self.address.split(".")[2] - if third_octet not in ["0", "128"]: + nova_us_cfg = cfg.CONF.nova_understack + target_a_prefix = ipaddress.IPv4Network(nova_us_cfg.storage_target_a_prefix) + target_b_prefix = ipaddress.IPv4Network(nova_us_cfg.storage_target_b_prefix) + client_a_prefix = ipaddress.IPv4Network(nova_us_cfg.storage_client_a_prefix) + client_b_prefix = ipaddress.IPv4Network(nova_us_cfg.storage_client_b_prefix) + + if self.interface.ip in client_a_prefix: + return target_a_prefix + elif self.interface.ip in client_b_prefix: + return target_b_prefix + else: raise ValueError( - f"Cannot determine the target-side network from {self.address}" + f"Cannot determine the target-side network from {self.interface}" ) - return ipaddress.IPv4Network(f"100.127.{third_octet}.0/24") @property def address_with_prefix(self) -> str: diff --git a/python/nova-understack/tests/test_nautobot_client.py b/python/nova-understack/tests/test_nautobot_client.py index 1cce76083..81408bbfc 100644 --- a/python/nova-understack/tests/test_nautobot_client.py +++ b/python/nova-understack/tests/test_nautobot_client.py @@ -54,16 +54,16 @@ def test_network_property(self): def test_target_network_octet_0(self): """Test target_network calculation for third octet 0.""" - ip = IPAddress.from_address_string("100.127.0.10/24") + ip = IPAddress.from_address_string("100.126.0.10/24") - expected_network = ipaddress.IPv4Network("100.127.0.0/24") + expected_network = ipaddress.IPv4Network("100.127.0.0/17") assert ip.target_network == expected_network def test_target_network_octet_128(self): """Test target_network calculation for third octet 128.""" - ip = IPAddress.from_address_string("100.127.128.10/24") + ip = IPAddress.from_address_string("100.126.128.10/24") - expected_network = ipaddress.IPv4Network("100.127.128.0/24") + expected_network = ipaddress.IPv4Network("100.127.128.0/17") assert ip.target_network == expected_network def test_target_network_invalid_octet(self): @@ -230,7 +230,7 @@ def test_as_openstack_network(self): """Test OpenStack network generation.""" # Create IP with specific values for predictable gateway calculation ip_assignment = IPAddressAssignment( - ip_address=IPAddress.from_address_string("100.127.0.10/24") + ip_address=IPAddress.from_address_string("100.126.0.10/24") ) interface = Interface( id="interface-1", @@ -247,13 +247,13 @@ def test_as_openstack_network(self): "id": "network-for-if5", "type": "ipv4", "link": "tap-stor-5", - "ip_address": "100.127.0.10", + "ip_address": "100.126.0.10", "netmask": "255.255.255.0", "routes": [ { "network": "100.127.0.0", - "netmask": "255.255.255.0", - "gateway": "100.127.0.1", + "netmask": "255.255.128.0", + "gateway": "100.126.0.1", } ], "network_id": "test-network-id", @@ -554,7 +554,7 @@ def test_generate_network_config_all_interfaces(self): mac_address="aa:bb:cc:dd:ee:ff", ip_address_assignments=[ IPAddressAssignment( - ip_address=IPAddress.from_address_string("100.127.0.10/24") + ip_address=IPAddress.from_address_string("100.126.0.10/24") ) ], ), @@ -564,7 +564,7 @@ def test_generate_network_config_all_interfaces(self): ip_address_assignments=[ IPAddressAssignment( ip_address=IPAddress.from_address_string( - "100.127.128.10/24" + "100.126.128.10/24" ) ) ],