Skip to content
Snippets Groups Projects

Update initial form for IP trunk creation

Closed Karel van Klink requested to merge feature/multi-step-ip-trunk-form into develop
1 file
+ 9
5
Compare changes
  • Side-by-side
  • Inline
@@ -3,7 +3,7 @@ from uuid import uuid4
from orchestrator.db.models import ProductTable, SubscriptionTable
# noinspection PyProtectedMember
from orchestrator.forms import FormPage
from orchestrator.forms.validators import Choice, choice_list
from orchestrator.forms.validators import Choice, UniqueConstrainedList
from orchestrator.targets import Target
from orchestrator.types import FormGenerator, State
from orchestrator.types import SubscriptionLifecycle, UUIDstr
@@ -12,6 +12,7 @@ from orchestrator.workflows.steps import resync, set_status
from orchestrator.workflows.steps import store_process_subscription
from orchestrator.workflows.utils import wrap_create_initial_input_form
from gso.products.product_blocks import PhyPortCapacity
from gso.products.product_blocks.iptrunk import IptrunkType
from gso.products.product_types.device import Device
from gso.products.product_types.iptrunk import IptrunkInactive, \
@@ -22,11 +23,14 @@ from gso.services.provisioning_proxy import confirm_pp_results, \
await_pp_results
def device_selector(choice_value: str) -> list:
device_subscriptions = {}
def initial_input_form_generator(product_name: str) -> FormGenerator:
# TODO: we need additional validation:
# * interface names must be validated
devices = {}
for device_id, device_description in (
SubscriptionTable.query.join(ProductTable)
.filter(
.filter(
ProductTable.product_type == 'Device',
SubscriptionTable.status == 'active',
)
@@ -34,18 +38,8 @@ def device_selector(choice_value: str) -> list:
SubscriptionTable.description)
.all()
):
device_subscriptions[str(device_id)] = device_description
# noinspection PyTypeChecker
return choice_list(
Choice(choice_value, zip(device_subscriptions.keys(),
device_subscriptions.items())), # type:ignore
min_items=1,
max_items=1,
)
devices[str(device_id)] = device_description
def initial_input_form_generator(product_name: str) -> FormGenerator:
class CreateIptrunkForm(FormPage):
class Config:
title = product_name
@@ -53,31 +47,51 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
geant_s_sid: str
iptrunk_description: str
iptrunk_type: IptrunkType
iptrunk_speed: str # This should be an enum: 1/10/100/400
iptrunk_speed: PhyPortCapacity
iptrunk_minimum_links: int
iptrunk_sideA_node_id: device_selector(
choice_value='DeviceEnumA') # noqa: F821
initial_user_input = yield CreateIptrunkForm
class AeMembersListA(UniqueConstrainedList[str]):
min_items = initial_user_input.iptrunk_minimum_links
DeviceEnumA = Choice('Device A', zip(devices.keys(), devices.items()))
class CreateIptrunkSideAForm(FormPage):
class Config:
title = 'Provide subscription details for side A of the trunk.'
iptrunk_sideA_node_id: DeviceEnumA
iptrunk_sideA_ae_iface: str
iptrunk_sideA_ae_geant_a_sid: str
iptrunk_sideA_ae_members: list[str]
iptrunk_sideA_ae_members_descriptions: list[str]
iptrunk_sideA_ae_members: AeMembersListA
iptrunk_sideA_ae_members_descriptions: AeMembersListA
user_input_side_a = yield CreateIptrunkSideAForm
# We remove the selected device for side A, to prevent any loops
devices.pop(str(user_input_side_a.iptrunk_sideA_node_id.name))
DeviceEnumB = Choice('Device B', zip(devices.keys(), devices.items()))
iptrunk_sideB_node_id: device_selector(
choice_value='DeviceEnumB') # noqa: F821
class AeMembersListB(UniqueConstrainedList[str]):
min_items = len(user_input_side_a.iptrunk_sideA_ae_members)
max_items = len(user_input_side_a.iptrunk_sideA_ae_members)
class CreateIptrunkSideBForm(FormPage):
class Config:
title = 'Provide subscription details for side B of the trunk.'
iptrunk_sideB_node_id: DeviceEnumB
iptrunk_sideB_ae_iface: str
iptrunk_sideB_ae_geant_a_sid: str
iptrunk_sideB_ae_members: list[str]
iptrunk_sideB_ae_members_descriptions: list[str]
# TODO: we need additional validation:
# * sideA fqdn must be different from sideB fqdn
# * the length of iptrunk_sideA_ae_members should
# be the same as iptrunk_sideB_ae_members
# * interface names must be validated
iptrunk_sideB_ae_members: AeMembersListB
iptrunk_sideB_ae_members_descriptions: AeMembersListB
user_input = yield CreateIptrunkForm
user_input_side_b = yield CreateIptrunkSideBForm
return user_input.dict()
return initial_user_input.dict() | \
user_input_side_a.dict() | \
user_input_side_b.dict()
@step('Create subscription')
@@ -131,8 +145,8 @@ def initialize_subscription(
subscription.iptrunk.iptrunk_isis_metric = 9000
subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links
subscription.iptrunk.iptrunk_sideA_node = Device.from_subscription(
iptrunk_sideA_node_id[0]).device
subscription.iptrunk.iptrunk_sideA_node = \
Device.from_subscription(iptrunk_sideA_node_id).device
subscription.iptrunk.iptrunk_sideA_ae_iface = iptrunk_sideA_ae_iface
subscription.iptrunk.iptrunk_sideA_ae_geant_a_sid \
= iptrunk_sideA_ae_geant_a_sid
@@ -140,8 +154,8 @@ def initialize_subscription(
subscription.iptrunk.iptrunk_sideA_ae_members_description \
= iptrunk_sideA_ae_members_descriptions
subscription.iptrunk.iptrunk_sideB_node = Device.from_subscription(
iptrunk_sideB_node_id[0]).device
subscription.iptrunk.iptrunk_sideB_node = \
Device.from_subscription(iptrunk_sideB_node_id).device
subscription.iptrunk.iptrunk_sideB_ae_iface \
= iptrunk_sideB_ae_iface
subscription.iptrunk.iptrunk_sideB_ae_geant_a_sid \
Loading