Skip to content

Commit 8c0f1b7

Browse files
fix: Support moves between LR
1 parent 84df42c commit 8c0f1b7

2 files changed

Lines changed: 37 additions & 12 deletions

File tree

panos/network.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -562,25 +562,34 @@ def set_logical_router(
562562
refresh,
563563
running_config,
564564
name_only=False,
565-
reference_var="interface",
565+
reference_var="vrf",
566566
)
567567
lr: LogicalRouter | None
568568

569-
lr = next((lr for lr in all_logical_routers if lr.uid == lr_name), None)
570-
if not lr:
569+
target_lr = next((lr for lr in all_logical_routers if lr.uid == lr_name), None)
570+
if not target_lr:
571571
# If the LR isn't found, create it instead
572-
lr = LogicalRouter(name=lr_name)
573-
parent.add(lr)
574-
lr.create()
572+
target_lr = LogicalRouter(name=lr_name)
573+
parent.add(target_lr)
574+
vrf = Vrf(name=vrf_name)
575+
target_lr.add(vrf)
576+
target_lr.create()
577+
578+
# Remove interface from other LRs first
579+
for lr in all_logical_routers:
580+
Vrf.refreshall(lr)
581+
if lr.name != lr_name:
582+
for vrf in lr.findall(Vrf):
583+
if vrf.interface:
584+
if self.name in vrf.interface:
585+
vrf.interface.remove(self.name)
586+
if update:
587+
vrf.update("interface")
575588

576-
# Create or locate the VRF
577-
vrf = Vrf(name=vrf_name)
578-
vrf.refreshall(lr)
579589

580-
# Pass all the vrfs to the update method
581590
return self._update_reference_in_objects(
582-
lr,
583-
lr.vrf,
591+
target_lr,
592+
target_lr.findall(Vrf),
584593
reference_name=vrf_name,
585594
reference_var="interface",
586595
reference_type=Vrf,

tests/live/test_network.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,12 +1751,27 @@ def setup_state_obj(self, fw, state):
17511751
state.obj.create()
17521752
state.obj_2.create()
17531753

1754+
lr_2.refresh()
1755+
print(f"LR_2 CHILDREN: {lr_2.vrf}")
1756+
17541757
def test_10_set_lr_for_interface(self, fw, state_map):
17551758
"""Test setting the LR for an interface instead of the other way around"""
17561759
state = self.sanity(fw, state_map)
17571760
eth: Interface = state.eth_obj_2
17581761
eth.set_logical_router(state.obj_2.name, update=True)
17591762

1763+
def test_11_change_lr_for_interface(self, fw, state_map):
1764+
"""Test setting the LR for an interface instead of the other way around"""
1765+
state = self.sanity(fw, state_map)
1766+
eth: Interface = state.eth_obj_2
1767+
eth.set_logical_router(state.obj.name, update=True, refresh=True)
1768+
1769+
def test_11_change_lr_for_interface_add_new_lr(self, fw, state_map):
1770+
"""Test setting the LR for an interface instead of the other way around"""
1771+
state = self.sanity(fw, state_map)
1772+
eth: Interface = state.eth_obj
1773+
eth.set_logical_router("test-new-lr", update=True, refresh=True)
1774+
17601775
def update_state_obj(self, fw, state):
17611776
state.obj.ad_static = random.randint(10, 240)
17621777
state.obj.ad_rip = random.randint(10, 240)
@@ -1765,6 +1780,7 @@ def cleanup_dependencies(self, fw, state):
17651780
try:
17661781
fw.add(state.obj)
17671782
fw.add(state.obj_2)
1783+
fw.remove_by_name("test-new-lr", network.LogicalRouter)
17681784
state.obj.delete()
17691785
state.obj_2.delete()
17701786
state.eth_obj.delete()

0 commit comments

Comments
 (0)