diff --git a/workflows/line_card/.create_line_card.py.swp b/workflows/line_card/.create_line_card.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..4bc4099f8c808eb4832f035ef905610a91ef34b7 Binary files /dev/null and b/workflows/line_card/.create_line_card.py.swp differ diff --git a/workflows/line_card/create_line_card.py b/workflows/line_card/create_line_card.py index 3ff42c8be1e0c0c5e435f68bf147c1672f4e4a66..34f18dea0b92a5d00f75ffc20db352bfc9f542b7 100644 --- a/workflows/line_card/create_line_card.py +++ b/workflows/line_card/create_line_card.py @@ -1,13 +1,52 @@ +from typing import List from uuid import uuid4 +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 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.utils import wrap_create_initial_input_form from products.product_types.line_card import LineCardInactive, LineCardProvisioning from products.product_types.node import Node + +def node_selector() -> list: + node_subscriptions = {} + for node_id in ( + SubscriptionTable.query.join(ProductTable) + .filter( + ProductTable.product_type == "Node", + SubscriptionTable.status == "active", + ) + .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description) + .all() + ): + node_subscriptions[str(node_id)] = node_id + + return choice_list( + Choice("NodeEnum", zip(node_subscriptions.keys(), node_subscriptions.items())), # type:ignore + min_items=1, + max_items=1, + ) + + +def initial_input_form_generator(product_name: str) -> FormGenerator: + + class CreateLineCardForm(FormPage): + class Config: + title = product_name + + node_ids: node_selector() # type:ignore + + line_card_input = yield CreateLineCardForm + + return line_card_input.dict() + + @step("Create subscription") def create_subscription(product: UUIDstr) -> State: subscription = LineCardInactive.from_product_id(product, uuid4()) @@ -15,16 +54,23 @@ def create_subscription(product: UUIDstr) -> State: return {"subscription": subscription, "subscription_id": subscription.subscription_id} @step("Initialize subscription") -def initialize_subscription(subscription: LineCardInactive) -> State: - #subscription.line_card. - pass +def initialize_subscription(subscription: LineCardInactive, node_ids: List[int]) -> State: + subscription.line_card.node_ref = Node.from_subscription(node_ids[0]).node + subscription.description = f"Line card" + subscription = LineCardProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING) + + return {"subscription": subscription} @step("Provision line card") def provision_line_card(subscription: LineCardProvisioning) -> State: - pass + line_card_id = abs(hash(uuid4())) + subscription.line_card.line_card_id = line_card_id + + @workflow( "Create line card", + initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), target=Target.CREATE, ) def create_line_card(): diff --git a/workflows/node/create_node.py b/workflows/node/create_node.py index 01c9b581eb48d6a2272bccc8aa5eafb71bf87584..c123dc89c27109bc12895005b2ef7ff04f9efdb6 100644 --- a/workflows/node/create_node.py +++ b/workflows/node/create_node.py @@ -22,7 +22,7 @@ def initialize_subscription(subscription: NodeInactive) -> State: @step("Provision node") def provision_node(subscription: NodeProvisioning) -> State: - node_id = uuid.uuid4() + node_id = abs(hash(uuid4())) subscription.node.node_id = node_id @workflow( diff --git a/workflows/port/create_port.py b/workflows/port/create_port.py index 529d2cf810f27fc75806c9c320f7212e2fdfa9c6..524c7285ce36edb6745f0babc2b68645171afbd4 100644 --- a/workflows/port/create_port.py +++ b/workflows/port/create_port.py @@ -1,13 +1,55 @@ +from typing import List, Optional from uuid import uuid4 +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 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.utils import wrap_create_initial_input_form from products.product_types.port import PortInactive, PortProvisioning from products.product_types.line_card import LineCard + +def line_card_selector() -> list: + line_card_subscriptions = {} + for line_card_id in ( + SubscriptionTable.query.join(ProductTable) + .filter( + ProductTable.product_type == "LineCard", + SubscriptionTable.status == "active", + ) + .with_entities(SubscriptionTable.subscription_id, SubscriptionTable.description) + .all() + ): + line_card_subscriptions[str(line_card_id)] = line_card_id + + return choice_list( + Choice("NodeEnum", zip(line_card_subscriptions.keys(), line_card_subscriptions.items())), # type:ignore + min_items=1, + max_items=1, + ) + + +def initial_input_form_generator(product_name: str) -> FormGenerator: + + class CreatePortForm(FormPage): + class Config: + title = product_name + + pic: int + position: int + interface: str + line_card_ids: line_card_selector() # type:ignore + + port_input = yield CreatePortForm + + return port.dict() + + @step("Create subscription") def create_subscription(product: UUIDstr) -> State: subscription = PortInactive.from_product_id(product, uuid4()) @@ -15,15 +57,24 @@ def create_subscription(product: UUIDstr) -> State: return {"subscription": subscription, "subscription_id": subscription.subscription_id} @step("Initialize subscription") -def initialize_subscription(subscription: PortInactive) -> State: - pass +def initialize_subscription(subscription: PortInactive, pic: int, position: int, interface: str, line_card_ids: List[int]) -> State: + subscription.port.pic = pic + subscription.port.position = position + subscription.port.interface = interface + subscription.port.line_card_ref = LineCard.from_subscription(line_card_ids[0]).line_card + subscription.description = f"Port" + subscription = LineCardProvisioning.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING) + + return {"subscription": subscription} @step("Provision port") def provision_port(subscription: PortProvisioning) -> State: - pass + port_id = abs(hash(uuid4())) + subscription.port.port_id = port_id @workflow( "Create port", + initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), target=Target.CREATE, ) def create_port():