diff --git a/gso/cli/imports.py b/gso/cli/imports.py index 27dae014c18fe9a0f1b59f686f5721d4509fb679..6973b49626868bec88b95645576e721e2c58ff7e 100644 --- a/gso/cli/imports.py +++ b/gso/cli/imports.py @@ -90,7 +90,7 @@ class IptrunkImportModel(BaseModel): partner: str geant_s_sid: str | None iptrunk_type: IptrunkType - iptrunk_description: str + iptrunk_description: str | None iptrunk_speed: PhysicalPortCapacity iptrunk_minimum_links: int iptrunk_isis_metric: int diff --git a/gso/products/product_blocks/iptrunk.py b/gso/products/product_blocks/iptrunk.py index dd65242b30b9e6277699921df1403a8230d6de17..f2c6cea63786a206b4ed03ed74543622617a7f62 100644 --- a/gso/products/product_blocks/iptrunk.py +++ b/gso/products/product_blocks/iptrunk.py @@ -141,7 +141,7 @@ class IptrunkBlock(IptrunkBlockProvisioning, lifecycle=[SubscriptionLifecycle.AC #: GÉANT service ID associated with this trunk. geant_s_sid: str | None = None #: A human-readable description of this trunk. - iptrunk_description: str + iptrunk_description: str | None = None #: The type of trunk, can be either dark fibre or leased capacity. iptrunk_type: IptrunkType #: The speed of the trunk, measured per interface associated with it. diff --git a/gso/products/product_blocks/pop_vlan.py b/gso/products/product_blocks/pop_vlan.py index eb54241e4e727bb6c23ea2aa024fbc556b1e7a2e..191e7255951f24f9514a592989546774d17f2185 100644 --- a/gso/products/product_blocks/pop_vlan.py +++ b/gso/products/product_blocks/pop_vlan.py @@ -75,7 +75,7 @@ class PopVlanBlockProvisioning(PopVlanBlockInactive, lifecycle=[SubscriptionLife """A Pop VLAN that's currently being provisioned, see :class:`PopVlanBlock`.""" vlan_id: int - pop_vlan_description: str | None + pop_vlan_description: str | None = None lan_switch_interconnect: LanSwitchInterconnectBlockProvisioning ports: PortList[PopVlanPortBlockProvisioning] layer_preference: LayerPreference diff --git a/gso/products/product_blocks/switch.py b/gso/products/product_blocks/switch.py index 660cfd81320fc0739713a649a780b20265871d11..f0aa0414e11409b58341fc2648f3066fa91c5aee 100644 --- a/gso/products/product_blocks/switch.py +++ b/gso/products/product_blocks/switch.py @@ -27,8 +27,8 @@ class SwitchBlockInactive( switch_hostname: str | None = None switch_ts_port: PortNumber | None = None - switch_site: SiteBlockInactive | None - switch_vendor: Vendor | None + switch_site: SiteBlockInactive | None = None + switch_vendor: Vendor | None = None switch_model: SwitchModel | None = None diff --git a/gso/settings.py b/gso/settings.py index 641854e4a699915a4522559933705fe03c6c8193..4c653798e543db84891370eb5f8de7913e6efad0 100644 --- a/gso/settings.py +++ b/gso/settings.py @@ -121,7 +121,7 @@ class SNMPParams(BaseSettings): v2c: MonitoringSNMPV2Params #: .. versionadded :: 2.0 #: Support for :term:`SNMP` v3 will get added in a later version of :term:`GSO`. Parameters are optional for now. - v3: MonitoringSNMPV3Params | None + v3: MonitoringSNMPV3Params | None = None class MonitoringParams(BaseSettings): @@ -136,6 +136,9 @@ class ProvisioningProxyParams(BaseSettings): scheme: str api_base: str + #: .. deprecated:: 0.1 + #: Not used anymore, may be left out from config file. + auth: str | None = None api_version: int diff --git a/gso/utils/helpers.py b/gso/utils/helpers.py index b7fe52ac0dccccbaabdf9e49b0a82fa36ba82c32..f7ca91dd0428aa88a0ca79737d7842465d6dcaf0 100644 --- a/gso/utils/helpers.py +++ b/gso/utils/helpers.py @@ -24,7 +24,7 @@ class LAGMember(BaseModel): """A :term:`LAG` member interface that consists of a name and description.""" interface_name: str - interface_description: str | None + interface_description: str | None = None def __hash__(self) -> int: """Calculate the hash based on the interface name and description, so that uniqueness can be determined.""" diff --git a/gso/workflows/iptrunk/create_imported_iptrunk.py b/gso/workflows/iptrunk/create_imported_iptrunk.py index 5087209cb1697f0abc77de0a9e495f09815cd26d..bd2ea9876dfd943ea089257be71f41dd7985ec51 100644 --- a/gso/workflows/iptrunk/create_imported_iptrunk.py +++ b/gso/workflows/iptrunk/create_imported_iptrunk.py @@ -44,8 +44,8 @@ def initial_input_form_generator() -> FormGenerator: model_config = ConfigDict(title="Import Iptrunk") partner: str - geant_s_sid: str | None - iptrunk_description: str + geant_s_sid: str | None = None + iptrunk_description: str | None = None iptrunk_type: IptrunkType iptrunk_speed: PhysicalPortCapacity iptrunk_minimum_links: int @@ -53,12 +53,12 @@ def initial_input_form_generator() -> FormGenerator: side_a_node_id: router_enum # type: ignore[valid-type] side_a_ae_iface: str - side_a_ae_geant_a_sid: str | None + side_a_ae_geant_a_sid: str | None = None side_a_ae_members: LAGMemberList side_b_node_id: router_enum # type: ignore[valid-type] side_b_ae_iface: str - side_b_ae_geant_a_sid: str | None + side_b_ae_geant_a_sid: str | None = None side_b_ae_members: LAGMemberList iptrunk_ipv4_network: ipaddress.IPv4Network @@ -123,8 +123,11 @@ def initialize_subscription( subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members.append( IptrunkInterfaceBlockInactive.new(subscription_id=uuid4(), **member), ) - - subscription.description = f"IP trunk, geant_s_sid:{geant_s_sid}" + side_names = sorted([ + subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_site.site_name, + subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_site.site_name, + ]) + subscription.description = f"IP trunk {side_names[0]} {side_names[1]}, geant_s_sid:{geant_s_sid}" return {"subscription": subscription} diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py index 99e9f24879ea22c2261ac0fe369859269994710e..b1fc64c564e4b364d68bb667bfca1d43e0a66724 100644 --- a/gso/workflows/iptrunk/create_iptrunk.py +++ b/gso/workflows/iptrunk/create_iptrunk.py @@ -58,8 +58,8 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: tt_number: str partner: ReadOnlyField("GEANT", default_type=str) # type: ignore[valid-type] - geant_s_sid: str | None - iptrunk_description: str + geant_s_sid: str | None = None + iptrunk_description: str | None = None iptrunk_type: IptrunkType iptrunk_speed: PhysicalPortCapacity iptrunk_number_of_members: int @@ -74,9 +74,10 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: info_label: Label = ( f"This is the calculated minimum-links for this LAG: " f"{initial_user_input.iptrunk_number_of_members - 1}" ) + iptrunk_minimum_links: int = initial_user_input.iptrunk_number_of_members - 1 info_label2: Label = "Please confirm or modify." - yield VerifyMinimumLinksForm + verify_minimum_links = yield VerifyMinimumLinksForm router_enum_a = Choice("Select a router", zip(routers.keys(), routers.items(), strict=True)) # type: ignore[arg-type] class SelectRouterSideA(FormPage): @@ -188,6 +189,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: return ( initial_user_input.dict() + | verify_minimum_links.dict() | user_input_router_side_a.dict() | user_input_side_a.dict() | user_input_router_side_b.dict() @@ -226,9 +228,9 @@ def initialize_subscription( subscription: IptrunkInactive, geant_s_sid: str | None, iptrunk_type: IptrunkType, - iptrunk_description: str, + iptrunk_description: str | None, iptrunk_speed: PhysicalPortCapacity, - iptrunk_number_of_members: int, + iptrunk_minimum_links: int, side_a_node_id: str, side_a_ae_iface: str, side_a_ae_geant_a_sid: str | None, @@ -247,7 +249,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_number_of_members - 1 + subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node = side_a subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface = side_a_ae_iface diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py index 234a9dfc22f5f8ca56e70022eba234517ef6a861..92f71d6df5d7c8dde4f34fdb04925857f27e7512 100644 --- a/gso/workflows/iptrunk/modify_trunk_interface.py +++ b/gso/workflows/iptrunk/modify_trunk_interface.py @@ -84,7 +84,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class ModifyIptrunkForm(FormPage): tt_number: str geant_s_sid: str | None = subscription.iptrunk.geant_s_sid - iptrunk_description: str = subscription.iptrunk.iptrunk_description + iptrunk_description: str | None = subscription.iptrunk.iptrunk_description iptrunk_type: IptrunkType = subscription.iptrunk.iptrunk_type warning_label: Label = ( "Changing the PhyPortCapacity will result in the deletion of all AE members. " @@ -110,9 +110,10 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: info_label: Label = ( f"This is the calculated minimum-links for this LAG: " f"{initial_user_input.iptrunk_number_of_members - 1}" ) + iptrunk_minimum_links: int = initial_user_input.iptrunk_number_of_members - 1 info_label2: Label = "Please confirm or modify." - yield VerifyMinimumLinksForm + verify_minimum_links = yield VerifyMinimumLinksForm ae_members_side_a = initialize_ae_members(subscription, initial_user_input.dict(), 0) class ModifyIptrunkSideAForm(FormPage): @@ -166,7 +167,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: user_input_side_b = yield ModifyIptrunkSideBForm - return initial_user_input.dict() | user_input_side_a.dict() | user_input_side_b.dict() + return initial_user_input.dict() | user_input_side_a.dict() | user_input_side_b.dict() | verify_minimum_links.dict() @step("Update subscription") @@ -174,9 +175,9 @@ def modify_iptrunk_subscription( subscription: Iptrunk, geant_s_sid: str | None, iptrunk_type: IptrunkType, - iptrunk_description: str, + iptrunk_description: str | None, iptrunk_speed: PhysicalPortCapacity, - iptrunk_number_of_members: int, + iptrunk_minimum_links: int, side_a_ae_geant_a_sid: str | None, side_a_ae_members: list[dict], side_b_ae_geant_a_sid: str | None, @@ -205,7 +206,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_number_of_members - 1 + 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 @@ -223,7 +224,11 @@ def modify_iptrunk_subscription( IptrunkInterfaceBlock.new(subscription_id=uuid4(), **member), ) - subscription.description = f"IP trunk, geant_s_sid:{geant_s_sid}" + side_names = sorted([ + subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_site.site_name, + subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_site.site_name, + ]) + subscription.description = f"IP trunk {side_names[0]} {side_names[1]}, geant_s_sid:{geant_s_sid}" return { "subscription": subscription, diff --git a/test/workflows/iptrunk/test_create_iptrunk.py b/test/workflows/iptrunk/test_create_iptrunk.py index 84039f326f35de5ef08591fb07d686b03bc8d35a..35afaf9b3eb5e669a641989027d1a4d47c35e273 100644 --- a/test/workflows/iptrunk/test_create_iptrunk.py +++ b/test/workflows/iptrunk/test_create_iptrunk.py @@ -67,7 +67,7 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r "iptrunk_speed": PhysicalPortCapacity.HUNDRED_GIGABIT_PER_SECOND, "iptrunk_number_of_members": 2, } - create_ip_trunk_confirm_step = {} + create_ip_trunk_confirm_step = {"iptrunk_minimum_links": 1} 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", diff --git a/test/workflows/iptrunk/test_modify_trunk_interface.py b/test/workflows/iptrunk/test_modify_trunk_interface.py index 18524cfd70ba8a61a12db319ff4cd1af921c64fe..2a95cc90fc6428dd19c7e9a2b0a0f77a58ef3a2b 100644 --- a/test/workflows/iptrunk/test_modify_trunk_interface.py +++ b/test/workflows/iptrunk/test_modify_trunk_interface.py @@ -158,7 +158,11 @@ def test_iptrunk_modify_trunk_interface_success( assert mocked_detach_interfaces_from_lag.call_count == num_lag_ifaces # 1 time per nokia side # Assert all subscription properties have been updated correctly - assert subscription.description == f"IP trunk, geant_s_sid:{new_sid}" + side_names = sorted([ + subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_site.site_name, + subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_site.site_name, + ]) + assert subscription.description == f"IP trunk {side_names[0]} {side_names[1]}, geant_s_sid:{new_sid}" assert subscription.iptrunk.geant_s_sid == input_form_iptrunk_data[1]["geant_s_sid"] assert subscription.iptrunk.iptrunk_description == input_form_iptrunk_data[1]["iptrunk_description"] assert subscription.iptrunk.iptrunk_type == input_form_iptrunk_data[1]["iptrunk_type"]