diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py index 1ca12a0b95d8a03da406491f2c4fbcf1af4bc5ca..17a386662d758f214eba5b22cad26995edff3c14 100644 --- a/gso/services/provisioning_proxy.py +++ b/gso/services/provisioning_proxy.py @@ -80,7 +80,9 @@ def _send_request(endpoint: str, parameters: dict, process_id: UUIDstr, operatio raise AssertionError(request.content) -def provision_router(subscription: RouterProvisioning, process_id: UUIDstr, dry_run: bool = True) -> None: +def provision_router( + subscription: RouterProvisioning, process_id: UUIDstr, tt_number: str, dry_run: bool = True +) -> None: """Provision a new router using {term}`LSO`. :param subscription: The subscription object that's to be provisioned. @@ -91,13 +93,18 @@ def provision_router(subscription: RouterProvisioning, process_id: UUIDstr, dry_ :type dry_run: bool :rtype: None """ - parameters = {"dry_run": dry_run, "subscription": json.loads(json_dumps(subscription))} + parameters = { + "process_id": process_id, + "tt_number": tt_number, + "dry_run": dry_run, + "subscription": json.loads(json_dumps(subscription)), + } _send_request("router", parameters, process_id, CUDOperation.POST) def provision_ip_trunk( - subscription: IptrunkProvisioning, process_id: UUIDstr, config_object: str, dry_run: bool = True + subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str, config_object: str, dry_run: bool = True ) -> None: """Provision an IP trunk service using {term}`LSO`. @@ -115,13 +122,15 @@ def provision_ip_trunk( "subscription": json.loads(json_dumps(subscription)), "dry_run": dry_run, "verb": "deploy", + "tt_number": tt_number, + "process_id": process_id, "object": config_object, } _send_request("ip_trunk", parameters, process_id, CUDOperation.POST) -def check_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, check_name: str) -> None: +def check_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str, check_name: str) -> None: """Provision an IP trunk service using {term}`LSO`. :param subscription: The subscription object that's to be provisioned. @@ -133,13 +142,15 @@ def check_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, check """ parameters = { "subscription": json.loads(json_dumps(subscription)), + "tt_number": tt_number, + "process_id": process_id, "check_name": check_name, } _send_request("ip_trunk/perform_check", parameters, process_id, CUDOperation.POST) -def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, dry_run: bool = True) -> None: +def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, tt_number: str, dry_run: bool = True) -> None: """Deprovision an IP trunk service using {term}`LSO`. :param subscription: The subscription object that's to be provisioned. @@ -150,7 +161,13 @@ def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, dry_run: bo :type dry_run: bool :rtype: None """ - parameters = {"subscription": json.loads(json_dumps(subscription)), "dry_run": dry_run, "verb": "terminate"} + parameters = { + "subscription": json.loads(json_dumps(subscription)), + "tt_number": tt_number, + "process_id": process_id, + "dry_run": dry_run, + "verb": "terminate", + } _send_request("ip_trunk", parameters, process_id, CUDOperation.DELETE) @@ -162,7 +179,9 @@ def migrate_ip_trunk( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, verb: str, + config_object: str, dry_run: bool = True, ) -> None: """Migrate an IP trunk service using {term}`LSO`. @@ -188,6 +207,8 @@ def migrate_ip_trunk( """ parameters = { "subscription": json.loads(json_dumps(subscription)), + "tt_number": tt_number, + "process_id": process_id, "new_side": { "new_node": json.loads(json_dumps(new_node)), "new_lag_interface": new_lag_interface, @@ -195,6 +216,7 @@ def migrate_ip_trunk( "replace_index": replace_index, }, "verb": verb, + "config_object": config_object, "dry_run": dry_run, } diff --git a/gso/translations/en-GB.json b/gso/translations/en-GB.json index d28386d7ef0f3ba3b2c5e7f40abb9c054dee4e74..39f43b0c556286d7bf292439f93b17cef3775c17 100644 --- a/gso/translations/en-GB.json +++ b/gso/translations/en-GB.json @@ -1,6 +1,8 @@ { "forms": { "fields": { + "tt_number": "Insert the Ticket number that covers this activity", + "confirm": "Confirm", "confirm_info": "Please verify this form looks correct.", diff --git a/gso/workflows/iptrunk/__init__.py b/gso/workflows/iptrunk/__init__.py index 091846365a88bdaab93d02632d6a8b6eac0c1e0a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/gso/workflows/iptrunk/__init__.py +++ b/gso/workflows/iptrunk/__init__.py @@ -1,25 +0,0 @@ -from logging import getLogger - -from orchestrator import step -from orchestrator.types import State - -from gso.products.product_types.iptrunk import Iptrunk - -logger = getLogger(__name__) - - -@step("Set ISIS metric to 9000") -def set_isis_to_9000(subscription: Iptrunk) -> State: - old_isis_metric = subscription.iptrunk.iptrunk_isis_metric - subscription.iptrunk.iptrunk_isis_metric = 90000 - logger.warning("ISIS metric is only updated in the subscription, not in the real world.") - - return {"subscription": subscription, "old_isis_metric": old_isis_metric} - - -@step("Restore ISIS metric to original value") -def restore_isis_metric(subscription: Iptrunk, old_isis_metric: int) -> State: - subscription.iptrunk.iptrunk_isis_metric = old_isis_metric - logger.warning("ISIS metric is only updated in the subscription, not in the real world.") - - return {"subscription": subscription} diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py index bf70d821fb0d01f3222f4ef807512ec80f9bed71..0471d8f90a650fe4d79af54680780eae16739de3 100644 --- a/gso/workflows/iptrunk/create_iptrunk.py +++ b/gso/workflows/iptrunk/create_iptrunk.py @@ -29,6 +29,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: class Config: title = product_name + tt_number: str customer: customer_selector() # type: ignore geant_s_sid: str iptrunk_description: str @@ -147,8 +148,8 @@ def initialize_subscription( @step("Provision IP trunk interface [DRY RUN]") -def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface") +def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface") return { "subscription": subscription, @@ -157,28 +158,28 @@ def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, process_id: @step("Provision IP trunk interface [FOR REAL]") -def provision_ip_trunk_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface", False) +def provision_ip_trunk_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface", False) return { "subscription": subscription, - "label_text": "Provisioning a trunk interface, please refresh to get the results of the playbook.", + "label_text": "[COMMIT] Provisioning a trunk interface, please refresh to get the results of the playbook.", } @step("Check IP connectivity of the trunk") -def check_ip_trunk_connectivity(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.check_ip_trunk(subscription, process_id, "ping") +def check_ip_trunk_connectivity(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.check_ip_trunk(subscription, process_id, tt_number, "ping") return { "subscription": subscription, - "label_text": "Checking IP traffic flow on the trunk, to get the results of the playbook.", + "label_text": "[CHECK] Checking IP traffic flow on the trunk, to get the results of the playbook.", } @step("Provision IP trunk ISIS interface [DRY RUN]") -def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface") +def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface") return { "subscription": subscription, @@ -187,42 +188,22 @@ def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process @step("Provision IP trunk ISIS interface [FOR REAL]") -def provision_ip_trunk_isis_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface", False) +def provision_ip_trunk_isis_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False) return { "subscription": subscription, - "label_text": "Provisioning ISIS interfaces, please refresh to get the results of the playbook.", + "label_text": "[COMMIT] Provisioning ISIS interfaces, please refresh to get the results of the playbook.", } @step("Check ISIS adjacency") -def check_ip_trunk_isis(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.check_ip_trunk(subscription, process_id, "isis") +def check_ip_trunk_isis(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.check_ip_trunk(subscription, process_id, tt_number, "isis") return { "subscription": subscription, - "label_text": "Checking ISIS adjacency, please refresh to get the results of the playbook.", - } - - -@step("Provision IP trunk LDP interface [DRY RUN]") -def provision_ip_trunk_ldp_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "ldp_interface") - - return { - "subscription": subscription, - "label_text": "[DRY RUN] Provisioning LDP interface, please refresh to get the results of the playbook.", - } - - -@step("Provision IP trunk LDP interface [FOR REAL]") -def provision_ip_trunk_ldp_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "ldp_interface", False) - - return { - "subscription": subscription, - "label_text": "Provisioning LDP interface, please refresh to get the results of the playbook.", + "label_text": "[CHECK] Checking ISIS adjacency, please refresh to get the results of the playbook.", } diff --git a/gso/workflows/iptrunk/migrate_iptrunk.py b/gso/workflows/iptrunk/migrate_iptrunk.py index f87b625d77e8d89b0d95b50865e6d6ef0d0f10e6..948e9070e5475532054391f95b4c0ec5edcd7676 100644 --- a/gso/workflows/iptrunk/migrate_iptrunk.py +++ b/gso/workflows/iptrunk/migrate_iptrunk.py @@ -18,7 +18,6 @@ from gso.products.product_types.iptrunk import Iptrunk from gso.products.product_types.router import Router from gso.services import provisioning_proxy from gso.services.provisioning_proxy import pp_interaction -from gso.workflows.iptrunk import restore_isis_metric, set_isis_to_9000 logger = getLogger(__name__) @@ -38,10 +37,12 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class Config: title = ( f"Subscription {subscription.iptrunk.geant_s_sid} from " - f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn} to " + f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}" + f" to " f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}" ) + tt_number: str replace_side: ReplacedSide # type: ignore warning_label: Label = "Are we moving to a different Site?" # type: ignore migrate_to_different_site: Optional[bool] = False @@ -114,19 +115,17 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: return old_side_input.dict() | new_side_input.dict() | {"replace_index": replace_index} -@inputstep("Wait for confirmation", assignee=Assignee.SYSTEM) -def confirm_continue() -> FormGenerator: - class ProvisioningResultPage(FormPage): - class Config: - title = "Please confirm before continuing" +@step("[COMMIT] Set ISIS metric to 90000") +def set_isis_to_9000(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + old_isis_metric = subscription.iptrunk.iptrunk_isis_metric + subscription.iptrunk.iptrunk_isis_metric = 90000 + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False) - info_label: Label = ( - "ISIS metric has been set to 9000, please confirm to continue the workflow when ready." # type: ignore - ) - - yield ProvisioningResultPage - - return {} + return { + "subscription": subscription, + "old_isis_metric": old_isis_metric, + "label_text": "ISIS is being set to 90K by the provisioning proxy, please wait for the results", + } @step("[DRY RUN] Disable configuration on old router") @@ -137,6 +136,7 @@ def disable_old_config_dry( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, ) -> State: provisioning_proxy.migrate_ip_trunk( subscription, @@ -145,12 +145,14 @@ def disable_old_config_dry( new_lag_member_interfaces, replace_index, process_id, - "VERB NEEDS TO BE UPDATED", + tt_number, + "deactivate", + "deactivate", ) return { "subscription": subscription, - "label_text": "[DRY RUN] Migrating old trunk interface, please refresh to get the results of the playbook.", + "label_text": "[DRY RUN] Disable config on old node, please refresh to get the results of the playbook.", } @@ -162,6 +164,7 @@ def disable_old_config_real( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, ) -> State: provisioning_proxy.migrate_ip_trunk( subscription, @@ -170,15 +173,15 @@ def disable_old_config_real( new_lag_member_interfaces, replace_index, process_id, - "VERB NEEDS TO BE UPDATED", + tt_number, + "deactivate", + "deactivate", False, ) - logger.warning("Playbook verb is not yet properly set.") - return { "subscription": subscription, - "label_text": "Migrating old trunk interface, please refresh to get the results of the playbook.", + "label_text": "Disable config on the old node, please refresh to get the results of the playbook.", } @@ -190,6 +193,7 @@ def deploy_new_config_dry( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, ) -> State: provisioning_proxy.migrate_ip_trunk( subscription, @@ -198,7 +202,9 @@ def deploy_new_config_dry( new_lag_member_interfaces, replace_index, process_id, - "VERB NEEDS TO BE UPDATED", + tt_number, + "deploy", + "trunk_interface", ) logger.warning("Playbook verb is not yet properly set.") @@ -217,6 +223,7 @@ def deploy_new_config_real( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, ) -> State: provisioning_proxy.migrate_ip_trunk( subscription, @@ -225,7 +232,9 @@ def deploy_new_config_real( new_lag_member_interfaces, replace_index, process_id, - "VERB NEEDS TO BE UPDATED", + tt_number, + "deploy", + "trunk_interface", False, ) @@ -233,38 +242,29 @@ def deploy_new_config_real( return { "subscription": subscription, - "label_text": "Deploying new trunk interface, please refresh to get the results of the playbook.", + "label_text": "[COMMIT] Deploying new trunk interface, please refresh to get the results of the playbook.", } -@step("Run interface checks") -def run_interface_checks( - subscription: Iptrunk, - new_node: Router, - new_lag_interface: str, - new_lag_member_interfaces: list[str], - replace_index: int, - process_id: UUIDstr, -) -> State: - provisioning_proxy.migrate_ip_trunk( - subscription, - new_node, - new_lag_interface, - new_lag_member_interfaces, - replace_index, - process_id, - "MIGRATION_INTERFACE_CHECK", - ) +@inputstep("Wait for confirmation", assignee=Assignee.SYSTEM) +def confirm_continue_move_fiber() -> FormGenerator: + class ProvisioningResultPage(FormPage): + class Config: + title = "Please confirm before continuing" - logger.warning("Playbook verb is not yet properly set.") + info_label: Label = ( + "New Trunk interface has been deployed, wait for the physical connection to be moved" # type: ignore + ) - return { - "subscription": subscription, - "label_text": "Running checks on the new trunk interface, please refresh to get the results of the playbook.", - } + yield ProvisioningResultPage + return {} -@step("Deploy configuration on new router") + +# Interface checks go here + + +@step("Deploy ISIS configuration on new router") def deploy_new_isis( subscription: Iptrunk, new_node: Router, @@ -272,6 +272,7 @@ def deploy_new_isis( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, ) -> State: provisioning_proxy.migrate_ip_trunk( subscription, @@ -280,7 +281,9 @@ def deploy_new_isis( new_lag_member_interfaces, replace_index, process_id, - "VERB NEEDS TO BE UPDATED", + tt_number, + "deploy", + "isis_interface", False, ) @@ -288,20 +291,44 @@ def deploy_new_isis( return { "subscription": subscription, - "label_text": "Updating new ISIS metric, please refresh to get the results of the playbook.", + "label_text": "Deploy ISIS config on the new router, please refresh to get the results of the playbook.", } -@step("Check ISIS metric") -def check_isis(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.check_ip_trunk(subscription, process_id, "VERB NEEDS TO BE UPDATED") +# Leaving it like this as a placeholder +# @step("Check ISIS metric") +# def check_isis(subscription: Iptrunk, process_id: UUIDstr) -> State: +# provisioning_proxy.check_ip_trunk(subscription, process_id, "VERB NEEDS TO BE UPDATED") +# +# logger.warning("Playbook verb is not yet properly set.") +# +# return { +# "subscription": subscription, +# "label_text": "Checking ISIS functionality, please refresh to get the results of the playbook.", +# } - logger.warning("Playbook verb is not yet properly set.") - return { - "subscription": subscription, - "label_text": "Checking ISIS functionality, please refresh to get the results of the playbook.", - } +@inputstep("Wait for confirmation", assignee=Assignee.SYSTEM) +def confirm_continue_restore_isis() -> FormGenerator: + class ProvisioningResultPage(FormPage): + class Config: + title = "Please confirm before continuing" + + info_label: Label = ( + "ISIS config has been deployed, confirm if you want to restore the old metric" # type: ignore + ) + + yield ProvisioningResultPage + + return {} + + +@step("Restore ISIS metric to original value") +def restore_isis_metric(subscription: Iptrunk, process_id: UUIDstr, tt_number: str, old_isis_metric: int) -> State: + subscription.iptrunk.iptrunk_isis_metric = old_isis_metric + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False) + + return {"subscription": subscription} @step("[DRY RUN] Delete configuration on old router") @@ -312,6 +339,7 @@ def delete_old_config_dry( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, ) -> State: provisioning_proxy.migrate_ip_trunk( subscription, @@ -320,7 +348,9 @@ def delete_old_config_dry( new_lag_member_interfaces, replace_index, process_id, - "VERB NEEDS TO BE UPDATED", + tt_number, + "delete", + "delete", ) logger.warning("Playbook verb is not yet properly set.") @@ -340,6 +370,7 @@ def delete_old_config_real( new_lag_member_interfaces: list[str], replace_index: int, process_id: UUIDstr, + tt_number: str, ) -> State: provisioning_proxy.migrate_ip_trunk( subscription, @@ -348,7 +379,9 @@ def delete_old_config_real( new_lag_member_interfaces, replace_index, process_id, - "VERB NEEDS TO BE UPDATED", + tt_number, + "delete", + "delete", False, ) @@ -392,18 +425,17 @@ def migrate_iptrunk() -> StepList: init >> store_process_subscription(Target.MODIFY) >> unsync - >> set_isis_to_9000 - >> confirm_continue + >> pp_interaction(set_isis_to_9000, 3) >> pp_interaction(disable_old_config_dry, 3) >> pp_interaction(disable_old_config_real, 3) >> pp_interaction(deploy_new_config_dry, 3) >> pp_interaction(deploy_new_config_real, 3) - >> confirm_continue - >> pp_interaction(run_interface_checks, 3, False) + >> confirm_continue_move_fiber + # >> pp_interaction(run_interface_checks, 3, False) >> pp_interaction(deploy_new_isis, 3) - >> pp_interaction(check_isis, 3, False) - >> confirm_continue - >> restore_isis_metric + # >> pp_interaction(check_isis, 3, False) + >> confirm_continue_restore_isis + >> pp_interaction(restore_isis_metric, 3) >> pp_interaction(delete_old_config_dry, 3) >> pp_interaction(delete_old_config_real, 3) >> update_ipam diff --git a/gso/workflows/iptrunk/modify_isis_metric.py b/gso/workflows/iptrunk/modify_isis_metric.py index 6edaf8a46f372cd80651df54e441b94495b5b5f8..f43447c806c88597fc87eabe22ce4a721f4e0590 100644 --- a/gso/workflows/iptrunk/modify_isis_metric.py +++ b/gso/workflows/iptrunk/modify_isis_metric.py @@ -14,6 +14,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: subscription = Iptrunk.from_subscription(subscription_id) class ModifyIptrunkForm(FormPage): + tt_number: str isis_metric: int = subscription.iptrunk.iptrunk_isis_metric user_input = yield ModifyIptrunkForm @@ -29,8 +30,8 @@ def modify_iptrunk_subscription(subscription: Iptrunk, isis_metric: int) -> Stat @step("Provision IP trunk ISIS interface [DRY RUN]") -def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface") +def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface") return { "subscription": subscription, @@ -40,8 +41,8 @@ def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr @step("Provision IP trunk ISIS interface [FOR REAL]") -def provision_ip_trunk_isis_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface", False) +def provision_ip_trunk_isis_iface_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False) return { "subscription": subscription, diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py index 565e652f9e78862249e763188c31bd000c526ca6..5e588c0c300651f6fe9d83b1b6b824800828037e 100644 --- a/gso/workflows/iptrunk/modify_trunk_interface.py +++ b/gso/workflows/iptrunk/modify_trunk_interface.py @@ -19,6 +19,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: subscription = Iptrunk.from_subscription(subscription_id) class ModifyIptrunkForm(FormPage): + tt_number: str geant_s_sid: str = subscription.iptrunk.geant_s_sid iptrunk_description: str = subscription.iptrunk.iptrunk_description iptrunk_type: IptrunkType = subscription.iptrunk.iptrunk_type @@ -38,9 +39,9 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: title = "Provide subscription details for side A of the trunk." iptrunk_sideA_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn) - iptrunk_sideA_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_ae_iface) + iptrunk_sideA_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface) iptrunk_sideA_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid - iptrunk_sideA_ae_members: AeMembersListA = subscription.iptrunk.iptrunk_sideA_ae_members # type: ignore + iptrunk_sideA_ae_members: AeMembersListA = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members iptrunk_sideA_ae_members_descriptions: AeMembersListA = subscription.iptrunk.iptrunk_sides[ 0 ].iptrunk_side_ae_members_description @@ -58,7 +59,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: iptrunk_sideB_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn) iptrunk_sideB_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface) iptrunk_sideB_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_geant_a_sid - iptrunk_sideB_ae_members: AeMembersListB = subscription.iptrunk.iptrunk_sideB_ae_members # type: ignore + iptrunk_sideB_ae_members: AeMembersListB = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members iptrunk_sideB_ae_members_descriptions: AeMembersListB = subscription.iptrunk.iptrunk_sides[ 1 ].iptrunk_side_ae_members_description @@ -103,8 +104,8 @@ def modify_iptrunk_subscription( @step("Provision IP trunk interface [DRY RUN]") -def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface") +def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface") return { "subscription": subscription, @@ -113,8 +114,8 @@ def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> @step("Provision IP trunk interface [FOR REAL]") -def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface", False) +def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface", False) return { "subscription": subscription, @@ -122,26 +123,6 @@ def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> } -@step("Provision IP trunk LLDP interface [DRY RUN]") -def provision_ip_trunk_lldp_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "lldp_interface") - - return { - "subscription": subscription, - "label_text": "[DRY RUN] Provisioning LLDP interface, please refresh to get the results of the playbook.", - } - - -@step("Provision IP trunk LLDP interface [FOR REAL]") -def provision_ip_trunk_lldp_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "lldp_interface", False) - - return { - "subscription": subscription, - "label_text": "Provisioning LLDP interface, please refresh to get the results of the playbook.", - } - - @workflow( "Modify IP Trunk interface", initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), @@ -155,8 +136,6 @@ def modify_trunk_interface() -> StepList: >> modify_iptrunk_subscription >> pp_interaction(provision_ip_trunk_iface_dry, 3) >> pp_interaction(provision_ip_trunk_iface_real, 3) - >> pp_interaction(provision_ip_trunk_lldp_iface_dry, 3) - >> pp_interaction(provision_ip_trunk_lldp_iface_real, 3) >> resync >> done ) diff --git a/gso/workflows/iptrunk/terminate_iptrunk.py b/gso/workflows/iptrunk/terminate_iptrunk.py index 4572bb650bd93d628d329844d9d816411daeb3a1..bb638a33739941271b264c886e715acf3b2141bb 100644 --- a/gso/workflows/iptrunk/terminate_iptrunk.py +++ b/gso/workflows/iptrunk/terminate_iptrunk.py @@ -7,7 +7,6 @@ from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUID from orchestrator.workflow import StepList, conditional, done, init, step, workflow from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync from orchestrator.workflows.utils import wrap_modify_initial_input_form -from workflows.iptrunk import set_isis_to_9000 from gso.products.product_types.iptrunk import Iptrunk from gso.services import ipam, provisioning_proxy @@ -21,6 +20,7 @@ def initial_input_form_generator() -> FormGenerator: "Please confirm whether configuration should get removed from the A and B sides of the trunk, and whether " "IPAM resources should be released." # type: ignore ) + tt_number: str remove_configuration: bool = True clean_up_ipam: bool = True @@ -28,9 +28,22 @@ def initial_input_form_generator() -> FormGenerator: return user_input.dict() +@step("[COMMIT] Set ISIS metric to 90000") +def set_isis_to_9000(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + old_isis_metric = subscription.iptrunk.iptrunk_isis_metric + subscription.iptrunk.iptrunk_isis_metric = 90000 + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False) + + return { + "subscription": subscription, + "old_isis_metric": old_isis_metric, + "label_text": "ISIS is being set to 90K by the provisioning proxy, please wait for the results", + } + + @step("Drain traffic from trunk") -def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface", False) +def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False) return { "subscription": subscription, "label_text": "This is setting the ISIS metric of the trunk to 9000. Press refresh to get the results." @@ -39,8 +52,8 @@ def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr) -> S @step("Deprovision IP trunk [DRY RUN]") -def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.deprovision_ip_trunk(subscription, process_id, True) +def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.deprovision_ip_trunk(subscription, process_id, tt_number, True) return { "subscription": subscription, @@ -49,12 +62,12 @@ def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr) -> Stat @step("Deprovision IP trunk [FOR REAL]") -def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr) -> State: - provisioning_proxy.deprovision_ip_trunk(subscription, process_id, False) +def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.deprovision_ip_trunk(subscription, process_id, tt_number, False) return { "subscription": subscription, - "label_text": "Terminating IP trunk, please refresh to get the results of the playbook.", + "label_text": "[COMMIT] Terminating IP trunk, please refresh to get the results of the playbook.", } @@ -86,8 +99,9 @@ def terminate_iptrunk() -> StepList: run_ipam_steps = conditional(lambda state: state.get("clean_up_ipam", True)) config_steps = ( - StepList([set_isis_to_9000]) - >> pp_interaction(drain_traffic_from_ip_trunk, 3) + # StepList([set_isis_to_9000]) + StepList() + >> pp_interaction(set_isis_to_9000, 3) >> pp_interaction(deprovision_ip_trunk_dry, 3) >> pp_interaction(deprovision_ip_trunk_real, 3) ) diff --git a/gso/workflows/router/create_router.py b/gso/workflows/router/create_router.py index c94826f286cb49e44d5c77fb10a7f5888b6ff309..3322ca551b7e47155160f91c741f075feee1a0ed 100644 --- a/gso/workflows/router/create_router.py +++ b/gso/workflows/router/create_router.py @@ -36,13 +36,14 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: class Config: title = product_name + tt_number: str customer: customer_selector() # type: ignore router_site: _site_selector() # type: ignore hostname: str ts_port: PortNumber router_vendor: router_pb.RouterVendor router_role: router_pb.RouterRole - is_ias_connected: Optional[bool] + is_ias_connected: Optional[bool] = False user_input = yield CreateRouterForm @@ -111,8 +112,8 @@ def initialize_subscription( @step("Provision router [DRY RUN]") -def provision_router_dry(subscription: RouterProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_router(subscription, process_id) +def provision_router_dry(subscription: RouterProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_router(subscription, process_id, tt_number) return { "subscription": subscription, @@ -124,8 +125,8 @@ def provision_router_dry(subscription: RouterProvisioning, process_id: UUIDstr) @step("Provision router [FOR REAL]") -def provision_router_real(subscription: RouterProvisioning, process_id: UUIDstr) -> State: - provisioning_proxy.provision_router(subscription, process_id, False) +def provision_router_real(subscription: RouterProvisioning, process_id: UUIDstr, tt_number: str) -> State: + provisioning_proxy.provision_router(subscription, process_id, tt_number, False) return { "subscription": subscription, diff --git a/gso/workflows/router/terminate_router.py b/gso/workflows/router/terminate_router.py index 3276a8fb31f8ae053b25edfe137c55260b432885..e190bc47db1870fb5911ee6062f50fabfee7bcac 100644 --- a/gso/workflows/router/terminate_router.py +++ b/gso/workflows/router/terminate_router.py @@ -24,6 +24,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: "Please confirm whether configuration should get removed from the router, and whether IPAM resources should" " be released." # type: ignore ) + tt_number: str remove_configuration: bool = True clean_up_ipam: bool = True