Skip to content
Snippets Groups Projects
Commit 9f0aba62 authored by Neda Moeini's avatar Neda Moeini
Browse files

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

parent 4b4a6c98
Branches
Tags
1 merge request!275Fix the bug of clearing all the AE members and creating new objects instead of updating it.
Pipeline #89324 canceled
This commit is part of merge request !275. Comments created here will be created in the context of that merge request.
......@@ -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,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment