Skip to content
Snippets Groups Projects

Fix the bug of clearing all the AE members and creating new objects instead of updating it.

Merged Neda Moeini requested to merge hotfix/NAT-818-modify-trunk-interface into develop
1 file
+ 32
16
Compare changes
  • Side-by-side
  • Inline
@@ -216,6 +216,29 @@ def check_ip_trunk_lldp(subscription: Iptrunk, callback_route: str) -> State:
return {"subscription": subscription}
def update_side_members(subscription: Iptrunk, side_index: int, new_members: list[dict]) -> None:
"""Update the AE members for a given side without removing unchanged members."""
# Prepare a dictionary for quick lookup of existing members by name
current_members = subscription.iptrunk.iptrunk_sides[side_index].iptrunk_side_ae_members
existing_members_dict = {member.interface_name: member for member in current_members}
# Iterate over new members and update or add them
for new_member in new_members:
interface_name = new_member["interface_name"]
if interface_name in existing_members_dict:
# Member exists, update details but keep the same subscription ID
existing_member = existing_members_dict[interface_name]
existing_member.interface_description = new_member["interface_description"]
else:
# New member, create a new subscription ID
current_members.append(IptrunkInterfaceBlock.new(subscription_id=uuid4(), **new_member))
# Remove members that are no longer in the new members list
subscription.iptrunk.iptrunk_sides[side_index].iptrunk_side_ae_members = [
member for member in current_members if member.interface_name in [m["interface_name"] for m in new_members]
]
@step("Update subscription")
def modify_iptrunk_subscription(
subscription: Iptrunk,
@@ -242,12 +265,16 @@ def modify_iptrunk_subscription(
for side in subscription.iptrunk.iptrunk_sides
]
removed_ae_members = []
# Compare previous and current members to determine which ones were removed
for side_index in range(2):
previous_members = previous_ae_members[side_index]
current_members = side_a_ae_members if side_index == 0 else side_b_ae_members
removed_ae_members.append([ae_member for ae_member in previous_members if ae_member not in current_members])
removed_ae_members.append([
ae_member
for ae_member in previous_members
if ae_member["interface_name"] not in [m["interface_name"] for m in current_members]
])
# Update the subscription
subscription.iptrunk.geant_s_sid = geant_s_sid
subscription.iptrunk.iptrunk_description = iptrunk_description
subscription.iptrunk.iptrunk_type = iptrunk_type
@@ -255,20 +282,9 @@ def modify_iptrunk_subscription(
subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid = side_a_ae_geant_a_sid
# Flush the old list of member interfaces
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members.clear()
# And update the list to only include the new member interfaces
for member in side_a_ae_members:
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members.append(
IptrunkInterfaceBlock.new(subscription_id=uuid4(), **member),
)
update_side_members(subscription, 0, side_a_ae_members)
subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_geant_a_sid = side_b_ae_geant_a_sid
subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members.clear()
for member in side_b_ae_members:
subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members.append(
IptrunkInterfaceBlock.new(subscription_id=uuid4(), **member),
)
update_side_members(subscription, 1, side_b_ae_members)
side_names = sorted([
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_site.site_name,
Loading