diff --git a/migrations/versions/schema/2023-03-13_8329fa45157b_add_delete_workflows_and_update_create_.py b/migrations/versions/schema/2023-03-13_8329fa45157b_add_delete_workflows_and_update_create_.py new file mode 100644 index 0000000000000000000000000000000000000000..88081814b3869c74969b66d3630b56a8b7095a7a --- /dev/null +++ b/migrations/versions/schema/2023-03-13_8329fa45157b_add_delete_workflows_and_update_create_.py @@ -0,0 +1,81 @@ +"""add DELETE workflows and update CREATE workflows. + +Revision ID: 8329fa45157b +Revises: aa49bed10737 +Create Date: 2023-03-13 12:12:20.553551 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '8329fa45157b' +down_revision = 'aa49bed10737' +branch_labels = None +depends_on = None + + +from orchestrator.migrations.helpers import create_workflow, delete_workflow + +new_workflows = [ + { + "name": "create_trunk", + "target": "CREATE", + "description": "Create trunk", + "product_type": "Trunk" + }, + { + "name": "terminate_trunk", + "target": "TERMINATE", + "description": "Terminate trunk", + "product_type": "Trunk" + }, + { + "name": "create_trunk_config", + "target": "CREATE", + "description": "Create trunk config", + "product_type": "TrunkConfig" + }, + { + "name": "terminate_trunk_config", + "target": "TERMINATE", + "description": "Terminate trunk config", + "product_type": "TrunkConfig" + }, + { + "name": "create_trunk_config_common", + "target": "CREATE", + "description": "Create trunk config common", + "product_type": "TrunkConfigCommon" + }, + { + "name": "terminate_trunk_config_common", + "target": "TERMINATE", + "description": "Terminate trunk config common", + "product_type": "TrunkConfigCommon" + }, + { + "name": "create_trunk_config_side", + "target": "CREATE", + "description": "Create trunk config side", + "product_type": "TrunkConfigSide" + }, + { + "name": "terminate_trunk_config_side", + "target": "TERMINATE", + "description": "Terminate trunk config side", + "product_type": "TrunkConfigSide" + } +] + + +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/workflows/__init__.py b/workflows/__init__.py index 6eeccd6dbb0490be4e7570b46dd8fa3656f791af..3a379cd401c3d7d0346f69e91f047b48886fe54a 100644 --- a/workflows/__init__.py +++ b/workflows/__init__.py @@ -4,3 +4,7 @@ LazyWorkflowInstance("workflows.trunk.create_trunk", "create_trunk") LazyWorkflowInstance("workflows.trunk_config.create_trunk_config", "create_trunk_config") LazyWorkflowInstance("workflows.trunk_config_common.create_trunk_config_common", "create_trunk_config_common") LazyWorkflowInstance("workflows.trunk_config_side.create_trunk_config_side", "create_trunk_config_side") +LazyWorkflowInstance("workflows.trunk.terminate_trunk", "terminate_trunk") +LazyWorkflowInstance("workflows.trunk_config.terminate_trunk_config", "terminate_trunk_config") +LazyWorkflowInstance("workflows.trunk_config_common.terminate_trunk_config_common", "terminate_trunk_config_common") +LazyWorkflowInstance("workflows.trunk_config_side.terminate_trunk_config_side", "terminate_trunk_config_side") diff --git a/workflows/trunk/create_trunk.py b/workflows/trunk/create_trunk.py index 16c5444bcc46b7c572bcc2fd05d6b62d2f141b21..f994aff805ec02c799ff96bdade5a27cda4b5ada 100644 --- a/workflows/trunk/create_trunk.py +++ b/workflows/trunk/create_trunk.py @@ -24,7 +24,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: return user_input.dict() -def _provision_in_group_management_system(trunk_name: str) -> int: +def _provision_in_gap(trunk_name: str) -> int: return abs(hash(trunk_name)) @@ -48,7 +48,7 @@ def initialize_subscription(subscription: TrunkInactive, trunk_name: str, geant_ @step("Provision trunk") def provision_trunk(subscription: TrunkProvisioning, trunk_name: str) -> State: - trunk_id = _provision_in_group_management_system(trunk_name) + trunk_id = _provision_in_gap(trunk_name) subscription.trunk.trunk_id = trunk_id return {"subscription": subscription} diff --git a/workflows/trunk/terminate_trunk.py b/workflows/trunk/terminate_trunk.py new file mode 100644 index 0000000000000000000000000000000000000000..cfb0e43147b3c2f1210342d670605fe656a62bfe --- /dev/null +++ b/workflows/trunk/terminate_trunk.py @@ -0,0 +1,45 @@ +from orchestrator.forms import FormPage +from orchestrator.forms.validators import Label +from orchestrator.targets import Target +from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr +from orchestrator.workflow import 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 products import Trunk + + +def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm: + subscription = Trunk.from_subscription(subscription_id) + + class TerminateForm(FormPage): + are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?" # type:ignore + + return TerminateForm + + +def _deprovision_in_gap(trunk_id: int) -> int: + pass + + +@step("Deprovision trunk") +def deprovision_trunk(subscription: Trunk) -> None: + _deprovision_in_gap(subscription.trunk.trunk_id) + + +@workflow( + "Terminate trunk", + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), + target=Target.TERMINATE, +) +def terminate_trunk(): + + return ( + init + >> store_process_subscription(Target.TERMINATE) + >> unsync + >> deprovision_trunk + >> set_status(SubscriptionLifecycle.TERMINATED) + >> resync + >> done + ) \ No newline at end of file diff --git a/workflows/trunk_config/create_trunk_config.py b/workflows/trunk_config/create_trunk_config.py index f2c5c117dbc5128230b5e52e7815f349697abfb4..6338f7704d0915ce54d3ca54c67e80f2c3beabbc 100644 --- a/workflows/trunk_config/create_trunk_config.py +++ b/workflows/trunk_config/create_trunk_config.py @@ -47,7 +47,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: return user_input.dict() -def _provision_in_group_management_system() -> int: +def _provision_in_gap() -> int: return random.randint(0, 2147483648) @@ -70,7 +70,7 @@ def initialize_subscription(subscription: TrunkConfigInactive, trunk_ids: List[s @step("Provision trunk config") def provision_trunk_config(subscription: TrunkConfigProvisioning) -> State: - trunk_config_id = _provision_in_group_management_system() + trunk_config_id = _provision_in_gap() subscription.trunk_config.trunk_config_id = trunk_config_id return {"subscription": subscription} diff --git a/workflows/trunk_config/terminate_trunk_config.py b/workflows/trunk_config/terminate_trunk_config.py new file mode 100644 index 0000000000000000000000000000000000000000..2d4d6cb689da21992218dcf41693734fb6f987a4 --- /dev/null +++ b/workflows/trunk_config/terminate_trunk_config.py @@ -0,0 +1,45 @@ +from orchestrator.forms import FormPage +from orchestrator.forms.validators import Label +from orchestrator.targets import Target +from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr +from orchestrator.workflow import 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 products import TrunkConfig + + +def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm: + subscription = TrunkConfig.from_subscription(subscription_id) + + class TerminateForm(FormPage): + are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?" # type:ignore + + return TerminateForm + + +def _deprovision_in_gap(trunk_config_id: int) -> int: + pass + + +@step("Deprovision trunk config") +def deprovision_trunk_config(subscription: TrunkConfig) -> None: + _deprovision_in_gap(subscription.trunk_config.trunk_config_id) + + +@workflow( + "Terminate trunk config", + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), + target=Target.TERMINATE, +) +def terminate_trunk_config(): + + return ( + init + >> store_process_subscription(Target.TERMINATE) + >> unsync + >> deprovision_trunk_config + >> set_status(SubscriptionLifecycle.TERMINATED) + >> resync + >> done + ) \ No newline at end of file diff --git a/workflows/trunk_config_common/create_trunk_config_common.py b/workflows/trunk_config_common/create_trunk_config_common.py index 3d609ed6c7ca0161db2f7438194ed08f6885a5b6..0673d2f7349b2747702d4be007e82dc676e0dc3a 100644 --- a/workflows/trunk_config_common/create_trunk_config_common.py +++ b/workflows/trunk_config_common/create_trunk_config_common.py @@ -50,7 +50,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: return user_input.dict() -def _provision_in_group_management_system() -> int: +def _provision_in_gap() -> int: return random.randint(0, 2147483648) @@ -77,7 +77,7 @@ def initialize_subscription(subscription: TrunkConfigCommonInactive, speed: str, @step("Provision trunk config common") def provision_trunk_config_common(subscription: TrunkConfigCommonProvisioning) -> State: - trunk_config_common_id = _provision_in_group_management_system() + trunk_config_common_id = _provision_in_gap() subscription.trunk_config_common.trunk_config_common_id = trunk_config_common_id return {"subscription": subscription} diff --git a/workflows/trunk_config_common/terminate_trunk_config_common.py b/workflows/trunk_config_common/terminate_trunk_config_common.py new file mode 100644 index 0000000000000000000000000000000000000000..b92da2476a7da36556c9334c9c3671bf49bb996d --- /dev/null +++ b/workflows/trunk_config_common/terminate_trunk_config_common.py @@ -0,0 +1,45 @@ +from orchestrator.forms import FormPage +from orchestrator.forms.validators import Label +from orchestrator.targets import Target +from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr +from orchestrator.workflow import 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 products import TrunkConfigCommon + + +def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm: + subscription = TrunkConfigCommon.from_subscription(subscription_id) + + class TerminateForm(FormPage): + are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?" # type:ignore + + return TerminateForm + + +def _deprovision_in_gap(trunk_config_common_id: int) -> int: + pass + + +@step("Deprovision trunk config common") +def deprovision_trunk_config_common(subscription: TrunkConfigCommon) -> None: + _deprovision_in_gap(subscription.trunk_config_common.trunk_config_common_id) + + +@workflow( + "Terminate trunk config common", + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), + target=Target.TERMINATE, +) +def terminate_trunk_config_common(): + + return ( + init + >> store_process_subscription(Target.TERMINATE) + >> unsync + >> deprovision_trunk_config_common + >> set_status(SubscriptionLifecycle.TERMINATED) + >> resync + >> done + ) \ No newline at end of file diff --git a/workflows/trunk_config_side/create_trunk_config_side.py b/workflows/trunk_config_side/create_trunk_config_side.py index 67897ea2bdedcbf155d7bc7c3f0e28140175b8ca..d5da830d977ebaf50f9ed614ec6c0142d565f52f 100644 --- a/workflows/trunk_config_side/create_trunk_config_side.py +++ b/workflows/trunk_config_side/create_trunk_config_side.py @@ -52,7 +52,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: return user_input.dict() -def _provision_in_group_management_system(fqdn: str) -> int: +def _provision_in_gap(fqdn: str) -> int: return abs(hash(fqdn)) @@ -81,7 +81,7 @@ def initialize_subscription(subscription: TrunkConfigSideInactive, fqdn: str, ae @step("Provision trunk config side") def provision_trunk_config_side(subscription: TrunkConfigSideProvisioning, fqdn: str) -> State: - trunk_config_side_id = _provision_in_group_management_system(fqdn) + trunk_config_side_id = _provision_in_gap(fqdn) subscription.trunk_config_side.trunk_config_side_id = trunk_config_side_id return {"subscription": subscription} diff --git a/workflows/trunk_config_side/terminate_trunk_config_side.py b/workflows/trunk_config_side/terminate_trunk_config_side.py new file mode 100644 index 0000000000000000000000000000000000000000..a9a29e1f420c73e93392576bc6ba43e3caf2e5db --- /dev/null +++ b/workflows/trunk_config_side/terminate_trunk_config_side.py @@ -0,0 +1,45 @@ +from orchestrator.forms import FormPage +from orchestrator.forms.validators import Label +from orchestrator.targets import Target +from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr +from orchestrator.workflow import 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 products import TrunkConfigSide + + +def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm: + subscription = TrunkConfigSide.from_subscription(subscription_id) + + class TerminateForm(FormPage): + are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?" # type:ignore + + return TerminateForm + + +def _deprovision_in_gap(trunk_config_side_id: int) -> int: + pass + + +@step("Deprovision trunk config side") +def deprovision_trunk_config_side(subscription: TrunkConfigSide) -> None: + _deprovision_in_gap(subscription.trunk_config_side.trunk_config_side_id) + + +@workflow( + "Terminate trunk config side", + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), + target=Target.TERMINATE, +) +def terminate_trunk_config_side(): + + return ( + init + >> store_process_subscription(Target.TERMINATE) + >> unsync + >> deprovision_trunk_config_side + >> set_status(SubscriptionLifecycle.TERMINATED) + >> resync + >> done + ) \ No newline at end of file