diff --git a/.gitignore b/.gitignore index 3fafd07fbe689b9d2fcbdb5ec6e91a4831948f77..99601dda9d9a9ad3916fc9aee7d16d79d83b1082 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ __pycache__ *.egg-info +.coverage +coverage.xml diff --git a/geant_service_orchestrator/__init__.py b/geant_service_orchestrator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/geant_service_orchestrator/main.py b/geant_service_orchestrator/main.py index 66357c213e8c8b6368767a9b7c4e652561113e8b..1df03d52a568865255cc2e141e4b5a0761097b45 100644 --- a/geant_service_orchestrator/main.py +++ b/geant_service_orchestrator/main.py @@ -2,8 +2,8 @@ from orchestrator import OrchestratorCore from orchestrator.cli.main import app as core_cli from orchestrator.settings import AppSettings -import products -import workflows +# from geant_service_orchestrator import products +# from geant_service_orchestrator import workflows app = OrchestratorCore(base_settings=AppSettings()) diff --git a/geant_service_orchestrator/products/__init__.py b/geant_service_orchestrator/products/__init__.py index 92c8828d399f26b8d54a264d07a642c4565df187..abbeb292f7cc785c0c725ef986ee98a5dc3f3a47 100644 --- a/geant_service_orchestrator/products/__init__.py +++ b/geant_service_orchestrator/products/__init__.py @@ -1,9 +1,13 @@ from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY -from products.product_types.trunk import Trunk -from products.product_types.trunk_config import TrunkConfig -from products.product_types.trunk_config_common import TrunkConfigCommon -from products.product_types.trunk_config_side import TrunkConfigSide +from geant_service_orchestrator.products.product_types.trunk \ + import Trunk +from geant_service_orchestrator.products.product_types.trunk_config \ + import TrunkConfig +from geant_service_orchestrator.products.product_types.trunk_config_common \ + import TrunkConfigCommon +from geant_service_orchestrator.products.product_types.trunk_config_side \ + import TrunkConfigSide SUBSCRIPTION_MODEL_REGISTRY.update( { diff --git a/geant_service_orchestrator/products/product_blocks/trunk.py b/geant_service_orchestrator/products/product_blocks/trunk.py index 76237c83a0d8e70003e6a301ce566de5c0dfb4f5..bc46bbb7b72a6927246f3f7f3b006d7cd927ac45 100644 --- a/geant_service_orchestrator/products/product_blocks/trunk.py +++ b/geant_service_orchestrator/products/product_blocks/trunk.py @@ -4,19 +4,26 @@ from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle -class TrunkBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkBlock"): +class TrunkBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="TrunkBlock"): trunk_id: Optional[int] = None geant_s_sid: Optional[str] = None trunk_name: Optional[str] = None -class TrunkBlockProvisioning(TrunkBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkBlockProvisioning( + TrunkBlockInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk_id: Optional[int] = None geant_s_sid: Optional[str] = None trunk_name: str -class TrunkBlock(TrunkBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class TrunkBlock( + TrunkBlockProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk_id: int geant_s_sid: str trunk_name: str diff --git a/geant_service_orchestrator/products/product_blocks/trunk_config.py b/geant_service_orchestrator/products/product_blocks/trunk_config.py index bf375d0cf63c63e24d0aa5d7d1d5582204e9b42c..2c191cfbedcd0b0b60ad15c1f77abb963276a73a 100644 --- a/geant_service_orchestrator/products/product_blocks/trunk_config.py +++ b/geant_service_orchestrator/products/product_blocks/trunk_config.py @@ -3,19 +3,27 @@ from typing import Optional from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle -from products.product_blocks.trunk import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning +from geant_service_orchestrator.products.product_blocks.trunk \ + import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning -class TrunkConfigBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkConfigBlock"): +class TrunkConfigBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="TrunkConfigBlock"): trunk: TrunkBlockInactive trunk_config_id: Optional[int] = None -class TrunkConfigBlockProvisioning(TrunkConfigBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkConfigBlockProvisioning( + TrunkConfigBlockInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk: TrunkBlockProvisioning trunk_config_id: Optional[int] = None -class TrunkConfigBlock(TrunkConfigBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class TrunkConfigBlock( + TrunkConfigBlockProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk: TrunkBlock trunk_config_id: int diff --git a/geant_service_orchestrator/products/product_blocks/trunk_config_common.py b/geant_service_orchestrator/products/product_blocks/trunk_config_common.py index c2c18b985bf66078b27b91350e4e586b0a193ed7..c7d3b90993024c176a3678f079c5949398bdeb93 100644 --- a/geant_service_orchestrator/products/product_blocks/trunk_config_common.py +++ b/geant_service_orchestrator/products/product_blocks/trunk_config_common.py @@ -3,10 +3,15 @@ from typing import Optional from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle -from products.product_blocks.trunk_config import TrunkConfigBlock, TrunkConfigBlockInactive, TrunkConfigBlockProvisioning +from geant_service_orchestrator.products.product_blocks.trunk_config \ + import TrunkConfigBlock, TrunkConfigBlockInactive, \ + TrunkConfigBlockProvisioning -class TrunkConfigCommonBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkConfigCommonBlock"): +class TrunkConfigCommonBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="TrunkConfigCommonBlock"): trunk_config: TrunkConfigBlockInactive trunk_config_common_id: Optional[int] = None speed: Optional[str] = None @@ -15,7 +20,9 @@ class TrunkConfigCommonBlockInactive(ProductBlockModel, lifecycle=[SubscriptionL minimum_links: Optional[int] = None -class TrunkConfigCommonBlockProvisioning(TrunkConfigCommonBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkConfigCommonBlockProvisioning( + TrunkConfigCommonBlockInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk_config: TrunkConfigBlockProvisioning trunk_config_common_id: Optional[int] = None speed: str @@ -24,7 +31,9 @@ class TrunkConfigCommonBlockProvisioning(TrunkConfigCommonBlockInactive, lifecyc minimum_links: int -class TrunkConfigCommonBlock(TrunkConfigCommonBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class TrunkConfigCommonBlock( + TrunkConfigCommonBlockProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk_config: TrunkConfigBlock trunk_config_common_id: int speed: str diff --git a/geant_service_orchestrator/products/product_blocks/trunk_config_side.py b/geant_service_orchestrator/products/product_blocks/trunk_config_side.py index 8bf1b039a315a6ef254ef33367e6965526c8dbb3..e78d198b94dd9b1befef5db98dc2d9bb5358cda6 100644 --- a/geant_service_orchestrator/products/product_blocks/trunk_config_side.py +++ b/geant_service_orchestrator/products/product_blocks/trunk_config_side.py @@ -3,10 +3,15 @@ from typing import Optional from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle -from products.product_blocks.trunk_config import TrunkConfigBlock, TrunkConfigBlockInactive, TrunkConfigBlockProvisioning +from geant_service_orchestrator.products.product_blocks.trunk_config \ + import TrunkConfigBlock, TrunkConfigBlockInactive,\ + TrunkConfigBlockProvisioning -class TrunkConfigSideBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="TrunkConfigSideBlock"): +class TrunkConfigSideBlockInactive( + ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="TrunkConfigSideBlock"): trunk_config: TrunkConfigBlockInactive trunk_config_side_id: Optional[int] = None fqdn: Optional[str] = None @@ -17,7 +22,9 @@ class TrunkConfigSideBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLif members: Optional[list] = None -class TrunkConfigSideBlockProvisioning(TrunkConfigSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkConfigSideBlockProvisioning( + TrunkConfigSideBlockInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk_config: TrunkConfigBlockProvisioning trunk_config_side_id: Optional[int] = None fqdn: str @@ -28,7 +35,9 @@ class TrunkConfigSideBlockProvisioning(TrunkConfigSideBlockInactive, lifecycle=[ members: Optional[list] = None -class TrunkConfigSideBlock(TrunkConfigSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class TrunkConfigSideBlock( + TrunkConfigSideBlockProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk_config: TrunkConfigBlock trunk_config_side_id: int fqdn: str diff --git a/geant_service_orchestrator/products/product_types/trunk.py b/geant_service_orchestrator/products/product_types/trunk.py index 5b000584ee2c84b90a7f37024f6ec0c71dc4b272..de30a39862f8225b7511ca4a5673f24508945ac8 100644 --- a/geant_service_orchestrator/products/product_types/trunk.py +++ b/geant_service_orchestrator/products/product_types/trunk.py @@ -1,16 +1,23 @@ from orchestrator.domain.base import SubscriptionModel from orchestrator.types import SubscriptionLifecycle -from products.product_blocks.trunk import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning +from geant_service_orchestrator.products.product_blocks.trunk \ + import TrunkBlock, TrunkBlockInactive, TrunkBlockProvisioning -class TrunkInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]): +class TrunkInactive( + SubscriptionModel, is_base=True, + lifecycle=[SubscriptionLifecycle.INITIAL]): trunk: TrunkBlockInactive -class TrunkProvisioning(TrunkInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkProvisioning( + TrunkInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk: TrunkBlockProvisioning -class Trunk(TrunkProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class Trunk( + TrunkProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk: TrunkBlock diff --git a/geant_service_orchestrator/products/product_types/trunk_config.py b/geant_service_orchestrator/products/product_types/trunk_config.py index 94e48c32a97196db93e05b4e9e4ee82661a3fb43..6e33bebaa22fc508441365bbe91b12d168eee083 100644 --- a/geant_service_orchestrator/products/product_types/trunk_config.py +++ b/geant_service_orchestrator/products/product_types/trunk_config.py @@ -1,16 +1,24 @@ from orchestrator.domain.base import SubscriptionModel from orchestrator.types import SubscriptionLifecycle -from products.product_blocks.trunk_config import TrunkConfigBlock, TrunkConfigBlockInactive, TrunkConfigBlockProvisioning +from geant_service_orchestrator.products.product_blocks.trunk_config \ + import TrunkConfigBlock, TrunkConfigBlockInactive,\ + TrunkConfigBlockProvisioning -class TrunkConfigInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]): +class TrunkConfigInactive( + SubscriptionModel, + is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]): trunk_config: TrunkConfigBlockInactive -class TrunkConfigProvisioning(TrunkConfigInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkConfigProvisioning( + TrunkConfigInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk_config: TrunkConfigBlockProvisioning -class TrunkConfig(TrunkConfigProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class TrunkConfig( + TrunkConfigProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk_config: TrunkConfigBlock diff --git a/geant_service_orchestrator/products/product_types/trunk_config_common.py b/geant_service_orchestrator/products/product_types/trunk_config_common.py index 06999907ebd9a776869a751bdd6d67785da69e61..6d1d9480bdaaebbe3299acd7149bf71348638e8a 100644 --- a/geant_service_orchestrator/products/product_types/trunk_config_common.py +++ b/geant_service_orchestrator/products/product_types/trunk_config_common.py @@ -1,16 +1,25 @@ from orchestrator.domain.base import SubscriptionModel from orchestrator.types import SubscriptionLifecycle -from products.product_blocks.trunk_config_common import TrunkConfigCommonBlock, TrunkConfigCommonBlockInactive, TrunkConfigCommonBlockProvisioning +from geant_service_orchestrator.products.product_blocks.trunk_config_common \ + import TrunkConfigCommonBlock, TrunkConfigCommonBlockInactive, \ + TrunkConfigCommonBlockProvisioning -class TrunkConfigCommonInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]): +class TrunkConfigCommonInactive( + SubscriptionModel, + is_base=True, + lifecycle=[SubscriptionLifecycle.INITIAL]): trunk_config_common: TrunkConfigCommonBlockInactive -class TrunkConfigCommonProvisioning(TrunkConfigCommonInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkConfigCommonProvisioning( + TrunkConfigCommonInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk_config_common: TrunkConfigCommonBlockProvisioning -class TrunkConfigCommon(TrunkConfigCommonProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class TrunkConfigCommon( + TrunkConfigCommonProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk_config_common: TrunkConfigCommonBlock diff --git a/geant_service_orchestrator/products/product_types/trunk_config_side.py b/geant_service_orchestrator/products/product_types/trunk_config_side.py index c0600fab107f37dc42e57263a7db20e7cdfbd34b..943dfc35dc72d12ca1dab96b719779bf896e2ec3 100644 --- a/geant_service_orchestrator/products/product_types/trunk_config_side.py +++ b/geant_service_orchestrator/products/product_types/trunk_config_side.py @@ -1,16 +1,25 @@ from orchestrator.domain.base import SubscriptionModel from orchestrator.types import SubscriptionLifecycle -from products.product_blocks.trunk_config_side import TrunkConfigSideBlock, TrunkConfigSideBlockInactive, TrunkConfigSideBlockProvisioning +from geant_service_orchestrator.products.product_blocks.trunk_config_side \ + import TrunkConfigSideBlock, TrunkConfigSideBlockInactive, \ + TrunkConfigSideBlockProvisioning -class TrunkConfigSideInactive(SubscriptionModel, is_base=True, lifecycle=[SubscriptionLifecycle.INITIAL]): +class TrunkConfigSideInactive( + SubscriptionModel, + is_base=True, + lifecycle=[SubscriptionLifecycle.INITIAL]): trunk_config_side: TrunkConfigSideBlockInactive -class TrunkConfigSideProvisioning(TrunkConfigSideInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): +class TrunkConfigSideProvisioning( + TrunkConfigSideInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): trunk_config_side: TrunkConfigSideBlockProvisioning -class TrunkConfigSide(TrunkConfigSideProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class TrunkConfigSide( + TrunkConfigSideProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): trunk_config_side: TrunkConfigSideBlock diff --git a/geant_service_orchestrator/workflows/__init__.py b/geant_service_orchestrator/workflows/__init__.py index 3a379cd401c3d7d0346f69e91f047b48886fe54a..282c688fb2ab365abab14b9a3774b525614044af 100644 --- a/geant_service_orchestrator/workflows/__init__.py +++ b/geant_service_orchestrator/workflows/__init__.py @@ -1,10 +1,26 @@ from orchestrator.workflows import LazyWorkflowInstance -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") +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/geant_service_orchestrator/workflows/trunk/create_trunk.py b/geant_service_orchestrator/workflows/trunk/create_trunk.py index f994aff805ec02c799ff96bdade5a27cda4b5ada..518efd920423025aed4d49deb4f38a133eb2048d 100644 --- a/geant_service_orchestrator/workflows/trunk/create_trunk.py +++ b/geant_service_orchestrator/workflows/trunk/create_trunk.py @@ -3,12 +3,15 @@ from uuid import uuid4 from orchestrator.forms import FormPage from orchestrator.targets import Target -from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr +from orchestrator.types \ + import FormGenerator, State, SubscriptionLifecycle, UUIDstr from orchestrator.workflow import done, init, step, workflow -from orchestrator.workflows.steps import resync, set_status, store_process_subscription +from orchestrator.workflows.steps \ + import resync, set_status, store_process_subscription from orchestrator.workflows.utils import wrap_create_initial_input_form -from products.product_types.trunk import TrunkInactive, TrunkProvisioning +from geant_service_orchestrator.products.product_types.trunk \ + import TrunkInactive, TrunkProvisioning def initial_input_form_generator(product_name: str) -> FormGenerator: @@ -33,21 +36,30 @@ def _provision_in_gap(trunk_name: str) -> int: def create_subscription(product: UUIDstr) -> State: subscription = TrunkInactive.from_product_id(product, uuid4()) - return {"subscription": subscription, "subscription_id": subscription.subscription_id} + return { + "subscription": subscription, + "subscription_id": subscription.subscription_id + } @step("Initialize subscription") -def initialize_subscription(subscription: TrunkInactive, trunk_name: str, geant_s_sid: str) -> State: +def initialize_subscription( + subscription: TrunkInactive, + trunk_name: str, + geant_s_sid: str) -> State: subscription.trunk.trunk_name = trunk_name subscription.trunk.geant_s_sid = geant_s_sid subscription.description = f"Trunk {trunk_name}" - subscription = TrunkProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING) + subscription = TrunkProvisioning.from_other_lifecycle( + subscription, SubscriptionLifecycle.PROVISIONING) return {"subscription": subscription} @step("Provision trunk") -def provision_trunk(subscription: TrunkProvisioning, trunk_name: str) -> State: +def provision_trunk( + subscription: TrunkProvisioning, + trunk_name: str) -> State: trunk_id = _provision_in_gap(trunk_name) subscription.trunk.trunk_id = trunk_id @@ -56,7 +68,7 @@ def provision_trunk(subscription: TrunkProvisioning, trunk_name: str) -> State: @workflow( "Create trunk", - initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), + initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.CREATE, ) def create_trunk(): diff --git a/geant_service_orchestrator/workflows/trunk/terminate_trunk.py b/geant_service_orchestrator/workflows/trunk/terminate_trunk.py index cfb0e43147b3c2f1210342d670605fe656a62bfe..28277aa42a387a92d1bcaa7b19401f8aecba59be 100644 --- a/geant_service_orchestrator/workflows/trunk/terminate_trunk.py +++ b/geant_service_orchestrator/workflows/trunk/terminate_trunk.py @@ -3,17 +3,21 @@ 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.steps \ + import resync, set_status, store_process_subscription, unsync from orchestrator.workflows.utils import wrap_modify_initial_input_form -from products import Trunk +from geant_service_orchestrator.products import Trunk -def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm: +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 + are_you_sure: Label = 'Are you sure you want to remove ' \ + f'{subscription.description}?' # type:ignore return TerminateForm @@ -29,7 +33,7 @@ def deprovision_trunk(subscription: Trunk) -> None: @workflow( "Terminate trunk", - initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.TERMINATE, ) def terminate_trunk(): @@ -42,4 +46,4 @@ def terminate_trunk(): >> set_status(SubscriptionLifecycle.TERMINATED) >> resync >> done - ) \ No newline at end of file + ) diff --git a/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py b/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py index 6338f7704d0915ce54d3ca54c67e80f2c3beabbc..4dafee56cbca9aa1000d5d5bb6270ebe94c0fb31 100644 --- a/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py +++ b/geant_service_orchestrator/workflows/trunk_config/create_trunk_config.py @@ -1,18 +1,22 @@ -from typing import List, Optional +import random +from typing import List from uuid import uuid4 -from random import randint from orchestrator.db.models import ProductTable, SubscriptionTable from orchestrator.forms import FormPage from orchestrator.forms.validators import Choice, choice_list from orchestrator.targets import Target -from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr +from orchestrator.types \ + import FormGenerator, State, SubscriptionLifecycle, UUIDstr from orchestrator.workflow import done, init, step, workflow -from orchestrator.workflows.steps import resync, set_status, store_process_subscription +from orchestrator.workflows.steps \ + import resync, set_status, store_process_subscription from orchestrator.workflows.utils import wrap_create_initial_input_form -from products.product_types.trunk_config import TrunkConfigInactive, TrunkConfigProvisioning -from products.product_types.trunk import Trunk +from geant_service_orchestrator.products.product_types.trunk_config \ + import TrunkConfigInactive, TrunkConfigProvisioning +from geant_service_orchestrator.products.product_types.trunk \ + import Trunk def trunk_selector() -> list: @@ -23,13 +27,17 @@ def trunk_selector() -> list: ProductTable.product_type == "Trunk", SubscriptionTable.status == "active", ) - .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description) + .with_entities( + SubscriptionTable.subscription_id, + SubscriptionTable.description) .all() ): trunk_subscriptions[str(trunk_id)] = trunk_description return choice_list( - Choice("TrunkEnum", zip(trunk_subscriptions.keys(), trunk_subscriptions.items())), # type:ignore + Choice("TrunkEnum", zip( + trunk_subscriptions.keys(), + trunk_subscriptions.items())), # type:ignore min_items=1, max_items=1, ) @@ -56,20 +64,30 @@ def _provision_in_gap() -> int: def create_subscription(product: UUIDstr) -> State: subscription = TrunkConfigInactive.from_product_id(product, uuid4()) - return {"subscription": subscription, "subscription_id": subscription.subscription_id} + return { + "subscription": subscription, + "subscription_id": subscription.subscription_id + } @step("Initialize subscription") -def initialize_subscription(subscription: TrunkConfigInactive, trunk_ids: List[str]) -> State: - subscription.trunk_config.trunk = Trunk.from_subscription(trunk_ids[0]).trunk - subscription.description = f"TrunkConfig from Trunk {subscription.trunk_config.trunk.trunk_name}" - subscription = TrunkConfigProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING) +def initialize_subscription( + subscription: TrunkConfigInactive, + trunk_ids: List[str]) -> State: + subscription.trunk_config.trunk \ + = Trunk.from_subscription(trunk_ids[0]).trunk + subscription.description =\ + "TrunkConfig from Trunk " \ + f"{subscription.trunk_config.trunk.trunk_name}" + subscription = TrunkConfigProvisioning.from_other_lifecycle( + subscription, SubscriptionLifecycle.PROVISIONING) return {"subscription": subscription} @step("Provision trunk config") -def provision_trunk_config(subscription: TrunkConfigProvisioning) -> State: +def provision_trunk_config( + subscription: TrunkConfigProvisioning) -> State: trunk_config_id = _provision_in_gap() subscription.trunk_config.trunk_config_id = trunk_config_id @@ -78,7 +96,7 @@ def provision_trunk_config(subscription: TrunkConfigProvisioning) -> State: @workflow( "Create trunk config", - initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), + initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.CREATE, ) def create_trunk_config(): diff --git a/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py b/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py index 2d4d6cb689da21992218dcf41693734fb6f987a4..9671b56352debc4e822a119f334fea407b8d52dc 100644 --- a/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py +++ b/geant_service_orchestrator/workflows/trunk_config/terminate_trunk_config.py @@ -3,17 +3,22 @@ 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.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: +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 + are_you_sure: Label = \ + "Are you sure you want to remove " \ + f"{subscription.description}?" # type:ignore return TerminateForm @@ -29,7 +34,7 @@ def deprovision_trunk_config(subscription: TrunkConfig) -> None: @workflow( "Terminate trunk config", - initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.TERMINATE, ) def terminate_trunk_config(): @@ -42,4 +47,4 @@ def terminate_trunk_config(): >> set_status(SubscriptionLifecycle.TERMINATED) >> resync >> done - ) \ No newline at end of file + ) diff --git a/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py b/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py index 0673d2f7349b2747702d4be007e82dc676e0dc3a..77640c4e7a6cc3d5657df749373a0c117cc8c9e1 100644 --- a/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py +++ b/geant_service_orchestrator/workflows/trunk_config_common/create_trunk_config_common.py @@ -1,3 +1,4 @@ +import random from typing import List, Optional from uuid import uuid4 @@ -5,13 +6,17 @@ from orchestrator.db.models import ProductTable, SubscriptionTable from orchestrator.forms import FormPage from orchestrator.forms.validators import Choice, choice_list from orchestrator.targets import Target -from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr +from orchestrator.types \ + import FormGenerator, State, SubscriptionLifecycle, UUIDstr from orchestrator.workflow import done, init, step, workflow -from orchestrator.workflows.steps import resync, set_status, store_process_subscription +from orchestrator.workflows.steps \ + import resync, set_status, store_process_subscription from orchestrator.workflows.utils import wrap_create_initial_input_form -from products.product_types.trunk_config_common import TrunkConfigCommonInactive, TrunkConfigCommonProvisioning -from products.product_types.trunk_config import TrunkConfig +from geant_service_orchestrator.products.product_types.trunk_config_common \ + import TrunkConfigCommonInactive, TrunkConfigCommonProvisioning +from geant_service_orchestrator.products.product_types.trunk_config \ + import TrunkConfig def trunk_config_selector() -> list: @@ -22,13 +27,18 @@ def trunk_config_selector() -> list: ProductTable.product_type == "TrunkConfig", SubscriptionTable.status == "active", ) - .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description) + .with_entities( + SubscriptionTable.subscription_id, + SubscriptionTable.description) .all() ): - trunk_config_subscriptions[str(trunk_config_id)] = trunk_config_description + trunk_config_subscriptions[ + str(trunk_config_id)] = trunk_config_description return choice_list( - Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())), # type:ignore + Choice("TrunkConfigEnum", zip( + trunk_config_subscriptions.keys(), + trunk_config_subscriptions.items())), # type:ignore min_items=1, max_items=1, ) @@ -38,15 +48,13 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: class CreateTrunkConfigForm(FormPage): class Config: title = product_name - speed: str is_leased_line: Optional[bool] isis_metric: int minimum_links: int trunk_config_ids: trunk_config_selector() # type:ignore - user_input = yield CreateTrunkConfigCommonForm - + user_input = yield CreateTrunkConfigForm return user_input.dict() @@ -57,35 +65,52 @@ def _provision_in_gap() -> int: @step("Create subscription") def create_subscription(product: UUIDstr) -> State: - subscription = TrunkConfigCommonInactive.from_product_id(product, uuid4()) + subscription \ + = TrunkConfigCommonInactive.from_product_id(product, uuid4()) - return {"subscription": subscription, "subscription_id": subscription.subscription_id} + return { + "subscription": subscription, + "subscription_id": subscription.subscription_id + } @step("Initialize subscription") -def initialize_subscription(subscription: TrunkConfigCommonInactive, speed: str, is_leased_line: bool, isis_metric: int, minimum_links: int, trunk_config_ids: List[str]) -> State: +def initialize_subscription( + subscription: TrunkConfigCommonInactive, + speed: str, + is_leased_line: bool, + isis_metric: int, + minimum_links: int, + trunk_config_ids: List[str]) -> State: subscription.trunk_config_common.speed = speed subscription.trunk_config_common.is_leased_line = is_leased_line subscription.trunk_config_common.isis_metric = isis_metric subscription.trunk_config_common.minimum_links = minimum_links - subscription.trunk_config_common.trunk_config = TrunkConfig.from_subscription(trunk_config_ids[0]).trunk_config - subscription.description = f"TrunkConfigCommon from TrunkConfig {subscription.trunk_config_common.trunk_config.trunk_config_id}" - subscription = TrunkConfigCommonProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING) + subscription.trunk_config_common.trunk_config \ + = TrunkConfig.from_subscription( + trunk_config_ids[0]).trunk_config + subscription.description = \ + "TrunkConfigCommon from TrunkConfig " \ + f"{subscription.trunk_config_common.trunk_config.trunk_config_id}" + subscription = TrunkConfigCommonProvisioning.from_other_lifecycle( + subscription, SubscriptionLifecycle.PROVISIONING) return {"subscription": subscription} @step("Provision trunk config common") -def provision_trunk_config_common(subscription: TrunkConfigCommonProvisioning) -> State: +def provision_trunk_config_common( + subscription: TrunkConfigCommonProvisioning) -> State: trunk_config_common_id = _provision_in_gap() - subscription.trunk_config_common.trunk_config_common_id = trunk_config_common_id + subscription.trunk_config_common.trunk_config_common_id \ + = trunk_config_common_id return {"subscription": subscription} @workflow( "Create trunk config common", - initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), + initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.CREATE, ) def create_trunk_config_common(): diff --git a/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py b/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py index b92da2476a7da36556c9334c9c3671bf49bb996d..976fe5925f3354539813126bb1487f22a0a51f9d 100644 --- a/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py +++ b/geant_service_orchestrator/workflows/trunk_config_common/terminate_trunk_config_common.py @@ -3,17 +3,22 @@ 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.steps \ + import resync, set_status, store_process_subscription, unsync from orchestrator.workflows.utils import wrap_modify_initial_input_form -from products import TrunkConfigCommon +from geant_service_orchestrator.products import TrunkConfigCommon -def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm: +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 + are_you_sure: Label = \ + "Are you sure you want to remove " \ + f"{subscription.description}?" # type:ignore return TerminateForm @@ -23,13 +28,15 @@ def _deprovision_in_gap(trunk_config_common_id: int) -> int: @step("Deprovision trunk config common") -def deprovision_trunk_config_common(subscription: TrunkConfigCommon) -> None: - _deprovision_in_gap(subscription.trunk_config_common.trunk_config_common_id) +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), + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.TERMINATE, ) def terminate_trunk_config_common(): @@ -42,4 +49,4 @@ def terminate_trunk_config_common(): >> set_status(SubscriptionLifecycle.TERMINATED) >> resync >> done - ) \ No newline at end of file + ) diff --git a/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py b/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py index d5da830d977ebaf50f9ed614ec6c0142d565f52f..19b50f8c9936c08034ef5d31cda62fcc3b359516 100644 --- a/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py +++ b/geant_service_orchestrator/workflows/trunk_config_side/create_trunk_config_side.py @@ -5,13 +5,17 @@ from orchestrator.db.models import ProductTable, SubscriptionTable from orchestrator.forms import FormPage from orchestrator.forms.validators import Choice, choice_list from orchestrator.targets import Target -from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr +from orchestrator.types \ + import FormGenerator, State, SubscriptionLifecycle, UUIDstr from orchestrator.workflow import done, init, step, workflow -from orchestrator.workflows.steps import resync, set_status, store_process_subscription +from orchestrator.workflows.steps \ + import resync, set_status, store_process_subscription from orchestrator.workflows.utils import wrap_create_initial_input_form -from products.product_types.trunk_config_side import TrunkConfigSideInactive, TrunkConfigSideProvisioning -from products.product_types.trunk_config import TrunkConfig +from geant_service_orchestrator.products.product_types.trunk_config_side \ + import TrunkConfigSideInactive, TrunkConfigSideProvisioning +from geant_service_orchestrator.products.product_types.trunk_config \ + import TrunkConfig def trunk_config_selector() -> list: @@ -22,20 +26,25 @@ def trunk_config_selector() -> list: ProductTable.product_type == "TrunkConfig", SubscriptionTable.status == "active", ) - .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description) + .with_entities( + SubscriptionTable.subscription_id, + SubscriptionTable.description) .all() ): - trunk_config_subscriptions[str(trunk_config_id)] = trunk_config_description + trunk_config_subscriptions[ + str(trunk_config_id)] = trunk_config_description return choice_list( - Choice("TrunkConfigEnum", zip(trunk_config_subscriptions.keys(), trunk_config_subscriptions.items())), # type:ignore + Choice("TrunkConfigEnum", zip( + trunk_config_subscriptions.keys(), + trunk_config_subscriptions.items())), # type:ignore min_items=1, max_items=1, ) def initial_input_form_generator(product_name: str) -> FormGenerator: - class CreateTrunkConfigForm(FormPage): + class CreateTrunkConfigCommonForm(FormPage): class Config: title = product_name @@ -47,40 +56,56 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: members: Optional[list] trunk_config_ids: trunk_config_selector() # type:ignore - user_input = yield CreateTrunkConfigSideForm + user_input = yield CreateTrunkConfigCommonForm return user_input.dict() def _provision_in_gap(fqdn: str) -> int: - return abs(hash(fqdn)) @step("Create subscription") def create_subscription(product: UUIDstr) -> State: - subscription = TrunkConfigSideInactive.from_product_id(product, uuid4()) + subscription \ + = TrunkConfigSideInactive.from_product_id(product, uuid4()) - return {"subscription": subscription, "subscription_id": subscription.subscription_id} + return { + "subscription": subscription, + "subscription_id": subscription.subscription_id + } @step("Initialize subscription") -def initialize_subscription(subscription: TrunkConfigSideInactive, fqdn: str, ae_name: str, geant_a_sid: str, ipv4_address: str, ipv6_address: str, members: list, trunk_config_ids: List[str]) -> State: +def initialize_subscription( + subscription: TrunkConfigSideInactive, + fqdn: str, + ae_name: str, + geant_a_sid: str, + ipv4_address: str, + ipv6_address: str, + members: list, + trunk_config_ids: List[str]) -> State: subscription.trunk_config_side.fqdn = fqdn subscription.trunk_config_side.ae_name = ae_name subscription.trunk_config_side.geant_a_sid = geant_a_sid subscription.trunk_config_side.ipv4_address = ipv4_address subscription.trunk_config_side.ipv6_address = ipv6_address subscription.trunk_config_side.members = members - subscription.trunk_config_side.trunk_config = TrunkConfig.from_subscription(trunk_config_ids[0]).trunk_config - subscription.description = f"TrunkConfigSide from TrunkConfig {subscription.trunk_config_side.trunk_config.trunk_config_id}" - subscription = TrunkConfigSideProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING) + subscription.trunk_config_side.trunk_config \ + = TrunkConfig.from_subscription(trunk_config_ids[0]).trunk_config + subscription.description = \ + "TrunkConfigSide from TrunkConfig " \ + f"{subscription.trunk_config_side.trunk_config.trunk_config_id}" + subscription = TrunkConfigSideProvisioning.from_other_lifecycle( + subscription, SubscriptionLifecycle.PROVISIONING) return {"subscription": subscription} @step("Provision trunk config side") -def provision_trunk_config_side(subscription: TrunkConfigSideProvisioning, fqdn: str) -> State: +def provision_trunk_config_side( + subscription: TrunkConfigSideProvisioning, fqdn: str) -> State: trunk_config_side_id = _provision_in_gap(fqdn) subscription.trunk_config_side.trunk_config_side_id = trunk_config_side_id @@ -89,7 +114,7 @@ def provision_trunk_config_side(subscription: TrunkConfigSideProvisioning, fqdn: @workflow( "Create trunk config side", - initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), + initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.CREATE, ) def create_trunk_config_side(): diff --git a/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py b/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py index a9a29e1f420c73e93392576bc6ba43e3caf2e5db..bed443092e2601c74163393458ce8e52c060dc26 100644 --- a/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py +++ b/geant_service_orchestrator/workflows/trunk_config_side/terminate_trunk_config_side.py @@ -3,17 +3,22 @@ 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.steps \ + import resync, set_status, store_process_subscription, unsync from orchestrator.workflows.utils import wrap_modify_initial_input_form -from products import TrunkConfigSide +from geant_service_orchestrator.products import TrunkConfigSide -def initial_input_form_generator(subscription_id: UUIDstr, organisation: UUIDstr) -> InputForm: +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 + are_you_sure: Label = \ + "Are you sure you want to remove " \ + f"{subscription.description}?" # type:ignore return TerminateForm @@ -23,13 +28,14 @@ def _deprovision_in_gap(trunk_config_side_id: int) -> int: @step("Deprovision trunk config side") -def deprovision_trunk_config_side(subscription: TrunkConfigSide) -> None: +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), + initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), # noqa: E501 target=Target.TERMINATE, ) def terminate_trunk_config_side(): @@ -42,4 +48,4 @@ def terminate_trunk_config_side(): >> set_status(SubscriptionLifecycle.TERMINATED) >> resync >> done - ) \ No newline at end of file + ) diff --git a/requirements.txt b/requirements.txt index 0ec76021395f5f7b8b484217be1246649d93d39f..5b0787674542104bfce569a6a6c79d9ee40b2351 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,3 @@ orchestrator-core + +pytest diff --git a/test/test_placeholder.py b/test/test_placeholder.py new file mode 100644 index 0000000000000000000000000000000000000000..e07460e2644214a04d3a149b0cf18c7de7367467 --- /dev/null +++ b/test/test_placeholder.py @@ -0,0 +1,4 @@ +# just a placeholder to be able to run tests during ci + +def test_placeholder(): + pass diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000000000000000000000000000000000000..733d4a3712c670ce5d2a16107a74386366c606bb --- /dev/null +++ b/tox.ini @@ -0,0 +1,18 @@ +[flake8] +exclude = venv,.tox, migrations + +[testenv] +deps = + coverage + flake8 + -r requirements.txt + +commands = + coverage erase + coverage run --source geant_service_orchestrator -m pytest {posargs} + coverage xml + coverage html + # coverage report --fail-under 80 + coverage report + flake8 +