Skip to content

Commit 71649de

Browse files
committed
fix(nova-understack): fix client/target prefix handling
The calculation of the target prefix from the client IP was incorrect based on the actual prefixes in use. This updates the code to have the correct client side prefixes and then updates the tests to match while including the correct target side prefixes as well.
1 parent e4af786 commit 71649de

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

python/nova-understack/ironic_understack/nautobot_client.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,19 @@ def address(self) -> str:
3030
@property
3131
def target_network(self) -> ipaddress.IPv4Network:
3232
"""Returns the respective target-side network."""
33-
third_octet = self.address.split(".")[2]
34-
if third_octet not in ["0", "128"]:
33+
target_a_prefix = ipaddress.IPv4Network("100.127.0.0/17")
34+
target_b_prefix = ipaddress.IPv4Network("100.127.128.0/17")
35+
client_a_prefix = ipaddress.IPv4Network("100.126.0.0/17")
36+
client_b_prefix = ipaddress.IPv4Network("100.126.128.0/17")
37+
38+
if self.interface.ip in client_a_prefix:
39+
return target_a_prefix
40+
elif self.interface.ip in client_b_prefix:
41+
return target_b_prefix
42+
else:
3543
raise ValueError(
36-
f"Cannot determine the target-side network from {self.address}"
44+
f"Cannot determine the target-side network from {self.interface}"
3745
)
38-
return ipaddress.IPv4Network(f"100.127.{third_octet}.0/24")
3946

4047
@property
4148
def address_with_prefix(self) -> str:

python/nova-understack/tests/test_nautobot_client.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,16 @@ def test_network_property(self):
5454

5555
def test_target_network_octet_0(self):
5656
"""Test target_network calculation for third octet 0."""
57-
ip = IPAddress.from_address_string("100.127.0.10/24")
57+
ip = IPAddress.from_address_string("100.126.0.10/24")
5858

59-
expected_network = ipaddress.IPv4Network("100.127.0.0/24")
59+
expected_network = ipaddress.IPv4Network("100.127.0.0/17")
6060
assert ip.target_network == expected_network
6161

6262
def test_target_network_octet_128(self):
6363
"""Test target_network calculation for third octet 128."""
64-
ip = IPAddress.from_address_string("100.127.128.10/24")
64+
ip = IPAddress.from_address_string("100.126.128.10/24")
6565

66-
expected_network = ipaddress.IPv4Network("100.127.128.0/24")
66+
expected_network = ipaddress.IPv4Network("100.127.128.0/17")
6767
assert ip.target_network == expected_network
6868

6969
def test_target_network_invalid_octet(self):
@@ -230,7 +230,7 @@ def test_as_openstack_network(self):
230230
"""Test OpenStack network generation."""
231231
# Create IP with specific values for predictable gateway calculation
232232
ip_assignment = IPAddressAssignment(
233-
ip_address=IPAddress.from_address_string("100.127.0.10/24")
233+
ip_address=IPAddress.from_address_string("100.126.0.10/24")
234234
)
235235
interface = Interface(
236236
id="interface-1",
@@ -247,13 +247,13 @@ def test_as_openstack_network(self):
247247
"id": "network-for-if5",
248248
"type": "ipv4",
249249
"link": "tap-stor-5",
250-
"ip_address": "100.127.0.10",
250+
"ip_address": "100.126.0.10",
251251
"netmask": "255.255.255.0",
252252
"routes": [
253253
{
254254
"network": "100.127.0.0",
255-
"netmask": "255.255.255.0",
256-
"gateway": "100.127.0.1",
255+
"netmask": "255.255.128.0",
256+
"gateway": "100.126.0.1",
257257
}
258258
],
259259
"network_id": "test-network-id",
@@ -554,7 +554,7 @@ def test_generate_network_config_all_interfaces(self):
554554
mac_address="aa:bb:cc:dd:ee:ff",
555555
ip_address_assignments=[
556556
IPAddressAssignment(
557-
ip_address=IPAddress.from_address_string("100.127.0.10/24")
557+
ip_address=IPAddress.from_address_string("100.126.0.10/24")
558558
)
559559
],
560560
),
@@ -564,7 +564,7 @@ def test_generate_network_config_all_interfaces(self):
564564
ip_address_assignments=[
565565
IPAddressAssignment(
566566
ip_address=IPAddress.from_address_string(
567-
"100.127.128.10/24"
567+
"100.126.128.10/24"
568568
)
569569
)
570570
],

0 commit comments

Comments
 (0)