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

Changed minimum links to number of members, added a confirmation page for the...

Changed minimum links to number of members, added a confirmation page for the minimum links value and  made interface description optional.
parent 1f5d528e
No related branches found
No related tags found
No related merge requests found
Pipeline #86175 passed
......@@ -55,14 +55,14 @@ class IptrunkInterfaceBlockProvisioning(IptrunkInterfaceBlockInactive, lifecycle
"""An IP trunk interface that is being provisioned."""
interface_name: str
interface_description: str
interface_description: str | None = None
class IptrunkInterfaceBlock(IptrunkInterfaceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
"""An active IP trunk interface."""
interface_name: str
interface_description: str
interface_description: str | None = None
class IptrunkSides(UniqueConstrainedList[T_co]): # type: ignore[type-var]
......
......@@ -25,7 +25,7 @@ class LAGMember(BaseModel):
"""A :term:`LAG` member interface that consists of a name and description."""
interface_name: str
interface_description: str
interface_description: str | None
def __hash__(self) -> int:
"""Calculate the hash based on the interface name and description, so that uniqueness can be determined."""
......
......@@ -61,7 +61,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
iptrunk_description: str
iptrunk_type: IptrunkType
iptrunk_speed: PhysicalPortCapacity
iptrunk_minimum_links: int
iptrunk_number_of_members: int
@validator("tt_number", allow_reuse=True)
def validate_tt_number(cls, tt_number: str) -> str:
......@@ -69,6 +69,13 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
initial_user_input = yield CreateIptrunkForm
class VerifyMinimumLinksForm(FormPage):
info_label: Label = (
f"This is the calculated minimum-links for this LAG: " f"{initial_user_input.iptrunk_number_of_members - 1}" # type: ignore[assignment]
)
info_label2: Label = "Please confirm or modify." # type: ignore[assignment]
yield VerifyMinimumLinksForm
router_enum_a = Choice("Select a router", zip(routers.keys(), routers.items(), strict=True)) # type: ignore[arg-type]
class SelectRouterSideA(FormPage):
......@@ -86,7 +93,8 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
router_a_fqdn = Router.from_subscription(router_a).router.router_fqdn
class JuniperAeMembers(UniqueConstrainedList[LAGMember]):
min_items = initial_user_input.iptrunk_minimum_links
min_items = initial_user_input.iptrunk_number_of_members
max_items = initial_user_input.iptrunk_number_of_members
if get_router_vendor(router_a) == Vendor.NOKIA:
......@@ -97,7 +105,8 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
)
class NokiaAeMembersA(UniqueConstrainedList[NokiaLAGMemberA]):
min_items = initial_user_input.iptrunk_minimum_links
min_items = initial_user_input.iptrunk_number_of_members
max_items = initial_user_input.iptrunk_number_of_members
ae_members_side_a = NokiaAeMembersA
else:
......@@ -213,7 +222,7 @@ def initialize_subscription(
iptrunk_type: IptrunkType,
iptrunk_description: str,
iptrunk_speed: PhysicalPortCapacity,
iptrunk_minimum_links: int,
iptrunk_number_of_members: int,
side_a_node_id: str,
side_a_ae_iface: str,
side_a_ae_geant_a_sid: str | None,
......@@ -232,7 +241,7 @@ def initialize_subscription(
subscription.iptrunk.iptrunk_type = iptrunk_type
subscription.iptrunk.iptrunk_speed = iptrunk_speed
subscription.iptrunk.iptrunk_isis_metric = oss_params.GENERAL.isis_high_metric
subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links
subscription.iptrunk.iptrunk_minimum_links = iptrunk_number_of_members - 1
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node = side_a
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface = side_a_ae_iface
......
......@@ -40,7 +40,7 @@ def initialize_ae_members(subscription: Iptrunk, initial_user_input: dict, side_
"""Initialize the list of AE members."""
router = subscription.iptrunk.iptrunk_sides[side_index].iptrunk_side_node
router_vendor = get_router_vendor(router.owner_subscription_id)
iptrunk_minimum_link = initial_user_input["iptrunk_minimum_links"]
iptrunk_number_of_members = initial_user_input["iptrunk_number_of_members"]
if router_vendor == Vendor.NOKIA:
iptrunk_speed = initial_user_input["iptrunk_speed"]
......@@ -61,13 +61,15 @@ def initialize_ae_members(subscription: Iptrunk, initial_user_input: dict, side_
)
class NokiaAeMembers(UniqueConstrainedList[NokiaLAGMember]):
min_items = iptrunk_minimum_link
min_items = iptrunk_number_of_members
max_items = iptrunk_number_of_members
ae_members = NokiaAeMembers
else:
class JuniperAeMembers(UniqueConstrainedList[LAGMember]):
min_items = iptrunk_minimum_link
min_items = iptrunk_number_of_members
max_items = iptrunk_number_of_members
ae_members = JuniperAeMembers # type: ignore[assignment]
return ae_members # type: ignore[return-value]
......@@ -87,7 +89,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
"You will need to add the new AE members in the next steps." # type: ignore[assignment]
)
iptrunk_speed: PhysicalPortCapacity = subscription.iptrunk.iptrunk_speed
iptrunk_minimum_links: int = subscription.iptrunk.iptrunk_minimum_links
iptrunk_number_of_members: int = subscription.iptrunk.iptrunk_minimum_links + 1
iptrunk_isis_metric: int = ReadOnlyField(subscription.iptrunk.iptrunk_isis_metric)
iptrunk_ipv4_network: ipaddress.IPv4Network = ReadOnlyField(subscription.iptrunk.iptrunk_ipv4_network)
iptrunk_ipv6_network: ipaddress.IPv6Network = ReadOnlyField(subscription.iptrunk.iptrunk_ipv6_network)
......@@ -97,6 +99,14 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
return validate_tt_number(tt_number)
initial_user_input = yield ModifyIptrunkForm
class VerifyMinimumLinksForm(FormPage):
info_label: Label = (
f"This is the calculated minimum-links for this LAG: " f"{initial_user_input.iptrunk_number_of_members - 1}" # type: ignore[assignment]
)
info_label2: Label = "Please confirm or modify." # type: ignore[assignment]
yield VerifyMinimumLinksForm
ae_members_side_a = initialize_ae_members(subscription, initial_user_input.dict(), 0)
class ModifyIptrunkSideAForm(FormPage):
......@@ -158,7 +168,7 @@ def modify_iptrunk_subscription(
iptrunk_type: IptrunkType,
iptrunk_description: str,
iptrunk_speed: PhysicalPortCapacity,
iptrunk_minimum_links: int,
iptrunk_number_of_members: int,
side_a_ae_geant_a_sid: str | None,
side_a_ae_members: list[dict],
side_b_ae_geant_a_sid: str | None,
......@@ -187,7 +197,7 @@ def modify_iptrunk_subscription(
subscription.iptrunk.iptrunk_description = iptrunk_description
subscription.iptrunk.iptrunk_type = iptrunk_type
subscription.iptrunk.iptrunk_speed = iptrunk_speed
subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links
subscription.iptrunk.iptrunk_minimum_links = iptrunk_number_of_members - 1
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid = side_a_ae_geant_a_sid
# Flush the old list of member interfaces
......
......@@ -52,12 +52,12 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r
# Set side b router to Juniper
if vendor == Vendor.JUNIPER:
router_side_b = juniper_router_subscription_factory()
side_b_members = faker.link_members_juniper()
side_b_members = faker.link_members_juniper()[0:2]
else:
router_side_b = nokia_router_subscription_factory()
side_b_members = [
LAGMember(interface_name=f"Interface{interface}", interface_description=faker.sentence())
for interface in range(5)
for interface in range(2)
]
create_ip_trunk_step = {
......@@ -66,8 +66,9 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r
"iptrunk_type": IptrunkType.DARK_FIBER,
"iptrunk_description": faker.sentence(),
"iptrunk_speed": PhysicalPortCapacity.HUNDRED_GIGABIT_PER_SECOND,
"iptrunk_minimum_links": 2,
"iptrunk_number_of_members": 2,
}
create_ip_trunk_confirm_step = {}
create_ip_trunk_side_a_router_name = {"side_a_node_id": router_side_a}
create_ip_trunk_side_a_step = {
"side_a_ae_iface": "lag-1",
......@@ -77,7 +78,7 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r
interface_name=f"Interface{interface}",
interface_description=faker.sentence(),
)
for interface in range(5)
for interface in range(2)
],
}
create_ip_trunk_side_b_router_name = {"side_b_node_id": router_side_b}
......@@ -89,6 +90,7 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r
return [
create_ip_trunk_step,
create_ip_trunk_confirm_step,
create_ip_trunk_side_a_router_name,
create_ip_trunk_side_a_step,
create_ip_trunk_side_b_router_name,
......
......@@ -29,26 +29,26 @@ def input_form_iptrunk_data(
side_node = juniper_router_subscription_factory()
side_a_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node)
side_b_node = iptrunk_side_subscription_factory()
new_side_a_ae_members = faker.link_members_juniper()
new_side_b_ae_members = faker.link_members_nokia()
new_side_a_ae_members = faker.link_members_juniper()[0:2]
new_side_b_ae_members = faker.link_members_nokia()[0:2]
elif use_juniper == UseJuniperSide.SIDE_B:
side_node = juniper_router_subscription_factory()
side_a_node = iptrunk_side_subscription_factory()
side_b_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node)
new_side_a_ae_members = faker.link_members_nokia()
new_side_b_ae_members = faker.link_members_juniper()
new_side_a_ae_members = faker.link_members_nokia()[0:2]
new_side_b_ae_members = faker.link_members_juniper()[0:2]
elif use_juniper == UseJuniperSide.SIDE_BOTH:
side_node_1 = juniper_router_subscription_factory()
side_node_2 = juniper_router_subscription_factory()
side_a_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node_1)
side_b_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node_2)
new_side_a_ae_members = faker.link_members_juniper()
new_side_b_ae_members = faker.link_members_juniper()
new_side_a_ae_members = faker.link_members_juniper()[0:2]
new_side_b_ae_members = faker.link_members_juniper()[0:2]
else:
side_a_node = iptrunk_side_subscription_factory()
side_b_node = iptrunk_side_subscription_factory()
new_side_a_ae_members = faker.link_members_nokia()
new_side_b_ae_members = faker.link_members_nokia()
new_side_a_ae_members = faker.link_members_nokia()[0:2]
new_side_b_ae_members = faker.link_members_nokia()[0:2]
product_id = iptrunk_subscription_factory(iptrunk_sides=[side_a_node, side_b_node])
......@@ -70,8 +70,9 @@ def input_form_iptrunk_data(
"iptrunk_description": new_description,
"iptrunk_type": new_type,
"iptrunk_speed": new_speed,
"iptrunk_minimum_links": new_link_count,
"iptrunk_number_of_members": new_link_count,
},
{},
{
"side_a_ae_geant_a_sid": new_side_a_sid,
"side_a_ae_members": new_side_a_ae_members,
......@@ -133,10 +134,10 @@ def test_iptrunk_modify_trunk_interface_success(
assert mock_provision_ip_trunk.call_count == 2
# Assert all Netbox calls have been made
new_sid = input_form_iptrunk_data[1]["geant_s_sid"]
new_side_a_sid = input_form_iptrunk_data[2]["side_a_ae_geant_a_sid"]
new_side_a_ae_members = input_form_iptrunk_data[2]["side_a_ae_members"]
new_side_b_sid = input_form_iptrunk_data[3]["side_b_ae_geant_a_sid"]
new_side_b_ae_members = input_form_iptrunk_data[3]["side_b_ae_members"]
new_side_a_sid = input_form_iptrunk_data[3]["side_a_ae_geant_a_sid"]
new_side_a_ae_members = input_form_iptrunk_data[3]["side_a_ae_members"]
new_side_b_sid = input_form_iptrunk_data[4]["side_b_ae_geant_a_sid"]
new_side_b_ae_members = input_form_iptrunk_data[4]["side_b_ae_members"]
# Only Nokia interfaces are checked
vendor_side_a = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.vendor
......@@ -162,7 +163,7 @@ def test_iptrunk_modify_trunk_interface_success(
assert subscription.iptrunk.iptrunk_description == input_form_iptrunk_data[1]["iptrunk_description"]
assert subscription.iptrunk.iptrunk_type == input_form_iptrunk_data[1]["iptrunk_type"]
assert subscription.iptrunk.iptrunk_speed == input_form_iptrunk_data[1]["iptrunk_speed"]
assert subscription.iptrunk.iptrunk_minimum_links == input_form_iptrunk_data[1]["iptrunk_minimum_links"]
assert subscription.iptrunk.iptrunk_minimum_links == input_form_iptrunk_data[1]["iptrunk_number_of_members"] - 1
assert subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid == new_side_a_sid
def _find_interface_by_name(interfaces: list[dict[str, str]], name: str):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment