From f567b1c9c42e9b2c5a2870bbf0af2eb2e5e2604b Mon Sep 17 00:00:00 2001
From: Neda Moeini <neda.moeini@geant.org>
Date: Fri, 26 Apr 2024 10:52:45 +0200
Subject: [PATCH] Created Opengear product block and product type.

---
 gso/products/product_blocks/opengear.py | 45 +++++++++++++++++++++++++
 gso/products/product_types/opengear.py  | 24 +++++++++++++
 2 files changed, 69 insertions(+)
 create mode 100644 gso/products/product_blocks/opengear.py
 create mode 100644 gso/products/product_types/opengear.py

diff --git a/gso/products/product_blocks/opengear.py b/gso/products/product_blocks/opengear.py
new file mode 100644
index 00000000..992a06e0
--- /dev/null
+++ b/gso/products/product_blocks/opengear.py
@@ -0,0 +1,45 @@
+"""Product block for :class:`Opengear` products."""
+import ipaddress
+
+from orchestrator.domain.base import ProductBlockModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.site import (
+    SiteBlock,
+    SiteBlockInactive,
+    SiteBlockProvisioning,
+)
+
+
+class OpengearBlockInactive(
+    ProductBlockModel,
+    lifecycle=[SubscriptionLifecycle.INITIAL],
+    product_block_name="OpengearBlock",
+):
+    """An Opengear that's being currently inactive. See :class:`OpengearBlock`."""
+
+    opengear_hostname: str | None = None
+    opengear_site: SiteBlockInactive | None = None
+    opengear_wan_address: ipaddress.IPv4Address | None = None
+    opengear_wan_netmask: ipaddress.IPv4Address | None = None
+    opengear_wan_gateway: ipaddress.IPv4Address | None = None
+
+
+class OpengearBlockProvisioning(OpengearBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """An Opengear that's being provisioned. See :class:`OpengearBlock`."""
+
+    opengear_hostname: str
+    opengear_site: SiteBlockProvisioning
+    opengear_wan_address: ipaddress.IPv4Address | None = None
+    opengear_wan_netmask: ipaddress.IPv4Address | None = None
+    opengear_wan_gateway: ipaddress.IPv4Address | None = None
+
+
+class OpengearBlock(OpengearBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An Opengear that's currently deployed in the network."""
+
+    opengear_hostname: str
+    opengear_site: SiteBlock
+    opengear_wan_address: ipaddress.IPv4Address
+    opengear_wan_netmask: ipaddress.IPv4Address
+    opengear_wan_gateway: ipaddress.IPv4Address
diff --git a/gso/products/product_types/opengear.py b/gso/products/product_types/opengear.py
new file mode 100644
index 00000000..73ec7691
--- /dev/null
+++ b/gso/products/product_types/opengear.py
@@ -0,0 +1,24 @@
+"""An Opengear product type."""
+
+from orchestrator.domain.base import SubscriptionModel
+from orchestrator.types import SubscriptionLifecycle
+
+from gso.products.product_blocks.opengear import OpengearBlock, OpengearBlockInactive, OpengearBlockProvisioning
+
+
+class OpengearInactive(SubscriptionModel, is_base=True):
+    """An inactive Opengear."""
+
+    opengear: OpengearBlockInactive
+
+
+class OpengearProvisioning(OpengearInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """An Opengear that is being provisioned."""
+
+    opengear: OpengearBlockProvisioning
+
+
+class OpenGear(OpengearProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """An Opengear that is currently active."""
+
+    opengear: OpengearBlock
-- 
GitLab