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 zcmYc?2=nw+u+TGPU|?VnU|`7bJ(|4nGdII2ekO*}q|&^SQji3GoSvGPSE5^<mXBW< zLmk9G{qp>x?6jQxa^3u*<c!qflA^?t{35t$v3^cwUTS=DVo{2Ia#3nxNoqV?K(C;Z zfE}aKqaiRF0$4(zv?NW}f|tSA$j|^JtE{A`AS@ILVvgd`5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C5fTC=1&j>!3=9lRQ2&NQX+|^}${nRfLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz5lV2qdO3Fa$6&Fq~k4%>Tps|1bC%7%uWNFkIkgVCdy%U`XX> zU{L30VEE6+z_6N+fgz8NfkBLqf#Do41H)Nf28K#r1_mEq1_p0l1_m!)1_oVT1_nW1 z28KU83=AiE7#Mc&Ffg?9FffGjFfe%YFfe@LW?*>C&A@Pnn}J~^Hv_{8ZU%-4+zbqw z+zbpN+zbr=xfmFJaxpOc;9_9-&c(p6k&A(00~Z5B2NwfF5f=kPAQuBe02c#;JQo9l z92Wz_drk(1cbp6iXE+%cPIEFaoZ@6)Sj)-4P|3-_V9d$DV8qG5aGisJ;Ti`6!&VLk zhA0jO25t@phWqRc3<c~A4EgK~46f`93@+>p4C?F*3=i2D7<RKUFto5SFf_9<Ff_3- zFf_6;FqE+|FvPJjFmSRlFuZ4FV0g>Qz;Kn7f#C`(1H*Av28La%3=Feb85q)785o>d z85mSp85lmWFfiO>VPH7N0uAROm`+BWJQ@OnIRq3G6cjWWKqLs;*(s#t=cOX^i&Bd# z^OBK8ic?GCi%SwqN{cmuOOuL|i!uvJGV}9%GSgC%E0c3l^&Fi;Ji}a3Of4wNFUu^> z%+EutNkTR<GcU6wGchN#DmA_s$w*`+#U=SgsqqCx`N^rp#VD#YLK2J8Q%m%mgIpa$ zP_2cogTiVi$WE{YMX4pFMR^Ju3=Ao$X$nv+@TF54npO-DuatnTu|=^>2W$e!sLaHi z_{_Y5(vtYJ{Gwdj@}k6oc&J&J(i)gT@#(2~so)h|nh-;koWYB@6hJOf0Ilj$(qV9b zEdkR2r72L1A$v^^q!hdW48e-eOi{1}n*o-H&rAWk7_Jf`pO{pvk&#%Op;20znPQ@$ zsi_GL3oNmwfo!3bf=^~%s&isdN&qZ=GxO3l6?E+sf=d!hQmq&qic3-pG?d`dV3$CA zqsahv2{iPpm5>cqvQj|i)<Tpb3n|!QwOcQ(C_gtoza%5IC_V?4AW__`qkuip1_b$s zc?Ns>`+54gL*g6RI=z%sctTgORY+3;c^u*ourE;5!UI<?FFz$Uz9=<K!B)X9KP467 zI%KsPU=^7u#nA?_nqcMNfQKdz^!$M05k%m7<|QVVWR|7sD8Nhu$rYDGXXcf}Vu=k; zcy2=pWhD|~L`MN7zTz`e(4tHa*_ZK|Dfpuh<^xCo6%^&ClqQ$NXQpUCnK}xvgb5BF zXud+W0;bYRAvDy}rMRRBi@%{63RxS-&)^7zCPR4CLGrR*N@jA21~gpI<P>ZbDl=1a zQWPM@f)WHMC%EMo<wBAxD0?Cz1k5T<%}Grz$uH8-R8UY>D5)$+waQG-%P&er=m6;| z$t=l9Rj^fn`aV7{F&9xLC+8#<7b`gD=cQ$)TY=pU6#*9)$j;CJxg{VmJyp{RQno>p z6~u4gatcxEzyc6#nUw-81VKi)!%8MA28cT$`2*zA+{B9b%#zgHVp~H<sRb6y%)=CP z&dAS9PSsEX<pbBe(p)7Sg{sT~Ncu;Pkz&2<)XHKFO=x09l>%D@DxP%E!w+OHG!B!& zHpS;;7MEy1+zXO~gg;W{QXE}eQUtL-Get92!4{T#z+tKh30ja&y~Lax4TP8V$}>wc z;#2cVGD|X3QLDg^#H5^5^puZU;6Rihl_m&-5iF3c$fXoS6Qs^nu(efCg5-B4M394Y z1VFM4L@_MsfYKOP3n<)?H0Y&e=9HusX@ETo(v4|fVQFenrCwHkW}XJJ(GX{*<rl%i zOCb|fd4kNq3}Xdbh3Z;xo`uLE(!Z{q0w{(+NeWbE!_s=O9<s}e!9}7%W^O@#Q3<#R zWx%Hxo<m_eV7UQSzUW}BG#DU;BCo2}gH^P}dZi_qImIvo@mK43%>mVfaC0E7Djfwx zTS`X(cMAuPxiE);nr%7?pbQQ&D78RG0p<fNnn8&I?i7?9t^=vKQPV8EWv2rxT(Ox6 zZXLl*g|w2er~|c*iuKA8b23vv%h%x=AmxLO0#fe9r5omFkjp{E8y0mbNqV{YDXEBv lLr%e{z60kMXc7R`GBDFYY!islC6xu4dFe0-pUmPC1^`IvJb?fJ 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