diff --git a/gso/migrations/versions/2024-04-23_8ebfc8a34c2e_add_site_modification_import_workflow.py b/gso/migrations/versions/2024-04-23_8ebfc8a34c2e_add_site_modification_import_workflow.py deleted file mode 100644 index f1802a3fc5f908cee9bd04c5543fc57a6f7122a2..0000000000000000000000000000000000000000 --- a/gso/migrations/versions/2024-04-23_8ebfc8a34c2e_add_site_modification_import_workflow.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Add site modification import workflow. - -Revision ID: 8ebfc8a34c2e -Revises: ab8d805d27b3 -Create Date: 2024-04-23 11:32:39.502729 - -""" -import sqlalchemy as sa -from alembic import op - -# revision identifiers, used by Alembic. -revision = '8ebfc8a34c2e' -down_revision = 'ab8d805d27b3' -branch_labels = None -depends_on = None - - -from orchestrator.migrations.helpers import create_workflow, delete_workflow - -new_workflows = [ - { - "name": "import_site", - "target": "MODIFY", - "description": "Import Site", - "product_type": "ImportedSite" - } -] - - -def upgrade() -> None: - conn = op.get_bind() - for workflow in new_workflows: - create_workflow(conn, workflow) - - -def downgrade() -> None: - conn = op.get_bind() - for workflow in new_workflows: - delete_workflow(conn, workflow["name"]) diff --git a/gso/migrations/versions/2024-04-23_c12ec1d9bd92_add_product_import_workflows.py b/gso/migrations/versions/2024-04-23_c12ec1d9bd92_add_product_import_workflows.py new file mode 100644 index 0000000000000000000000000000000000000000..a7ac0093505d7342a663989360d44bc2236af70a --- /dev/null +++ b/gso/migrations/versions/2024-04-23_c12ec1d9bd92_add_product_import_workflows.py @@ -0,0 +1,63 @@ +"""Add product import workflows. + +Revision ID: c12ec1d9bd92 +Revises: ab8d805d27b3 +Create Date: 2024-04-23 12:57:51.227269 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = 'c12ec1d9bd92' +down_revision = 'ab8d805d27b3' +branch_labels = None +depends_on = None + + +from orchestrator.migrations.helpers import create_workflow, delete_workflow + +new_workflows = [ + { + "name": "import_site", + "target": "MODIFY", + "description": "Import Site", + "product_type": "ImportedSite" + }, + { + "name": "import_office_router", + "target": "MODIFY", + "description": "Import OfficeRouter", + "product_type": "ImportedOfficeRouter" + }, + { + "name": "import_super_pop_switch", + "target": "MODIFY", + "description": "Import SuperPopSwitch", + "product_type": "ImportedSuperPopSwitch" + }, + { + "name": "import_router", + "target": "MODIFY", + "description": "Import Router", + "product_type": "ImportedRouter" + }, + { + "name": "import_iptrunk", + "target": "MODIFY", + "description": "Import Iptrunk", + "product_type": "ImportedIptrunk" + } +] + + +def upgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + create_workflow(conn, workflow) + + +def downgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + delete_workflow(conn, workflow["name"]) diff --git a/gso/translations/en-GB.json b/gso/translations/en-GB.json index e2b50e04428c0b4cd130c2d9b4ee487eac2290b2..9fdf1dfafa8ff3304e5e9cf6b0e36669f8412446 100644 --- a/gso/translations/en-GB.json +++ b/gso/translations/en-GB.json @@ -51,6 +51,10 @@ "create_imported_iptrunk": "NOT FOR HUMANS -- Import existing IP trunk", "create_imported_super_pop_switch": "NOT FOR HUMANS -- Import existing super PoP switch", "create_imported_office_router": "NOT FOR HUMANS -- Import existing office router", - "import_site": "Finalize import into a Site product" + "import_site": "NOT FOR HUMANS -- Finalize import into a Site product", + "import_router": "NOT FOR HUMANS -- Finalize import into a Router product", + "import_iptrunk": "NOT FOR HUMANS -- Finalize import into an IP trunk product", + "import_office_router": "NOT FOR HUMANS -- Finalize import into an Office router product", + "import_super_pop_switch": "NOT FOR HUMANS -- Finalize import into a Super PoP switch" } } diff --git a/gso/workflows/__init__.py b/gso/workflows/__init__.py index 535f6e1f5715101f431cfef83934033909b31869..7fd75ed90ce883cee989be5aadd1179a08309982 100644 --- a/gso/workflows/__init__.py +++ b/gso/workflows/__init__.py @@ -24,6 +24,7 @@ WF_USABLE_MAP.update( } ) +# IP trunk workflows LazyWorkflowInstance("gso.workflows.iptrunk.activate_iptrunk", "activate_iptrunk") LazyWorkflowInstance("gso.workflows.iptrunk.create_iptrunk", "create_iptrunk") LazyWorkflowInstance("gso.workflows.iptrunk.deploy_twamp", "deploy_twamp") @@ -31,20 +32,32 @@ LazyWorkflowInstance("gso.workflows.iptrunk.modify_isis_metric", "modify_isis_me LazyWorkflowInstance("gso.workflows.iptrunk.modify_trunk_interface", "modify_trunk_interface") LazyWorkflowInstance("gso.workflows.iptrunk.migrate_iptrunk", "migrate_iptrunk") LazyWorkflowInstance("gso.workflows.iptrunk.terminate_iptrunk", "terminate_iptrunk") +LazyWorkflowInstance("gso.workflows.iptrunk.create_imported_iptrunk", "create_imported_iptrunk") +LazyWorkflowInstance("gso.workflows.iptrunk.import_iptrunk", "import_iptrunk") + +# Router workflows LazyWorkflowInstance("gso.workflows.router.activate_router", "activate_router") LazyWorkflowInstance("gso.workflows.router.create_router", "create_router") LazyWorkflowInstance("gso.workflows.router.redeploy_base_config", "redeploy_base_config") LazyWorkflowInstance("gso.workflows.router.terminate_router", "terminate_router") LazyWorkflowInstance("gso.workflows.router.update_ibgp_mesh", "update_ibgp_mesh") LazyWorkflowInstance("gso.workflows.router.modify_connection_strategy", "modify_connection_strategy") +LazyWorkflowInstance("gso.workflows.router.import_router", "import_router") +LazyWorkflowInstance("gso.workflows.router.create_imported_router", "create_imported_router") + +# Site workflows LazyWorkflowInstance("gso.workflows.site.create_site", "create_site") LazyWorkflowInstance("gso.workflows.site.modify_site", "modify_site") LazyWorkflowInstance("gso.workflows.site.terminate_site", "terminate_site") LazyWorkflowInstance("gso.workflows.site.create_imported_site", "create_imported_site") LazyWorkflowInstance("gso.workflows.site.import_site", "import_site") -LazyWorkflowInstance("gso.workflows.router.create_imported_router", "create_imported_router") -LazyWorkflowInstance("gso.workflows.iptrunk.create_imported_iptrunk", "create_imported_iptrunk") + +# Super PoP switch workflows +LazyWorkflowInstance("gso.workflows.super_pop_switch.import_super_pop_switch", "import_super_pop_switch") LazyWorkflowInstance( "gso.workflows.super_pop_switch.create_imported_super_pop_switch", "create_imported_super_pop_switch" ) + +# Office router workflows +LazyWorkflowInstance("gso.workflows.office_router.import_office_router", "import_office_router") LazyWorkflowInstance("gso.workflows.office_router.create_imported_office_router", "create_imported_office_router") diff --git a/gso/workflows/iptrunk/import_iptrunk.py b/gso/workflows/iptrunk/import_iptrunk.py new file mode 100644 index 0000000000000000000000000000000000000000..dee0e3b1b4ecdeacabd0efb413469523bfbbd638 --- /dev/null +++ b/gso/workflows/iptrunk/import_iptrunk.py @@ -0,0 +1,27 @@ +"""A modification workflow for migrating an ImportedIptrunk to an Iptrunk subscription.""" + +from orchestrator.targets import Target +from orchestrator.types import State, UUIDstr +from orchestrator.workflow import StepList, done, init, step, workflow +from orchestrator.workflows.steps import resync, store_process_subscription, unsync +from orchestrator.workflows.utils import wrap_modify_initial_input_form + +from gso.products import ProductName +from gso.products.product_types.iptrunk import ImportedIptrunk, Iptrunk +from gso.services.subscriptions import get_product_id_by_name + + +@step("Create new IP trunk subscription") +def import_iptrunk_subscription(subscription_id: UUIDstr) -> State: + """Take an ImportedIptrunk subscription, and turn it into an Iptrunk subscription.""" + old_iptrunk = ImportedIptrunk.from_subscription(subscription_id) + new_subscription_id = get_product_id_by_name(ProductName.SITE) + new_subscription = Iptrunk.from_other_product(old_iptrunk, new_subscription_id) + + return {"subscription": new_subscription} + + +@workflow("Import Iptrunk", target=Target.MODIFY, initial_input_form=wrap_modify_initial_input_form(None)) +def import_iptrunk() -> StepList: + """Modify an ImportedIptrunk subscription into an Iptrunk subscription to complete the import.""" + return init >> store_process_subscription(Target.MODIFY) >> unsync >> import_iptrunk_subscription >> resync >> done diff --git a/gso/workflows/office_router/import_office_router.py b/gso/workflows/office_router/import_office_router.py new file mode 100644 index 0000000000000000000000000000000000000000..0a774d519b0443580fe6af71a247394df5b5d6d6 --- /dev/null +++ b/gso/workflows/office_router/import_office_router.py @@ -0,0 +1,34 @@ +"""A modification workflow for migrating an ImportedOfficeRouter to an OfficeRouter subscription.""" + +from orchestrator.targets import Target +from orchestrator.types import State, UUIDstr +from orchestrator.workflow import StepList, done, init, step, workflow +from orchestrator.workflows.steps import resync, store_process_subscription, unsync +from orchestrator.workflows.utils import wrap_modify_initial_input_form + +from gso.products import ProductName +from gso.products.product_types.office_router import ImportedOfficeRouter, OfficeRouter +from gso.services.subscriptions import get_product_id_by_name + + +@step("Create new office_router subscription") +def import_office_router_subscription(subscription_id: UUIDstr) -> State: + """Take an ImportedOfficeRouter subscription, and turn it into an OfficeRouter subscription.""" + old_office_router = ImportedOfficeRouter.from_subscription(subscription_id) + new_subscription_id = get_product_id_by_name(ProductName.SITE) + new_subscription = OfficeRouter.from_other_product(old_office_router, new_subscription_id) + + return {"subscription": new_subscription} + + +@workflow("Import OfficeRouter", target=Target.MODIFY, initial_input_form=wrap_modify_initial_input_form(None)) +def import_office_router() -> StepList: + """Modify an ImportedOfficeRouter subscription into an OfficeRouter subscription to complete the import.""" + return ( + init + >> store_process_subscription(Target.MODIFY) + >> unsync + >> import_office_router_subscription + >> resync + >> done + ) diff --git a/gso/workflows/router/import_router.py b/gso/workflows/router/import_router.py new file mode 100644 index 0000000000000000000000000000000000000000..ea5d495f71c8389737e6ab328cbfc0796987e2a4 --- /dev/null +++ b/gso/workflows/router/import_router.py @@ -0,0 +1,27 @@ +"""A modification workflow for setting a new :term:`ISIS` metric for an IP trunk.""" + +from orchestrator.targets import Target +from orchestrator.types import State, UUIDstr +from orchestrator.workflow import StepList, done, init, step, workflow +from orchestrator.workflows.steps import resync, store_process_subscription, unsync +from orchestrator.workflows.utils import wrap_modify_initial_input_form + +from gso.products import ProductName +from gso.products.product_types.router import ImportedRouter, Router +from gso.services.subscriptions import get_product_id_by_name + + +@step("Create new router subscription") +def import_router_subscription(subscription_id: UUIDstr) -> State: + """Take an ImportedRouter subscription, and turn it into a Router subscription.""" + old_router = ImportedRouter.from_subscription(subscription_id) + new_subscription_id = get_product_id_by_name(ProductName.SITE) + new_subscription = Router.from_other_product(old_router, new_subscription_id) + + return {"subscription": new_subscription} + + +@workflow("Import Router", target=Target.MODIFY, initial_input_form=wrap_modify_initial_input_form(None)) +def import_router() -> StepList: + """Modify an ImportedRouter subscription into a Router subscription to complete the import.""" + return init >> store_process_subscription(Target.MODIFY) >> unsync >> import_router_subscription >> resync >> done diff --git a/gso/workflows/site/import_site.py b/gso/workflows/site/import_site.py index b49e8a0647fdd5f89e274d558bcf735aa78cee67..1a144f640a1cefd50017ec6b755b05ea85ff47d1 100644 --- a/gso/workflows/site/import_site.py +++ b/gso/workflows/site/import_site.py @@ -1,4 +1,4 @@ -"""A modification workflow for setting a new :term:`ISIS` metric for an IP trunk.""" +"""A modification workflow for migrating an ImportedSite to a Site subscription.""" from orchestrator.targets import Target from orchestrator.types import State, UUIDstr diff --git a/gso/workflows/super_pop_switch/import_super_pop_switch.py b/gso/workflows/super_pop_switch/import_super_pop_switch.py new file mode 100644 index 0000000000000000000000000000000000000000..6ad665d90eebdbcd434f61ee2277f9530844032f --- /dev/null +++ b/gso/workflows/super_pop_switch/import_super_pop_switch.py @@ -0,0 +1,34 @@ +"""A modification workflow for migrating an ImportedSuperPopSwitch to a SuperPopSwitch subscription.""" + +from orchestrator.targets import Target +from orchestrator.types import State, UUIDstr +from orchestrator.workflow import StepList, done, init, step, workflow +from orchestrator.workflows.steps import resync, store_process_subscription, unsync +from orchestrator.workflows.utils import wrap_modify_initial_input_form + +from gso.products import ProductName +from gso.products.product_types.super_pop_switch import ImportedSuperPopSwitch, SuperPopSwitch +from gso.services.subscriptions import get_product_id_by_name + + +@step("Create new super_pop_switch subscription") +def import_super_pop_switch_subscription(subscription_id: UUIDstr) -> State: + """Take an ImportedSuperPopSwitch subscription, and turn it into a SuperPopSwitch subscription.""" + old_super_pop_switch = ImportedSuperPopSwitch.from_subscription(subscription_id) + new_subscription_id = get_product_id_by_name(ProductName.SITE) + new_subscription = SuperPopSwitch.from_other_product(old_super_pop_switch, new_subscription_id) + + return {"subscription": new_subscription} + + +@workflow("Import SuperPopSwitch", target=Target.MODIFY, initial_input_form=wrap_modify_initial_input_form(None)) +def import_super_pop_switch() -> StepList: + """Modify an ImportedSuperPopSwitch subscription into a SuperPopSwitch subscription to complete the import.""" + return ( + init + >> store_process_subscription(Target.MODIFY) + >> unsync + >> import_super_pop_switch_subscription + >> resync + >> done + )