diff --git a/gso/products/product_blocks/device.py b/gso/products/product_blocks/device.py index 6e8b8ee17c182a3fe1854e7c6d1e9dd8de55eedd..7b8dd707abcfea46df3e01a54982414e02a77c69 100644 --- a/gso/products/product_blocks/device.py +++ b/gso/products/product_blocks/device.py @@ -6,15 +6,18 @@ from gso.products.product_blocks.site \ import SiteBlock, SiteBlockInactive, SiteBlockProvisioning import ipaddress + class DeviceVendor(strEnum): juniper = "juniper" nokia = "nokia" + class DeviceRole(strEnum): p = "p" pe = "pe" amt = "amt" + class DeviceBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="DeviceBlock"): @@ -47,6 +50,7 @@ class DeviceBlockProvisioning(DeviceBlockInactive, device_role: Optional[DeviceRole] = None device_site: Optional[SiteBlockProvisioning] + class DeviceBlock(DeviceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): device_fqdn: str diff --git a/gso/products/product_blocks/site.py b/gso/products/product_blocks/site.py index 69651a932fecf9faab61d7dbadbe17d849521d6a..28594041f0df562d4d10c4b93ab846af1bd89139 100644 --- a/gso/products/product_blocks/site.py +++ b/gso/products/product_blocks/site.py @@ -1,10 +1,8 @@ from typing import Optional -from pydantic import Field from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle, strEnum -import ipaddress class SiteTier(strEnum): tier1 = 1 @@ -14,8 +12,8 @@ class SiteTier(strEnum): class SiteBlockInactive(ProductBlockModel, - lifecycle=[SubscriptionLifecycle.INITIAL], - product_block_name="SiteBlock"): + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="SiteBlock"): site_name: Optional[str] = None site_city: Optional[str] = None site_country: Optional[str] = None @@ -26,6 +24,7 @@ class SiteBlockInactive(ProductBlockModel, site_bgp_community_id: Optional[int] = None site_tier: Optional[SiteTier] = None + class SiteBlockProvisioning(SiteBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): site_name: Optional[str] = None @@ -38,8 +37,9 @@ class SiteBlockProvisioning(SiteBlockInactive, site_bgp_community_id: Optional[int] = None site_tier: Optional[SiteTier] = None + class SiteBlock(SiteBlockProvisioning, - lifecycle=[SubscriptionLifecycle.ACTIVE]): + lifecycle=[SubscriptionLifecycle.ACTIVE]): site_name: str site_city: str site_country: str diff --git a/gso/products/product_types/site.py b/gso/products/product_types/site.py index 003e37d4962fbd8ac45b0d0d3e46fa4340ffb53a..8c3379c917812600e875243938645010a386ea42 100644 --- a/gso/products/product_types/site.py +++ b/gso/products/product_types/site.py @@ -1,5 +1,5 @@ from orchestrator.domain.base import SubscriptionModel -from orchestrator.types import SubscriptionLifecycle, strEnum +from orchestrator.types import SubscriptionLifecycle from gso.products.product_blocks.site \ import SiteBlock, SiteBlockInactive, SiteBlockProvisioning @@ -10,9 +10,9 @@ class SiteInactive(SubscriptionModel, is_base=True): class SiteProvisioning(SiteInactive, - lifecycle=[SubscriptionLifecycle.PROVISIONING]): + lifecycle=[SubscriptionLifecycle.PROVISIONING]): site: SiteBlockProvisioning class Site(SiteProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): - site: SiteBlock \ No newline at end of file + site: SiteBlock diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py index dc7eff8caa15e8d33f85ba62db95a5ead5005bc5..7897465dd0b6ca13bc9998b2eb21723abaf06ebc 100644 --- a/gso/workflows/device/create_device.py +++ b/gso/workflows/device/create_device.py @@ -18,6 +18,7 @@ from orchestrator.forms.validators import Choice, choice_list from gso.products.product_types.site import Site # from gso.services import ipam, provisioning_proxy + def site_selector() -> list: site_subscriptions = {} for site_id, site_description in ( @@ -33,12 +34,14 @@ def site_selector() -> list: site_subscriptions[str(site_id)] = site_description return choice_list( - Choice("site_selection", zip(site_subscriptions.keys(), - site_subscriptions.items())), # type:ignore + Choice("site_selection", + zip(site_subscriptions.keys(), + site_subscriptions.items())), # type:ignore min_items=1, max_items=1, ) + def initial_input_form_generator(product_name: str) -> FormGenerator: class CreateDeviceForm(FormPage): class Config: @@ -74,14 +77,14 @@ def get_info_from_ipam(subscription: device.DeviceInactive) -> State: # TODO: get info about how these should be generated subscription.device.device_lo_ipv4_address = "10.10.10.10" subscription.device.device_lo_ipv6_address = "fc00:798:10::10" - subscription.device.device_lo_iso_address = "49.51e5.0001.0620.4009.6047.00" + subscription.device.device_lo_iso_address \ + = "49.51e5.0001.0620.4009.6047.00" subscription.device.device_si_ipv4_network = "192.168.0.0/31" subscription.device.device_ias_lt_ipv4_network = "192.168.1.0/31" subscription.device.device_ias_lt_ipv6_network = "fc00:798:1::150/126" return {"subscription": subscription} - @step("Initialize subscription") def initialize_subscription( subscription: device.DeviceInactive, @@ -89,14 +92,15 @@ def initialize_subscription( ts_address: ipaddress.IPv4Address, ts_port: str, device_vendor: device_pb.DeviceVendor, - device_site: str, + device_site: str, device_role: device_pb.DeviceRole ) -> State: subscription.device.device_fqdn = fqdn subscription.device.device_ts_address = str(ts_address) subscription.device.device_ts_port = str(ts_port) subscription.device.device_vendor = device_vendor - subscription.device.device_site = Site.from_subscription(device_site[0]).site + subscription.device.device_site \ + = Site.from_subscription(device_site[0]).site subscription.device.device_role = device_role subscription.description = f"Device {fqdn} type \ ({subscription.device_type})" diff --git a/gso/workflows/site/create_site.py b/gso/workflows/site/create_site.py index 8ae5400bc5ea6476a776b4dfbf6e045211c9ef9d..a1642ef75e2f583dabeb153b305c17e51d3eff19 100644 --- a/gso/workflows/site/create_site.py +++ b/gso/workflows/site/create_site.py @@ -2,8 +2,8 @@ from uuid import uuid4 from orchestrator.forms import FormPage from orchestrator.targets import Target -from orchestrator.workflow import inputstep -from orchestrator.forms.validators import Accept +# from orchestrator.workflow import inputstep +# from orchestrator.forms.validators import Accept from orchestrator.types import FormGenerator, State from orchestrator.types import SubscriptionLifecycle, UUIDstr from orchestrator.workflow import done, init, step, workflow @@ -29,7 +29,6 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: site_internal_id: int site_tier: site_pb.SiteTier - user_input = yield CreateSiteForm return user_input.dict() @@ -59,14 +58,14 @@ def initialize_subscription( site_tier: site_pb.SiteTier ) -> State: subscription.site.site_name = site_name - subscription.site.site_city = site_city - subscription.site.site_country = site_country - subscription.site.site_country_code = site_country_code - subscription.site.site_latitude = site_longitude - subscription.site.site_longitude = site_latitude - subscription.site.site_bgp_community_id = site_bgp_community_id - subscription.site.site_internal_id = site_internal_id - subscription.site.site_tier = site_tier + subscription.site.site_city = site_city + subscription.site.site_country = site_country + subscription.site.site_country_code = site_country_code + subscription.site.site_latitude = site_longitude + subscription.site.site_longitude = site_latitude + subscription.site.site_bgp_community_id = site_bgp_community_id + subscription.site.site_internal_id = site_internal_id + subscription.site.site_tier = site_tier subscription.description = f"Site {site_name}"