From 3d4891841ff72893d781645f1a3edab73483f4e8 Mon Sep 17 00:00:00 2001
From: root <jorge.sasiain@ehu.eus>
Date: Mon, 16 Jan 2023 13:19:06 +0000
Subject: [PATCH] Attempt at create workflows for node, line card and port

---
 workflows/line_card/.create_line_card.py.swp | Bin 0 -> 12288 bytes
 workflows/line_card/create_line_card.py      |  56 ++++++++++++++++--
 workflows/node/create_node.py                |   2 +-
 workflows/port/create_port.py                |  59 +++++++++++++++++--
 4 files changed, 107 insertions(+), 10 deletions(-)
 create mode 100644 workflows/line_card/.create_line_card.py.swp

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
GIT binary patch
literal 12288
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

literal 0
HcmV?d00001

diff --git a/workflows/line_card/create_line_card.py b/workflows/line_card/create_line_card.py
index 3ff42c8be..34f18dea0 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 01c9b581e..c123dc89c 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 529d2cf81..524c7285c 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():
-- 
GitLab