From e04bb1b2b7b7a96220a32fffe4d9aa91dc22e879 Mon Sep 17 00:00:00 2001 From: Simone Spinelli <simone.spinelli@geant.org> Date: Wed, 3 May 2023 09:23:33 +0200 Subject: [PATCH] New Device model and site model added --- gso/products/__init__.py | 2 + gso/products/product_blocks/device.py | 92 +++++++++++++-------------- gso/products/product_blocks/site.py | 51 +++++++++++++++ gso/products/product_types/device.py | 7 -- gso/products/product_types/site.py | 18 ++++++ 5 files changed, 117 insertions(+), 53 deletions(-) create mode 100644 gso/products/product_blocks/site.py create mode 100644 gso/products/product_types/site.py diff --git a/gso/products/__init__.py b/gso/products/__init__.py index b8b60c15..857128fb 100644 --- a/gso/products/__init__.py +++ b/gso/products/__init__.py @@ -2,9 +2,11 @@ from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY from gso.products.product_types.device import Device from gso.products.product_types.iptrunk import Iptrunk +from gso.products.product_types.site import Site SUBSCRIPTION_MODEL_REGISTRY.update( { + "Site": Site, "Router": Device, "Switch": Device, "Iptrunk": Iptrunk, diff --git a/gso/products/product_blocks/device.py b/gso/products/product_blocks/device.py index 9e34743f..44581ef5 100644 --- a/gso/products/product_blocks/device.py +++ b/gso/products/product_blocks/device.py @@ -2,62 +2,62 @@ from typing import Optional from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle +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"): - fqdn: Optional[str] = None - ts_address: Optional[str] = None - ts_port: Optional[int] = None - lo_ipv4_address: Optional[ipaddress.IPv4Address] = None - lo_ipv6_address: Optional[ipaddress.IPv6Address] = None - lo_iso_address: Optional[str] = None - si_ipv4_network: Optional[ipaddress.IPv4Network] = None - ias_lt_ipv4_network: Optional[ipaddress.IPv4Network] = None - ias_lt_ipv6_network: Optional[ipaddress.IPv6Network] = None - site_city: Optional[str] = None - site_country: Optional[str] = None - site_country_code: Optional[str] = None - site_latitude: Optional[str] = None - site_longitude: Optional[str] = None - snmp_location: Optional[str] = None + device_fqdn: Optional[str] = None + device_ts_address: Optional[str] = None + device_ts_port: Optional[int] = None + device_lo_ipv4_address: Optional[ipaddress.IPv4Address] = None + device_lo_ipv6_address: Optional[ipaddress.IPv6Address] = None + device_lo_iso_address: Optional[str] = None + device_si_ipv4_network: Optional[ipaddress.IPv4Network] = None + device_ias_lt_ipv4_network: Optional[ipaddress.IPv4Network] = None + device_ias_lt_ipv6_network: Optional[ipaddress.IPv6Network] = None + device_vendor: Optional[DeviceVendor] = None + device_role: Optional[DeviceRole] = None + device_site: Optional[SiteBlockInactive] class DeviceBlockProvisioning(DeviceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): - fqdn: str - ts_address: str - ts_port: str - lo_ipv4_address: Optional[ipaddress.IPv4Address] = None - lo_ipv6_address: Optional[ipaddress.IPv6Address] = None - lo_iso_address: Optional[str] = None - si_ipv4_network: Optional[ipaddress.IPv4Network] = None - ias_lt_ipv4_network: Optional[ipaddress.IPv4Network] = None - ias_lt_ipv6_network: Optional[ipaddress.IPv6Network] = None - site_city: Optional[str] = None - site_country: Optional[str] = None - site_country_code: Optional[str] = None - site_latitude: Optional[str] = None - site_longitude: Optional[str] = None - snmp_location: Optional[str] = None - + device_fqdn: str + device_ts_address: str + device_ts_port: str + device_lo_ipv4_address: Optional[ipaddress.IPv4Address] = None + device_lo_ipv6_address: Optional[ipaddress.IPv6Address] = None + device_lo_iso_address: Optional[str] = None + device_si_ipv4_network: Optional[ipaddress.IPv4Network] = None + device_ias_lt_ipv4_network: Optional[ipaddress.IPv4Network] = None + device_ias_lt_ipv6_network: Optional[ipaddress.IPv6Network] = None + device_vendor: Optional[DeviceVendor] = None + device_role: Optional[DeviceRole] = None + device_site: Optional[SiteBlockProvisioning] class DeviceBlock(DeviceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): - fqdn: str - ts_address: str - ts_port: str - lo_ipv4_address: ipaddress.IPv4Address - lo_ipv6_address: ipaddress.IPv6Address - lo_iso_address: str - si_ipv4_network: ipaddress.IPv4Network - ias_lt_ipv4_network: ipaddress.IPv4Network - ias_lt_ipv6_network: ipaddress.IPv6Network - site_city: str - site_country: str - site_country_code: str - site_latitude: str - site_longitude: str - snmp_location: str + device_fqdn: str + device_ts_address: str + device_ts_port: str + device_lo_ipv4_address: ipaddress.IPv4Address + device_lo_ipv6_address: ipaddress.IPv6Address + device_lo_iso_address: str + device_si_ipv4_network: ipaddress.IPv4Network + device_ias_lt_ipv4_network: ipaddress.IPv4Network + device_ias_lt_ipv6_network: ipaddress.IPv6Network + device_vendor: DeviceVendor + device_role: DeviceRole + device_site: SiteBlock diff --git a/gso/products/product_blocks/site.py b/gso/products/product_blocks/site.py new file mode 100644 index 00000000..564dd811 --- /dev/null +++ b/gso/products/product_blocks/site.py @@ -0,0 +1,51 @@ +from typing import Optional +from pydantic import Field + +from orchestrator.domain.base import ProductBlockModel +from orchestrator.types import SubscriptionLifecycle, Enum + +import ipaddress + +class SiteTier(Enum): + tier1 = 1 + tier2 = 2 + tier3 = 3 + tier4 = 4 + + +class SiteBlockInactive(ProductBlockModel, + lifecycle=[SubscriptionLifecycle.INITIAL], + product_block_name="SiteBlock"): + site_name: Optional[str] + site_city: Optional[str] + site_country: Optional[str] + site_country_code: Optional[str] + site_latitude: Optional[float] + site_longitude: Optional[float] + site_internal_id: Optional[int] + site_bgp_id: Optional[int] + site_tier: Optional[SiteTier] + +class SiteBlockProvisioning(SiteBlockInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): + site_name: Optional[str] + site_city: Optional[str] + site_country: Optional[str] + site_country_code: Optional[str] + site_latitude: Optional[float] + site_longitude: Optional[float] + site_internal_id: Optional[int] + site_bgp_id: Optional[int] + site_tier: Optional[SiteTier] + +class SiteBlock(SiteBlockProvisioning, + lifecycle=[SubscriptionLifecycle.ACTIVE]): + site_name: str + site_city: str + site_country: str + site_country_code: str + site_latitude: float + site_longitude: float + site_internal_id: int + site_bgp_id: int + site_tier: SiteTier \ No newline at end of file diff --git a/gso/products/product_types/device.py b/gso/products/product_types/device.py index e79762c1..17a99081 100644 --- a/gso/products/product_types/device.py +++ b/gso/products/product_types/device.py @@ -10,21 +10,14 @@ class DeviceType(strEnum): switch = "switch" -class DeviceVendor(strEnum): - Juniper = "Juniper" - Newvendor = "Newvendor" - - class DeviceInactive(SubscriptionModel, is_base=True): device_type: DeviceType - device_vendor: DeviceVendor device: DeviceBlockInactive class DeviceProvisioning(DeviceInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): device_type: DeviceType - device_vendor: DeviceVendor device: DeviceBlockProvisioning diff --git a/gso/products/product_types/site.py b/gso/products/product_types/site.py new file mode 100644 index 00000000..003e37d4 --- /dev/null +++ b/gso/products/product_types/site.py @@ -0,0 +1,18 @@ +from orchestrator.domain.base import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle, strEnum + +from gso.products.product_blocks.site \ + import SiteBlock, SiteBlockInactive, SiteBlockProvisioning + + +class SiteInactive(SubscriptionModel, is_base=True): + site: SiteBlockInactive + + +class SiteProvisioning(SiteInactive, + lifecycle=[SubscriptionLifecycle.PROVISIONING]): + site: SiteBlockProvisioning + + +class Site(SiteProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): + site: SiteBlock \ No newline at end of file -- GitLab