diff --git a/gso/api/v1/imports.py b/gso/api/v1/imports.py index de08184fb0d3a6cfbc29ff6228fc5b921593f6b8..044dce8352c9b82f06f8c4c9a98fc896c927cf02 100644 --- a/gso/api/v1/imports.py +++ b/gso/api/v1/imports.py @@ -15,7 +15,7 @@ from gso.products.product_blocks.router import RouterRole from gso.services import subscriptions from gso.services.partners import PartnerNotFoundError, get_partner_by_name from gso.utils.helpers import BaseSiteValidatorModel, LAGMember -from gso.utils.shared_enums import IPV4AddressType, IPV6AddressType, PortNumber, Vendor +from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType, PortNumber, Vendor router = APIRouter(prefix="/imports", tags=["Imports"], dependencies=[Depends(opa_security_default)]) @@ -42,8 +42,8 @@ class RouterImportModel(BaseModel): ts_port: int router_vendor: Vendor router_role: RouterRole - router_lo_ipv4_address: IPV4AddressType - router_lo_ipv6_address: IPV6AddressType + router_lo_ipv4_address: IPv4AddressType + router_lo_ipv6_address: IPv6AddressType router_lo_iso_address: str @@ -129,7 +129,7 @@ class SuperPopSwitchImportModel(BaseModel): super_pop_switch_site: str hostname: str super_pop_switch_ts_port: PortNumber - super_pop_switch_mgmt_ipv4_address: IPV4AddressType + super_pop_switch_mgmt_ipv4_address: IPv4AddressType class OfficeRouterImportModel(BaseModel): @@ -139,8 +139,8 @@ class OfficeRouterImportModel(BaseModel): office_router_site: str office_router_fqdn: str office_router_ts_port: PortNumber - office_router_lo_ipv4_address: IPV4AddressType - office_router_lo_ipv6_address: IPV6AddressType + office_router_lo_ipv4_address: IPv4AddressType + office_router_lo_ipv6_address: IPv6AddressType def _start_process(process_name: str, data: dict) -> UUID: diff --git a/gso/monkeypatches.py b/gso/monkeypatches.py index b5c73b558b8eed81297c36f02909e5f316ceff5f..2e94f50bdd27288e4ce7d829036ffbc8f022ef20 100644 --- a/gso/monkeypatches.py +++ b/gso/monkeypatches.py @@ -4,12 +4,8 @@ This adjustment is typically done to extend or modify the functionality of the o oauth2_lib package to meet specific requirements of the gso application. """ -from datetime import datetime -from ipaddress import IPv4Address, IPv6Address - import oauth2_lib.fastapi import oauth2_lib.settings -from pydantic import BaseModel from gso.auth.oidc_policy_helper import HTTPX_SSL_CONTEXT, OIDCUser, OIDCUserModel, opa_decision from gso.auth.settings import oauth2lib_settings diff --git a/gso/products/product_blocks/iptrunk.py b/gso/products/product_blocks/iptrunk.py index de68b83ba5feb8dd33c06dfa791ab07a6ff3ccb8..2d12b9c55924844338ce68d2af0a4a975e7b7c89 100644 --- a/gso/products/product_blocks/iptrunk.py +++ b/gso/products/product_blocks/iptrunk.py @@ -1,7 +1,7 @@ """IP trunk product block that has all parameters of a subscription throughout its lifecycle.""" import ipaddress -from typing import Annotated, Sequence, TypeVar, Generic +from typing import Annotated from annotated_types import Len from orchestrator.domain.base import ProductBlockModel, T diff --git a/gso/products/product_blocks/lan_switch_interconnect.py b/gso/products/product_blocks/lan_switch_interconnect.py index 55a7b97a3ca788dbe3e61f5ddd9c8a5344e5976f..a9b1c77366662e24499f936f9762d515b882b934 100644 --- a/gso/products/product_blocks/lan_switch_interconnect.py +++ b/gso/products/product_blocks/lan_switch_interconnect.py @@ -63,7 +63,7 @@ class LanSwitchInterconnectRouterSideBlockProvisioning( node: RouterBlockProvisioning ae_iface: str | None = None - ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning] + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning] # type: ignore[assignment] class LanSwitchInterconnectRouterSideBlock( @@ -73,7 +73,7 @@ class LanSwitchInterconnectRouterSideBlock( node: RouterBlock ae_iface: str - ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock] + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock] # type: ignore[assignment] class LanSwitchInterconnectSwitchSideBlockInactive( @@ -95,7 +95,7 @@ class LanSwitchInterconnectSwitchSideBlockProvisioning( node: SwitchBlockProvisioning ae_iface: str | None = None - ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning] + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlockProvisioning] # type: ignore[assignment] class LanSwitchInterconnectSwitchSideBlock( @@ -105,7 +105,7 @@ class LanSwitchInterconnectSwitchSideBlock( node: SwitchBlock ae_iface: str - ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock] + ae_members: LAGMemberList[LanSwitchInterconnectInterfaceBlock] # type: ignore[assignment] class LanSwitchInterconnectBlockInactive( diff --git a/gso/products/product_blocks/office_router.py b/gso/products/product_blocks/office_router.py index d5bcf1a3b4644a869fb1383a6ad1fd46dad8a5b3..65eab0256a073c699f3ea2ef84d96e3352096722 100644 --- a/gso/products/product_blocks/office_router.py +++ b/gso/products/product_blocks/office_router.py @@ -8,7 +8,7 @@ from gso.products.product_blocks.site import ( SiteBlockInactive, SiteBlockProvisioning, ) -from gso.utils.shared_enums import IPV4AddressType, IPV6AddressType, PortNumber, Vendor +from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType, PortNumber, Vendor class OfficeRouterBlockInactive( @@ -20,8 +20,8 @@ class OfficeRouterBlockInactive( office_router_fqdn: str | None = None office_router_ts_port: PortNumber | None = None - office_router_lo_ipv4_address: IPV4AddressType | None = None - office_router_lo_ipv6_address: IPV6AddressType | None = None + office_router_lo_ipv4_address: IPv4AddressType | None = None + office_router_lo_ipv6_address: IPv6AddressType | None = None office_router_site: SiteBlockInactive | None vendor: Vendor | None = None @@ -31,8 +31,8 @@ class OfficeRouterBlockProvisioning(OfficeRouterBlockInactive, lifecycle=[Subscr office_router_fqdn: str | None = None office_router_ts_port: PortNumber | None = None - office_router_lo_ipv4_address: IPV4AddressType | None = None - office_router_lo_ipv6_address: IPV6AddressType | None = None + office_router_lo_ipv4_address: IPv4AddressType | None = None + office_router_lo_ipv6_address: IPv6AddressType | None = None office_router_site: SiteBlockProvisioning | None vendor: Vendor | None = None @@ -45,9 +45,9 @@ class OfficeRouterBlock(OfficeRouterBlockProvisioning, lifecycle=[SubscriptionLi #: The port of the terminal server that this office router is connected to. Used to offer out of band access. office_router_ts_port: PortNumber #: The IPv4 loopback address of the office router. - office_router_lo_ipv4_address: IPV4AddressType + office_router_lo_ipv4_address: IPv4AddressType #: The IPv6 loopback address of the office router. - office_router_lo_ipv6_address: IPV6AddressType + office_router_lo_ipv6_address: IPv6AddressType #: The :class:`Site` that this office router resides in. Both physically and computationally. office_router_site: SiteBlock #: The vendor of an office router. Defaults to Juniper. diff --git a/gso/products/product_blocks/pop_vlan.py b/gso/products/product_blocks/pop_vlan.py index e556ad1e9903772f7fb58a38a4047286595a1fb8..9942a97991ed4ea0e72f3ea2ad5f95b5fc580e83 100644 --- a/gso/products/product_blocks/pop_vlan.py +++ b/gso/products/product_blocks/pop_vlan.py @@ -1,7 +1,7 @@ """Pop VLAN product block that has all parameters of a subscription throughout its lifecycle.""" from ipaddress import IPv4Network, IPv6Network -from typing import TypeVar, Annotated +from typing import Annotated, TypeVar from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle @@ -92,7 +92,7 @@ class PopVlanBlock(PopVlanBlockProvisioning, lifecycle=[SubscriptionLifecycle.AC #: The LAN Switch Interconnect that this Pop VLAN is connected to. lan_switch_interconnect: LanSwitchInterconnectBlock #: The ports of the Pop VLAN. - ports: PortList[PopVlanPortBlock] + ports: PortList[PopVlanPortBlock] # type: ignore[assignment] #: The level of the layer preference for the Pop VLAN (L2 or L3). layer_preference: LayerPreference #: IPv4 network for the Pop VLAN if layer preference is L3. diff --git a/gso/products/product_blocks/router.py b/gso/products/product_blocks/router.py index 85e940a015ceae354efb269569dc3fb8b1539abe..17deeccb1ac8a5ee9bcfaa14fa25f27360881e7c 100644 --- a/gso/products/product_blocks/router.py +++ b/gso/products/product_blocks/router.py @@ -8,7 +8,7 @@ from gso.products.product_blocks.site import ( SiteBlockInactive, SiteBlockProvisioning, ) -from gso.utils.shared_enums import IPV4AddressType, IPV6AddressType, PortNumber, Vendor +from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType, PortNumber, Vendor class RouterRole(strEnum): @@ -29,8 +29,8 @@ class RouterBlockInactive( router_fqdn: str | None = None router_ts_port: PortNumber | None = None router_access_via_ts: bool | None = None - router_lo_ipv4_address: IPV4AddressType | None = None - router_lo_ipv6_address: IPV6AddressType | None = None + router_lo_ipv4_address: IPv4AddressType | None = None + router_lo_ipv6_address: IPv6AddressType | None = None router_lo_iso_address: str | None = None router_role: RouterRole | None = None router_site: SiteBlockInactive | None @@ -43,8 +43,8 @@ class RouterBlockProvisioning(RouterBlockInactive, lifecycle=[SubscriptionLifecy router_fqdn: str router_ts_port: PortNumber router_access_via_ts: bool - router_lo_ipv4_address: IPV4AddressType - router_lo_ipv6_address: IPV6AddressType + router_lo_ipv4_address: IPv4AddressType + router_lo_ipv6_address: IPv6AddressType router_lo_iso_address: str router_role: RouterRole router_site: SiteBlockProvisioning @@ -61,9 +61,9 @@ class RouterBlock(RouterBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTI #: Whether this router should be accessed through the terminal server, or through its loopback address. router_access_via_ts: bool #: The IPv4 loopback address of the router. - router_lo_ipv4_address: IPV4AddressType + router_lo_ipv4_address: IPv4AddressType #: The IPv6 loopback address of the router. - router_lo_ipv6_address: IPV6AddressType + router_lo_ipv6_address: IPv6AddressType #: The :term:`ISO` :term:`NET` of the router, used for :term:`ISIS` support. router_lo_iso_address: str #: The role of the router, which can be any of the values defined in :class:`RouterRole`. diff --git a/gso/products/product_blocks/site.py b/gso/products/product_blocks/site.py index 1f108a410fe3a39ae8c81eb653ce8ce39db842d3..51a7e168979ba2e6d4df241c221b9f111b5e7a98 100644 --- a/gso/products/product_blocks/site.py +++ b/gso/products/product_blocks/site.py @@ -1,7 +1,7 @@ """The product block that describes a site subscription.""" import re -from typing import Annotated, TypeAlias +from typing import Annotated from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle, strEnum diff --git a/gso/products/product_blocks/super_pop_switch.py b/gso/products/product_blocks/super_pop_switch.py index 1b4adafa3854b68277a6036969889d939548f030..3335b28cf90ee9d55abe59be528f404d44d905b8 100644 --- a/gso/products/product_blocks/super_pop_switch.py +++ b/gso/products/product_blocks/super_pop_switch.py @@ -8,7 +8,7 @@ from gso.products.product_blocks.site import ( SiteBlockInactive, SiteBlockProvisioning, ) -from gso.utils.shared_enums import IPV4AddressType, PortNumber, Vendor +from gso.utils.shared_enums import IPv4AddressType, PortNumber, Vendor class SuperPopSwitchBlockInactive( @@ -20,7 +20,7 @@ class SuperPopSwitchBlockInactive( super_pop_switch_fqdn: str | None = None super_pop_switch_ts_port: PortNumber | None = None - super_pop_switch_mgmt_ipv4_address: IPV4AddressType | None = None + super_pop_switch_mgmt_ipv4_address: IPv4AddressType | None = None super_pop_switch_site: SiteBlockInactive | None vendor: Vendor | None = None @@ -30,7 +30,7 @@ class SuperPopSwitchBlockProvisioning(SuperPopSwitchBlockInactive, lifecycle=[Su super_pop_switch_fqdn: str | None = None super_pop_switch_ts_port: PortNumber | None = None - super_pop_switch_mgmt_ipv4_address: IPV4AddressType | None = None + super_pop_switch_mgmt_ipv4_address: IPv4AddressType | None = None super_pop_switch_site: SiteBlockProvisioning | None vendor: Vendor | None = None @@ -43,7 +43,7 @@ class SuperPopSwitchBlock(SuperPopSwitchBlockProvisioning, lifecycle=[Subscripti #: The port of the terminal server that this Super PoP switch is connected to. Used to offer out of band access. super_pop_switch_ts_port: PortNumber #: The IPv4 management address of the Super PoP switch. - super_pop_switch_mgmt_ipv4_address: IPV4AddressType + super_pop_switch_mgmt_ipv4_address: IPv4AddressType #: The :class:`Site` that this Super PoP switch resides in. Both physically and computationally. super_pop_switch_site: SiteBlock #: The vendor of a Super PoP switch. Defaults to Juniper. diff --git a/gso/services/infoblox.py b/gso/services/infoblox.py index 1645773fe7063c682a5428a13fa58ed8950ef755..140b4c851b29b649a05243e9f12c44e729debc03 100644 --- a/gso/services/infoblox.py +++ b/gso/services/infoblox.py @@ -10,7 +10,7 @@ from infoblox_client.exceptions import ( ) from gso.settings import IPAMParams, load_oss_params -from gso.utils.shared_enums import IPV4AddressType, IPV6AddressType +from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType logger = getLogger(__name__) NULL_MAC = "00:00:00:00:00:00" @@ -234,8 +234,8 @@ def allocate_host( def create_host_by_ip( hostname: str, - ipv4_address: IPV4AddressType, - ipv6_address: IPV6AddressType, + ipv4_address: IPv4AddressType, + ipv6_address: IPv6AddressType, service_type: str, comment: str, ) -> None: @@ -269,7 +269,7 @@ def create_host_by_ip( new_host.update() -def find_host_by_ip(ip_addr: IPV4AddressType | ipaddress.IPv6Address) -> objects.HostRecord | None: +def find_host_by_ip(ip_addr: IPv4AddressType | ipaddress.IPv6Address) -> objects.HostRecord | None: """Find a host record in Infoblox by its associated IP address. :param ip_addr: The IP address of a host that is searched for. @@ -315,7 +315,7 @@ def find_v6_host_by_fqdn(fqdn: str) -> objects.HostRecordV6: ) -def delete_host_by_ip(ip_addr: IPV4AddressType | ipaddress.IPv6Address) -> None: +def delete_host_by_ip(ip_addr: IPv4AddressType | ipaddress.IPv6Address) -> None: """Delete a host from Infoblox. Delete a host record in Infoblox, by providing the IP address that is associated with the record. Raises a diff --git a/gso/services/lso_client.py b/gso/services/lso_client.py index f707cba2e4d251cf1ee7d7cc017c6cc534505edb..92898940edfdb7a2981156a1fd5e0f5c5a44f786 100644 --- a/gso/services/lso_client.py +++ b/gso/services/lso_client.py @@ -130,8 +130,8 @@ def _show_results(state: State) -> FormGenerator: if "lso_result_extra_label" in state: extra_label: Label = state["lso_result_extra_label"] - run_status: ReadOnlyField(state["callback_result"]["status"], default_type=str) # type: ignore[valid-type] - run_results: ReadOnlyField(json.dumps(state["callback_result"], indent=4), default_type=LongText) # type: ignore[valid-type] + run_status: ReadOnlyField(state["callback_result"]["status"], default_type=str) # type: ignore[valid-type] + run_results: ReadOnlyField(json.dumps(state["callback_result"], indent=4), default_type=LongText) # type: ignore[valid-type] yield ConfirmRunPage [state.pop(key, None) for key in ["run_results", "lso_result_title", "lso_result_extra_label"]] diff --git a/gso/utils/helpers.py b/gso/utils/helpers.py index a0c71bb413dd430d30cf5171827847bd1f60fd1a..1daa2d81a1f0c66debfca6bc4fc35fefa33192bb 100644 --- a/gso/utils/helpers.py +++ b/gso/utils/helpers.py @@ -16,7 +16,7 @@ from gso.products.product_blocks.site import LatitudeCoordinate, LongitudeCoordi from gso.products.product_types.router import Router from gso.services.netbox_client import NetboxClient from gso.services.subscriptions import get_active_subscriptions_by_field_and_value -from gso.utils.shared_enums import IPV4AddressType, Vendor +from gso.utils.shared_enums import IPv4AddressType, Vendor class LAGMember(BaseModel): @@ -105,7 +105,7 @@ def get_router_vendor(router_id: UUID) -> Vendor: return Router.from_subscription(router_id).router.vendor -def iso_from_ipv4(ipv4_address: IPV4AddressType) -> str: +def iso_from_ipv4(ipv4_address: IPv4AddressType) -> str: """Calculate an :term:`ISO` address, based on an IPv4 address. :param IPv4Address ipv4_address: The address that's to be converted diff --git a/gso/utils/shared_enums.py b/gso/utils/shared_enums.py index 86865ba70b9612be6595304d93e23a1006dee941..5ca0657b5e8509ac0604014329e7ddececd66788 100644 --- a/gso/utils/shared_enums.py +++ b/gso/utils/shared_enums.py @@ -27,11 +27,11 @@ PortNumber = Annotated[ ] -IPV4AddressType = Annotated[ +IPv4AddressType = Annotated[ ipaddress.IPv4Address, PlainSerializer(lambda ip: str(ip), return_type=str, when_used="always") ] -IPV6AddressType = Annotated[ +IPv6AddressType = Annotated[ ipaddress.IPv6Address, PlainSerializer(lambda ip: str(ip), return_type=str, when_used="always") ] diff --git a/gso/workflows/__init__.py b/gso/workflows/__init__.py index 1e89ec894bf9b3029484db458b6ea19e592c6c55..8fe29e3cc372a439befaa176c09f420b5fc7254d 100644 --- a/gso/workflows/__init__.py +++ b/gso/workflows/__init__.py @@ -10,19 +10,17 @@ ALL_ALIVE_STATES: list[str] = [ SubscriptionLifecycle.ACTIVE, ] -WF_USABLE_MAP.update( - { - "redeploy_base_config": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], - "update_ibgp_mesh": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], - "activate_router": [SubscriptionLifecycle.PROVISIONING], - "deploy_twamp": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], - "modify_trunk_interface": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], - "activate_iptrunk": [SubscriptionLifecycle.PROVISIONING], - "terminate_site": ALL_ALIVE_STATES, - "terminate_router": ALL_ALIVE_STATES, - "terminate_iptrunk": ALL_ALIVE_STATES, - } -) +WF_USABLE_MAP.update({ + "redeploy_base_config": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], + "update_ibgp_mesh": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], + "activate_router": [SubscriptionLifecycle.PROVISIONING], + "deploy_twamp": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], + "modify_trunk_interface": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], + "activate_iptrunk": [SubscriptionLifecycle.PROVISIONING], + "terminate_site": ALL_ALIVE_STATES, + "terminate_router": ALL_ALIVE_STATES, + "terminate_iptrunk": ALL_ALIVE_STATES, +}) LazyWorkflowInstance("gso.workflows.iptrunk.activate_iptrunk", "activate_iptrunk") LazyWorkflowInstance("gso.workflows.iptrunk.create_iptrunk", "create_iptrunk") diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py index 71f5453bb196c7d79ad67ea1ca0fe5fc97b656f4..99e9f24879ea22c2261ac0fe369859269994710e 100644 --- a/gso/workflows/iptrunk/create_iptrunk.py +++ b/gso/workflows/iptrunk/create_iptrunk.py @@ -1,7 +1,7 @@ """A creation workflow that deploys a new IP trunk service.""" import json -from typing import Annotated, TypeAlias +from typing import Annotated from uuid import uuid4 from annotated_types import Len @@ -57,7 +57,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: model_config = ConfigDict(title=product_name) tt_number: str - partner: ReadOnlyField("GEANT", default_type=str) # type: ignore[valid-type] + partner: ReadOnlyField("GEANT", default_type=str) # type: ignore[valid-type] geant_s_sid: str | None iptrunk_description: str iptrunk_type: IptrunkType @@ -72,9 +72,9 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: 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] + f"This is the calculated minimum-links for this LAG: " f"{initial_user_input.iptrunk_number_of_members - 1}" ) - info_label2: Label = "Please confirm or modify." # type: ignore[assignment] + info_label2: Label = "Please confirm or modify." yield VerifyMinimumLinksForm router_enum_a = Choice("Select a router", zip(routers.keys(), routers.items(), strict=True)) # type: ignore[arg-type] @@ -92,7 +92,14 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: router_a = user_input_router_side_a.side_a_node_id.name router_a_fqdn = Router.from_subscription(router_a).router.router_fqdn - JuniperAeMembers = Annotated[list[LAGMember], AfterValidator(validate_unique_list), Len(min_length=initial_user_input.iptrunk_number_of_members, max_length=initial_user_input.iptrunk_number_of_members)] + juniper_ae_members = Annotated[ + list[LAGMember], + AfterValidator(validate_unique_list), + Len( + min_length=initial_user_input.iptrunk_number_of_members, + max_length=initial_user_input.iptrunk_number_of_members, + ), + ] if get_router_vendor(router_a) == Vendor.NOKIA: @@ -102,16 +109,23 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: initial_user_input.iptrunk_speed, ) - ae_members_side_a = Annotated[list[NokiaLAGMemberA], AfterValidator(validate_unique_list), Len(min_length=initial_user_input.iptrunk_number_of_members, max_length=initial_user_input.iptrunk_number_of_members)] + ae_members_side_a_type = Annotated[ + list[NokiaLAGMemberA], + AfterValidator(validate_unique_list), + Len( + min_length=initial_user_input.iptrunk_number_of_members, + max_length=initial_user_input.iptrunk_number_of_members, + ), + ] else: - ae_members_side_a_type = JuniperAeMembers # type: ignore[assignment] + ae_members_side_a_type = juniper_ae_members # type: ignore[assignment, misc] class CreateIptrunkSideAForm(FormPage): model_config = ConfigDict(title=f"Provide subscription details for side A of the trunk.({router_a_fqdn})") side_a_ae_iface: available_lags_choices(router_a) or str # type: ignore[valid-type] side_a_ae_geant_a_sid: str | None - side_a_ae_members: ae_members_side_a # type: ignore[valid-type] + side_a_ae_members: ae_members_side_a_type @field_validator("side_a_ae_members") def validate_side_a_ae_members(cls, side_a_ae_members: list[LAGMember]) -> list[LAGMember]: @@ -154,14 +168,14 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ), ] else: - ae_members_side_b = JuniperAeMembers + ae_members_side_b = juniper_ae_members # type: ignore[assignment, misc] class CreateIptrunkSideBForm(FormPage): model_config = ConfigDict(title=f"Provide subscription details for side B of the trunk.({router_b_fqdn})") side_b_ae_iface: available_lags_choices(router_b) or str # type: ignore[valid-type] side_b_ae_geant_a_sid: str | None - side_b_ae_members: ae_members_side_b # type: ignore[valid-type] + side_b_ae_members: ae_members_side_b @field_validator("side_b_ae_members") def validate_side_b_ae_members(cls, side_b_ae_members: list[LAGMember]) -> list[LAGMember]: @@ -323,7 +337,7 @@ def check_ip_trunk_connectivity( execute_playbook( playbook_name="iptrunks_checks.yaml", callback_route=callback_route, - inventory=subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn, + inventory=subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn, # type: ignore[arg-type] extra_vars=extra_vars, ) @@ -397,7 +411,7 @@ def check_ip_trunk_isis( execute_playbook( playbook_name="iptrunks_checks.yaml", callback_route=callback_route, - inventory=subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn, + inventory=subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn, # type: ignore[arg-type] extra_vars=extra_vars, ) @@ -428,9 +442,9 @@ def reserve_interfaces_in_netbox(subscription: IptrunkInactive) -> State: if get_router_vendor(trunk_side.iptrunk_side_node.owner_subscription_id) == Vendor.NOKIA: # Create :term:`LAG` interfaces lag_interface: Interfaces = nbclient.create_interface( - iface_name=trunk_side.iptrunk_side_ae_iface, + iface_name=trunk_side.iptrunk_side_ae_iface, # type: ignore[arg-type] interface_type="lag", - device_name=trunk_side.iptrunk_side_node.router_fqdn, + device_name=trunk_side.iptrunk_side_node.router_fqdn, # type: ignore[arg-type] description=str(subscription.subscription_id), enabled=True, ) @@ -439,13 +453,13 @@ def reserve_interfaces_in_netbox(subscription: IptrunkInactive) -> State: # Reserve interfaces for interface in trunk_side.iptrunk_side_ae_members: nbclient.attach_interface_to_lag( - device_name=trunk_side.iptrunk_side_node.router_fqdn, + device_name=trunk_side.iptrunk_side_node.router_fqdn, # type: ignore[arg-type] lag_name=lag_interface.name, - iface_name=interface.interface_name, + iface_name=interface.interface_name, # type: ignore[arg-type] description=str(subscription.subscription_id), ) nbclient.reserve_interface( - device_name=trunk_side.iptrunk_side_node.router_fqdn, + device_name=trunk_side.iptrunk_side_node.router_fqdn, # type: ignore[arg-type] iface_name=interface.interface_name, # type: ignore[arg-type] ) return { @@ -485,7 +499,7 @@ def prompt_start_new_checklist(subscription: IptrunkProvisioning) -> FormGenerat model_config = ConfigDict(title="Start new checklist") info_label_1: Label = ( - f"Visit {oss_params.SHAREPOINT.checklist_site_url} and start a new Sharepoint checklist for an IPtrunk " + f"Visit {oss_params.SHAREPOINT.checklist_site_url} and start a new Sharepoint checklist for an IPtrunk " f"from {subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn} to " f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}." ) diff --git a/gso/workflows/iptrunk/migrate_iptrunk.py b/gso/workflows/iptrunk/migrate_iptrunk.py index 0a30e01079383504d659324e1e11ccfb793b1594..16dc3f74a1eec22146481872a7627ad0fede7d32 100644 --- a/gso/workflows/iptrunk/migrate_iptrunk.py +++ b/gso/workflows/iptrunk/migrate_iptrunk.py @@ -125,7 +125,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ), ] else: - ae_members = Annotated[ + ae_members = Annotated[ # type: ignore[assignment, misc] list[LAGMember], AfterValidator(validate_unique_list), Len( @@ -152,7 +152,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: model_config = ConfigDict(title=form_title) new_lag_interface: side_a_ae_iface # type: ignore[valid-type] - existing_lag_interface: ReadOnlyField(existing_lag_ae_members, default_type=list[LAGMember]) # type: ignore[valid-type] + existing_lag_interface: ReadOnlyField(existing_lag_ae_members, default_type=list[LAGMember]) # type: ignore[valid-type] new_lag_member_interfaces: ae_members @field_validator("new_lag_interface") diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py index 3395774c577957fcbf1bdfa5a08a9de6d23233ee..234a9dfc22f5f8ca56e70022eba234517ef6a861 100644 --- a/gso/workflows/iptrunk/modify_trunk_interface.py +++ b/gso/workflows/iptrunk/modify_trunk_interface.py @@ -1,7 +1,7 @@ """A modification workflow that updates the :term:`LAG` interfaces that are part of an existing IP trunk.""" import json -from typing import Annotated, TypeVar, Type, Any +from typing import Annotated, TypeVar from uuid import UUID, uuid4 from annotated_types import Len @@ -33,12 +33,14 @@ from gso.utils.helpers import ( validate_iptrunk_unique_interface, validate_tt_number, ) -from gso.utils.shared_enums import IPV4AddressType, IPV6AddressType, Vendor +from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType, Vendor -T = TypeVar('T', bound=LAGMember) +T = TypeVar("T", bound=LAGMember) -def initialize_ae_members(subscription: Iptrunk, initial_user_input: dict, side_index: int) -> type[list[Any]]: +def initialize_ae_members( + subscription: Iptrunk, initial_user_input: dict, side_index: int +) -> Annotated[list[LAGMember], ""]: """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) @@ -62,11 +64,17 @@ def initialize_ae_members(subscription: Iptrunk, initial_user_input: dict, side_ ) ) - ae_members = Annotated[list[NokiaLAGMember], AfterValidator(validate_unique_list), Len(min_length=iptrunk_number_of_members, max_length=iptrunk_number_of_members)] - else: + return Annotated[ + list[NokiaLAGMember], + AfterValidator(validate_unique_list), + Len(min_length=iptrunk_number_of_members, max_length=iptrunk_number_of_members), + ] # type: ignore[return-value] - ae_members = Annotated[list[LAGMember], AfterValidator(validate_unique_list), Len(min_length=iptrunk_number_of_members, max_length=iptrunk_number_of_members)] - return ae_members # type: ignore[return-value] + return Annotated[ + list[LAGMember], + AfterValidator(validate_unique_list), + Len(min_length=iptrunk_number_of_members, max_length=iptrunk_number_of_members), + ] # type: ignore[return-value] def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: @@ -84,9 +92,13 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ) iptrunk_speed: PhysicalPortCapacity = subscription.iptrunk.iptrunk_speed iptrunk_number_of_members: int = subscription.iptrunk.iptrunk_minimum_links + 1 - iptrunk_isis_metric: ReadOnlyField(subscription.iptrunk.iptrunk_isis_metric, default_type=int) - iptrunk_ipv4_network: ReadOnlyField(str(subscription.iptrunk.iptrunk_ipv4_network), default_type=IPV4AddressType) - iptrunk_ipv6_network: ReadOnlyField(str(subscription.iptrunk.iptrunk_ipv6_network), default_type=IPV6AddressType) + iptrunk_isis_metric: ReadOnlyField(subscription.iptrunk.iptrunk_isis_metric, default_type=int) # type: ignore[valid-type] + iptrunk_ipv4_network: ReadOnlyField( # type: ignore[valid-type] + str(subscription.iptrunk.iptrunk_ipv4_network), default_type=IPv4AddressType + ) + iptrunk_ipv6_network: ReadOnlyField( # type: ignore[valid-type] + str(subscription.iptrunk.iptrunk_ipv6_network), default_type=IPv6AddressType + ) @field_validator("tt_number") def validate_tt_number(cls, tt_number: str) -> str: @@ -96,9 +108,9 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: 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] + f"This is the calculated minimum-links for this LAG: " f"{initial_user_input.iptrunk_number_of_members - 1}" ) - info_label2: Label = "Please confirm or modify." # type: ignore[assignment] + info_label2: Label = "Please confirm or modify." yield VerifyMinimumLinksForm ae_members_side_a = initialize_ae_members(subscription, initial_user_input.dict(), 0) @@ -106,8 +118,10 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class ModifyIptrunkSideAForm(FormPage): model_config = ConfigDict(title="Provide subscription details for side A of the trunk.") - side_a_node: ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn, default_type=str) - side_a_ae_iface: ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface, default_type=str) + side_a_node: ReadOnlyField( # type: ignore[valid-type] + subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn, default_type=str + ) + side_a_ae_iface: ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface, default_type=str) # type: ignore[valid-type] side_a_ae_geant_a_sid: str | None = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid side_a_ae_members: ae_members_side_a = ( # type: ignore[valid-type] subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members @@ -130,8 +144,10 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class ModifyIptrunkSideBForm(FormPage): model_config = ConfigDict(title="Provide subscription details for side B of the trunk.") - side_b_node: ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn, default_type=str) - side_b_ae_iface: ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface, default_type=str) + side_b_node: ReadOnlyField( # type: ignore[valid-type] + subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn, default_type=str + ) + side_b_ae_iface: ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface, default_type=str) # type: ignore[valid-type] side_b_ae_geant_a_sid: str | None = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_geant_a_sid side_b_ae_members: ae_members_side_b = ( # type: ignore[valid-type] subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members @@ -218,11 +234,11 @@ def modify_iptrunk_subscription( @step("[DRY RUN] Provision IP trunk interface") def provision_ip_trunk_iface_dry( - subscription: Iptrunk, - process_id: UUIDstr, - callback_route: str, - tt_number: str, - removed_ae_members: list[str], + subscription: Iptrunk, + process_id: UUIDstr, + callback_route: str, + tt_number: str, + removed_ae_members: list[str], ) -> State: """Perform a dry run of deploying the updated IP trunk.""" extra_vars = { @@ -232,14 +248,14 @@ def provision_ip_trunk_iface_dry( "config_object": "trunk_interface", "removed_ae_members": removed_ae_members, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Deploy config for " - f"{subscription.iptrunk.geant_s_sid}", + f"{subscription.iptrunk.geant_s_sid}", } execute_playbook( playbook_name="iptrunks.yaml", callback_route=callback_route, inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n" - f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n", + f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n", extra_vars=extra_vars, ) @@ -248,11 +264,11 @@ def provision_ip_trunk_iface_dry( @step("[FOR REAL] Provision IP trunk interface") def provision_ip_trunk_iface_real( - subscription: Iptrunk, - process_id: UUIDstr, - callback_route: str, - tt_number: str, - removed_ae_members: list[str], + subscription: Iptrunk, + process_id: UUIDstr, + callback_route: str, + tt_number: str, + removed_ae_members: list[str], ) -> State: """Provision the new IP trunk with updated interfaces.""" extra_vars = { @@ -262,14 +278,14 @@ def provision_ip_trunk_iface_real( "config_object": "trunk_interface", "removed_ae_members": removed_ae_members, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Deploy config for " - f"{subscription.iptrunk.geant_s_sid}", + f"{subscription.iptrunk.geant_s_sid}", } execute_playbook( playbook_name="iptrunks.yaml", callback_route=callback_route, inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n" - f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n", + f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n", extra_vars=extra_vars, ) @@ -277,10 +293,10 @@ def provision_ip_trunk_iface_real( def _netbox_update_interfaces( - subscription_id: UUID, - side_block: IptrunkSideBlock, - removed_ae_members: list[dict], - previous_ae_members: list[dict], + subscription_id: UUID, + side_block: IptrunkSideBlock, + removed_ae_members: list[dict], + previous_ae_members: list[dict], ) -> None: nbclient = NetboxClient() @@ -310,7 +326,7 @@ def _netbox_update_interfaces( @step("Netbox: Reserve side A interfaces") def netbox_update_interfaces_side_a( - subscription: Iptrunk, removed_ae_members: list[list[dict]], previous_ae_members: list[list[dict]] + subscription: Iptrunk, removed_ae_members: list[list[dict]], previous_ae_members: list[list[dict]] ) -> None: """Update Netbox such that it contains the new interfaces on side A.""" _netbox_update_interfaces( @@ -323,7 +339,7 @@ def netbox_update_interfaces_side_a( @step("Netbox: Reserve side B interfaces") def netbox_update_interfaces_side_b( - subscription: Iptrunk, removed_ae_members: list[list[dict]], previous_ae_members: list[list[dict]] + subscription: Iptrunk, removed_ae_members: list[list[dict]], previous_ae_members: list[list[dict]] ) -> None: """Update Netbox such that it contains the new interfaces on side B.""" _netbox_update_interfaces( @@ -388,25 +404,25 @@ def modify_trunk_interface() -> StepList: lambda state: get_router_vendor( state["subscription"]["iptrunk"]["iptrunk_sides"][0]["iptrunk_side_node"]["owner_subscription_id"] ) - == Vendor.NOKIA + == Vendor.NOKIA ) side_b_is_nokia = conditional( lambda state: get_router_vendor( state["subscription"]["iptrunk"]["iptrunk_sides"][1]["iptrunk_side_node"]["owner_subscription_id"] ) - == Vendor.NOKIA + == Vendor.NOKIA ) return ( - init - >> store_process_subscription(Target.MODIFY) - >> unsync - >> modify_iptrunk_subscription - >> side_a_is_nokia(netbox_update_interfaces_side_a) - >> side_b_is_nokia(netbox_update_interfaces_side_b) - >> lso_interaction(provision_ip_trunk_iface_dry) - >> lso_interaction(provision_ip_trunk_iface_real) - >> side_a_is_nokia(allocate_interfaces_in_netbox_side_a) - >> side_b_is_nokia(allocate_interfaces_in_netbox_side_b) - >> resync - >> done + init + >> store_process_subscription(Target.MODIFY) + >> unsync + >> modify_iptrunk_subscription + >> side_a_is_nokia(netbox_update_interfaces_side_a) + >> side_b_is_nokia(netbox_update_interfaces_side_b) + >> lso_interaction(provision_ip_trunk_iface_dry) + >> lso_interaction(provision_ip_trunk_iface_real) + >> side_a_is_nokia(allocate_interfaces_in_netbox_side_a) + >> side_b_is_nokia(allocate_interfaces_in_netbox_side_b) + >> resync + >> done ) diff --git a/gso/workflows/iptrunk/terminate_iptrunk.py b/gso/workflows/iptrunk/terminate_iptrunk.py index 6407dbddb137568141cba287bb118a20269aca56..1ae61b80cd486d46f0f0fbea139868b01dc96d15 100644 --- a/gso/workflows/iptrunk/terminate_iptrunk.py +++ b/gso/workflows/iptrunk/terminate_iptrunk.py @@ -35,14 +35,14 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class TerminateForm(FormPage): if iptrunk.status == SubscriptionLifecycle.INITIAL: info_label_2: Label = ( - "This will immediately mark the subscription as terminated, preventing any other workflows from " # type:ignore[assignment] + "This will immediately mark the subscription as terminated, preventing any other workflows from " "interacting with this product subscription." ) - info_label_3: Label = "ONLY EXECUTE THIS WORKFLOW WHEN YOU ARE ABSOLUTELY SURE WHAT YOU ARE DOING." # type:ignore[assignment] + info_label_3: Label = "ONLY EXECUTE THIS WORKFLOW WHEN YOU ARE ABSOLUTELY SURE WHAT YOU ARE DOING." tt_number: str termination_label: Label = ( - "Please confirm whether configuration should get removed from the A and B sides of the trunk." # type: ignore[assignment] + "Please confirm whether configuration should get removed from the A and B sides of the trunk." ) remove_configuration: bool = True diff --git a/gso/workflows/router/create_router.py b/gso/workflows/router/create_router.py index 56df7e9328960114fbe5844a549434f6e365a015..dd9b2ee9f4b877361e09dc56a8742e0efff69a96 100644 --- a/gso/workflows/router/create_router.py +++ b/gso/workflows/router/create_router.py @@ -42,7 +42,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: model_config = ConfigDict(title=product_name) tt_number: str - partner: ReadOnlyField("GEANT", default_type=str) # type: ignore[valid-type] + partner: ReadOnlyField("GEANT", default_type=str) # type: ignore[valid-type] vendor: Vendor router_site: _site_selector() # type: ignore[valid-type] hostname: str @@ -155,7 +155,7 @@ def prompt_reboot_router(subscription: RouterInactive) -> FormGenerator: if subscription.router.router_site and subscription.router.router_site.site_ts_address: info_label_1: Label = ( - f"Base config has been deployed. Please log in via the console using https://" + f"Base config has been deployed. Please log in via the console using https://" f"{subscription.router.router_site.site_ts_address}." ) else: diff --git a/gso/workflows/router/terminate_router.py b/gso/workflows/router/terminate_router.py index 0d46f9abbd7a32e2f141894a09751659d24d52fa..781e75813843db8dd4330fa746cc8a5c45015206 100644 --- a/gso/workflows/router/terminate_router.py +++ b/gso/workflows/router/terminate_router.py @@ -34,13 +34,13 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class TerminateForm(FormPage): if router.status == SubscriptionLifecycle.INITIAL: info_label_2: Label = ( - "This will immediately mark the subscription as terminated, preventing any other workflows from " # type:ignore[assignment] + "This will immediately mark the subscription as terminated, preventing any other workflows from " "interacting with this product subscription." ) - info_label_3: Label = "ONLY EXECUTE THIS WORKFLOW WHEN YOU ARE ABSOLUTELY SURE WHAT YOU ARE DOING." # type:ignore[assignment] + info_label_3: Label = "ONLY EXECUTE THIS WORKFLOW WHEN YOU ARE ABSOLUTELY SURE WHAT YOU ARE DOING." tt_number: str - termination_label: Label = "Please confirm whether configuration should get removed from the router." # type: ignore[assignment] + termination_label: Label = "Please confirm whether configuration should get removed from the router." remove_configuration: bool = True user_input = yield TerminateForm diff --git a/gso/workflows/router/update_ibgp_mesh.py b/gso/workflows/router/update_ibgp_mesh.py index 6c799e2056634a0ee11e73fa155716ed0b6e3ce8..0aa61cb65a09b64c5d4821b92c4fd85c92a2ef0a 100644 --- a/gso/workflows/router/update_ibgp_mesh.py +++ b/gso/workflows/router/update_ibgp_mesh.py @@ -1,6 +1,6 @@ """Update iBGP mesh workflow. Adds a new P router to the mesh of PE routers in the network.""" -from typing import Any, Self +from typing import Any from orchestrator.config.assignee import Assignee from orchestrator.forms import FormPage @@ -34,7 +34,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: tt_number: str @model_validator(mode="before") - def router_has_a_trunk(self) -> Self: + def router_has_a_trunk(cls, data: Any) -> Any: terminating_trunks = get_trunks_that_terminate_on_router( subscription_id, SubscriptionLifecycle.PROVISIONING ) + get_trunks_that_terminate_on_router(subscription_id, SubscriptionLifecycle.ACTIVE) @@ -42,7 +42,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: msg = "Selected router does not terminate any available IP trunks." raise ValueError(msg) - return self + return data user_input = yield AddBGPSessionForm diff --git a/gso/workflows/shared/cancel_subscription.py b/gso/workflows/shared/cancel_subscription.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/gso/workflows/site/modify_site.py b/gso/workflows/site/modify_site.py index 40286044bb73d8c4f3f6bd69b2fef0f0eaad92d7..93ac6f5156344d9c47db476197dbe66b252d972a 100644 --- a/gso/workflows/site/modify_site.py +++ b/gso/workflows/site/modify_site.py @@ -68,13 +68,13 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: @step("Modify subscription") def modify_site_subscription( - subscription: Site, - site_city: str, - site_latitude: LatitudeCoordinate, - site_longitude: LongitudeCoordinate, - site_bgp_community_id: int, - site_internal_id: int, - site_ts_address: str, + subscription: Site, + site_city: str, + site_latitude: LatitudeCoordinate, + site_longitude: LongitudeCoordinate, + site_bgp_community_id: int, + site_internal_id: int, + site_ts_address: str, ) -> State: """Update the subscription model in the service database.""" subscription.site.site_city = site_city @@ -100,11 +100,11 @@ def modify_site() -> StepList: * Update the subscription model in the service database """ return ( - init - >> store_process_subscription(Target.MODIFY) - >> unsync - >> modify_site_subscription - >> set_status(SubscriptionLifecycle.ACTIVE) - >> resync - >> done + init + >> store_process_subscription(Target.MODIFY) + >> unsync + >> modify_site_subscription + >> set_status(SubscriptionLifecycle.ACTIVE) + >> resync + >> done ) diff --git a/gso/workflows/site/terminate_site.py b/gso/workflows/site/terminate_site.py index 96e807b47ed9c72b101ad3c6303e9b1fbd1405bc..02be6f7c76f4f01ada85ddaf91e552575eb3c18a 100644 --- a/gso/workflows/site/terminate_site.py +++ b/gso/workflows/site/terminate_site.py @@ -23,12 +23,12 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class TerminateForm(FormPage): if site.status == SubscriptionLifecycle.INITIAL: info_label_2: Label = ( - "This will immediately mark the subscription as terminated, preventing any other workflows from " # type:ignore[assignment] + "This will immediately mark the subscription as terminated, preventing any other workflows from " "interacting with this product subscription." ) - info_label_3: Label = "ONLY EXECUTE THIS WORKFLOW WHEN YOU ARE ABSOLUTELY SURE WHAT YOU ARE DOING." # type:ignore[assignment] + info_label_3: Label = "ONLY EXECUTE THIS WORKFLOW WHEN YOU ARE ABSOLUTELY SURE WHAT YOU ARE DOING." - termination_label: Label = "Are you sure you want to delete this site?" # type: ignore[assignment] + termination_label: Label = "Are you sure you want to delete this site?" user_input = yield TerminateForm return user_input.dict() diff --git a/gso/workflows/tasks/import_office_router.py b/gso/workflows/tasks/import_office_router.py index 6784d1c23cf81f17f727a114cbc98bdcc1b387f3..51a2a7accc1ad6e0522a563baf300e4088f16c90 100644 --- a/gso/workflows/tasks/import_office_router.py +++ b/gso/workflows/tasks/import_office_router.py @@ -14,7 +14,7 @@ from gso.products.product_types.office_router import OfficeRouterInactive from gso.services import subscriptions from gso.services.partners import get_partner_by_name from gso.services.subscriptions import get_site_by_name -from gso.utils.shared_enums import IPV4AddressType, IPV6AddressType, PortNumber, Vendor +from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType, PortNumber, Vendor @step("Create subscription") @@ -40,8 +40,8 @@ def initial_input_form_generator() -> FormGenerator: office_router_site: str office_router_fqdn: str office_router_ts_port: PortNumber - office_router_lo_ipv4_address: IPV4AddressType - office_router_lo_ipv6_address: IPV6AddressType + office_router_lo_ipv4_address: IPv4AddressType + office_router_lo_ipv6_address: IPv6AddressType user_input = yield ImportOfficeRouter @@ -54,8 +54,8 @@ def initialize_subscription( office_router_fqdn: str, office_router_ts_port: PortNumber, office_router_site: str, - office_router_lo_ipv4_address: IPV4AddressType | None = None, - office_router_lo_ipv6_address: IPV6AddressType | None = None, + office_router_lo_ipv4_address: IPv4AddressType | None = None, + office_router_lo_ipv6_address: IPv6AddressType | None = None, ) -> State: """Initialise the office router subscription using input data.""" subscription.office_router.office_router_ts_port = office_router_ts_port diff --git a/gso/workflows/tasks/import_router.py b/gso/workflows/tasks/import_router.py index 656536925151bfaee8d199d15ac5ffa4759ebd52..6386009896ab1fcead67a8764d1cdbb83fa63b81 100644 --- a/gso/workflows/tasks/import_router.py +++ b/gso/workflows/tasks/import_router.py @@ -17,7 +17,7 @@ from gso.services import subscriptions from gso.services.partners import get_partner_by_name from gso.services.subscriptions import get_site_by_name from gso.utils.helpers import generate_fqdn -from gso.utils.shared_enums import IPV4AddressType, IPV6AddressType, PortNumber, Vendor +from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType, PortNumber, Vendor @step("Create subscription") @@ -45,8 +45,8 @@ def initial_input_form_generator() -> FormGenerator: ts_port: int router_vendor: Vendor router_role: RouterRole - router_lo_ipv4_address: IPV4AddressType - router_lo_ipv6_address: IPV6AddressType + router_lo_ipv4_address: IPv4AddressType + router_lo_ipv6_address: IPv6AddressType router_lo_iso_address: str user_input = yield ImportRouter @@ -62,8 +62,8 @@ def initialize_subscription( router_site: str, router_role: router_pb.RouterRole, router_vendor: Vendor, - router_lo_ipv4_address: IPV4AddressType | None = None, - router_lo_ipv6_address: IPV6AddressType | None = None, + router_lo_ipv4_address: IPv4AddressType | None = None, + router_lo_ipv6_address: IPv6AddressType | None = None, router_lo_iso_address: str | None = None, ) -> State: """Initialise the router subscription using input data.""" diff --git a/gso/workflows/tasks/import_super_pop_switch.py b/gso/workflows/tasks/import_super_pop_switch.py index cd7fdc24379b110561dbdd97c9c8760af93e4010..ec717c050d0f2a84b146b5163b739e00b3d1224d 100644 --- a/gso/workflows/tasks/import_super_pop_switch.py +++ b/gso/workflows/tasks/import_super_pop_switch.py @@ -15,7 +15,7 @@ from gso.services import subscriptions from gso.services.partners import get_partner_by_name from gso.services.subscriptions import get_site_by_name from gso.utils.helpers import generate_fqdn -from gso.utils.shared_enums import IPV4AddressType, PortNumber, Vendor +from gso.utils.shared_enums import IPv4AddressType, PortNumber, Vendor @step("Create subscription") @@ -41,7 +41,7 @@ def initial_input_form_generator() -> FormGenerator: super_pop_switch_site: str hostname: str super_pop_switch_ts_port: PortNumber - super_pop_switch_mgmt_ipv4_address: IPV4AddressType + super_pop_switch_mgmt_ipv4_address: IPv4AddressType user_input = yield ImportSuperPopSwitch @@ -54,7 +54,7 @@ def initialize_subscription( hostname: str, super_pop_switch_ts_port: PortNumber, super_pop_switch_site: str, - super_pop_switch_mgmt_ipv4_address: IPV4AddressType | None = None, + super_pop_switch_mgmt_ipv4_address: IPv4AddressType | None = None, ) -> State: """Initialise the Super PoP switch subscription using input data.""" subscription.super_pop_switch.super_pop_switch_ts_port = super_pop_switch_ts_port diff --git a/test/workflows/iptrunk/test_create_iptrunk.py b/test/workflows/iptrunk/test_create_iptrunk.py index c16e0527fb5db87ffd5ff1d41ee27a54919325f7..84039f326f35de5ef08591fb07d686b03bc8d35a 100644 --- a/test/workflows/iptrunk/test_create_iptrunk.py +++ b/test/workflows/iptrunk/test_create_iptrunk.py @@ -55,7 +55,7 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r else: router_side_b = nokia_router_subscription_factory() side_b_members = [ - dict(interface_name=f"Interface{interface}", interface_description=faker.sentence()) + {"interface_name": f"Interface{interface}", "interface_description": faker.sentence()} for interface in range(2) ] @@ -73,10 +73,10 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r "side_a_ae_iface": "lag-1", "side_a_ae_geant_a_sid": None, "side_a_ae_members": [ - dict( - interface_name=f"Interface{interface}", - interface_description=faker.sentence(), - ) + { + "interface_name": f"Interface{interface}", + "interface_description": faker.sentence(), + } for interface in range(2) ], }