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