From 1f5d528e039e003a34c784f2822268aca95debec Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Thu, 4 Apr 2024 16:02:29 +0200
Subject: [PATCH] Make GA-GID and GA-SID optional

---
 gso/api/v1/imports.py                           |  6 +++---
 gso/products/product_blocks/iptrunk.py          |  2 +-
 gso/workflows/iptrunk/create_iptrunk.py         | 12 ++++++------
 gso/workflows/iptrunk/modify_trunk_interface.py | 12 ++++++------
 gso/workflows/tasks/import_iptrunk.py           | 12 ++++++------
 test/workflows/iptrunk/test_create_iptrunk.py   |  2 +-
 6 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/gso/api/v1/imports.py b/gso/api/v1/imports.py
index 0b2b6b16..643b4bc0 100644
--- a/gso/api/v1/imports.py
+++ b/gso/api/v1/imports.py
@@ -62,7 +62,7 @@ class IptrunkImportModel(BaseModel):
     """Required fields for importing an existing :class:`gso.products.product_types.iptrunk`."""
 
     partner: str
-    geant_s_sid: str
+    geant_s_sid: str | None
     iptrunk_type: IptrunkType
     iptrunk_description: str
     iptrunk_speed: PhysicalPortCapacity
@@ -70,11 +70,11 @@ class IptrunkImportModel(BaseModel):
     iptrunk_isis_metric: int
     side_a_node_id: str
     side_a_ae_iface: str
-    side_a_ae_geant_a_sid: str
+    side_a_ae_geant_a_sid: str | None
     side_a_ae_members: list[LAGMember]
     side_b_node_id: str
     side_b_ae_iface: str
-    side_b_ae_geant_a_sid: str
+    side_b_ae_geant_a_sid: str | None
     side_b_ae_members: list[LAGMember]
 
     iptrunk_ipv4_network: ipaddress.IPv4Network
diff --git a/gso/products/product_blocks/iptrunk.py b/gso/products/product_blocks/iptrunk.py
index 901f37e7..4a726c41 100644
--- a/gso/products/product_blocks/iptrunk.py
+++ b/gso/products/product_blocks/iptrunk.py
@@ -139,7 +139,7 @@ class IptrunkBlock(IptrunkBlockProvisioning, lifecycle=[SubscriptionLifecycle.AC
     """A trunk that's currently deployed in the network."""
 
     #:  GÉANT service ID associated with this trunk.
-    geant_s_sid: str
+    geant_s_sid: str | None = None
     #:  A human-readable description of this trunk.
     iptrunk_description: str
     #:  The type of trunk, can be either dark fibre or leased capacity.
diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py
index b4dbed48..5d02b13a 100644
--- a/gso/workflows/iptrunk/create_iptrunk.py
+++ b/gso/workflows/iptrunk/create_iptrunk.py
@@ -57,7 +57,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
 
         tt_number: str
         partner: str = ReadOnlyField("GEANT")
-        geant_s_sid: str
+        geant_s_sid: str | None
         iptrunk_description: str
         iptrunk_type: IptrunkType
         iptrunk_speed: PhysicalPortCapacity
@@ -108,7 +108,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
             title = f"Provide subscription details for side A of the trunk.({router_a_fqdn})"
 
         side_a_ae_iface: available_lags_choices(router_a) or str  # type: ignore[valid-type]
-        side_a_ae_geant_a_sid: str
+        side_a_ae_geant_a_sid: str | None
         side_a_ae_members: ae_members_side_a  # type: ignore[valid-type]
 
         @validator("side_a_ae_members", allow_reuse=True)
@@ -159,7 +159,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
             title = f"Provide subscription details for side B of the trunk.({router_b_fqdn})"
 
         side_b_ae_iface: available_lags_choices(router_b) or str  # type: ignore[valid-type]
-        side_b_ae_geant_a_sid: str
+        side_b_ae_geant_a_sid: str | None
         side_b_ae_members: ae_members_side_b  # type: ignore[valid-type]
 
         @validator("side_b_ae_members", allow_reuse=True)
@@ -209,18 +209,18 @@ def get_info_from_ipam(subscription: IptrunkInactive) -> State:
 @step("Initialize subscription")
 def initialize_subscription(
     subscription: IptrunkInactive,
-    geant_s_sid: str,
+    geant_s_sid: str | None,
     iptrunk_type: IptrunkType,
     iptrunk_description: str,
     iptrunk_speed: PhysicalPortCapacity,
     iptrunk_minimum_links: int,
     side_a_node_id: str,
     side_a_ae_iface: str,
-    side_a_ae_geant_a_sid: str,
+    side_a_ae_geant_a_sid: str | None,
     side_a_ae_members: list[dict],
     side_b_node_id: str,
     side_b_ae_iface: str,
-    side_b_ae_geant_a_sid: str,
+    side_b_ae_geant_a_sid: str | None,
     side_b_ae_members: list[dict],
 ) -> State:
     """Take all input from the user, and store it in the database."""
diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py
index d3b5e60e..816ff706 100644
--- a/gso/workflows/iptrunk/modify_trunk_interface.py
+++ b/gso/workflows/iptrunk/modify_trunk_interface.py
@@ -79,7 +79,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 
     class ModifyIptrunkForm(FormPage):
         tt_number: str
-        geant_s_sid: str = subscription.iptrunk.geant_s_sid
+        geant_s_sid: str | None = subscription.iptrunk.geant_s_sid
         iptrunk_description: str = subscription.iptrunk.iptrunk_description
         iptrunk_type: IptrunkType = subscription.iptrunk.iptrunk_type
         warning_label: Label = (
@@ -105,7 +105,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 
         side_a_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn)
         side_a_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface)
-        side_a_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid
+        side_a_ae_geant_a_sid: str | None = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid
         side_a_ae_members: ae_members_side_a = (  # type: ignore[valid-type]
             subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members
             if initial_user_input.iptrunk_speed == subscription.iptrunk.iptrunk_speed
@@ -130,7 +130,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 
         side_b_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn)
         side_b_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface)
-        side_b_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_geant_a_sid
+        side_b_ae_geant_a_sid: str | None = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_geant_a_sid
         side_b_ae_members: ae_members_side_b = (  # type: ignore[valid-type]
             subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members
             if initial_user_input.iptrunk_speed == subscription.iptrunk.iptrunk_speed
@@ -154,14 +154,14 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 @step("Update subscription")
 def modify_iptrunk_subscription(
     subscription: Iptrunk,
-    geant_s_sid: str,
+    geant_s_sid: str | None,
     iptrunk_type: IptrunkType,
     iptrunk_description: str,
     iptrunk_speed: PhysicalPortCapacity,
     iptrunk_minimum_links: int,
-    side_a_ae_geant_a_sid: str,
+    side_a_ae_geant_a_sid: str | None,
     side_a_ae_members: list[dict],
-    side_b_ae_geant_a_sid: str,
+    side_b_ae_geant_a_sid: str | None,
     side_b_ae_members: list[dict],
 ) -> State:
     """Modify the subscription in the service database, reflecting the changes to the newly selected interfaces."""
diff --git a/gso/workflows/tasks/import_iptrunk.py b/gso/workflows/tasks/import_iptrunk.py
index 648d954f..9c6687b3 100644
--- a/gso/workflows/tasks/import_iptrunk.py
+++ b/gso/workflows/tasks/import_iptrunk.py
@@ -39,7 +39,7 @@ def initial_input_form_generator() -> FormGenerator:
             title = "Import Iptrunk"
 
         partner: str
-        geant_s_sid: str
+        geant_s_sid: str | None
         iptrunk_description: str
         iptrunk_type: IptrunkType
         iptrunk_speed: PhysicalPortCapacity
@@ -48,12 +48,12 @@ def initial_input_form_generator() -> FormGenerator:
 
         side_a_node_id: router_enum  # type: ignore[valid-type]
         side_a_ae_iface: str
-        side_a_ae_geant_a_sid: str
+        side_a_ae_geant_a_sid: str | None
         side_a_ae_members: UniqueConstrainedList[LAGMember]
 
         side_b_node_id: router_enum  # type: ignore[valid-type]
         side_b_ae_iface: str
-        side_b_ae_geant_a_sid: str
+        side_b_ae_geant_a_sid: str | None
         side_b_ae_members: UniqueConstrainedList[LAGMember]
 
         iptrunk_ipv4_network: ipaddress.IPv4Network
@@ -80,7 +80,7 @@ def create_subscription(partner: str) -> State:
 @step("Initialize subscription")
 def initialize_subscription(
     subscription: IptrunkInactive,
-    geant_s_sid: str,
+    geant_s_sid: str | None,
     iptrunk_type: IptrunkType,
     iptrunk_description: str,
     iptrunk_speed: PhysicalPortCapacity,
@@ -88,11 +88,11 @@ def initialize_subscription(
     iptrunk_isis_metric: int,
     side_a_node_id: str,
     side_a_ae_iface: str,
-    side_a_ae_geant_a_sid: str,
+    side_a_ae_geant_a_sid: str | None,
     side_a_ae_members: list[dict],
     side_b_node_id: str,
     side_b_ae_iface: str,
-    side_b_ae_geant_a_sid: str,
+    side_b_ae_geant_a_sid: str | None,
     side_b_ae_members: list[dict],
 ) -> State:
     """Take all input from the user, and store it in the database."""
diff --git a/test/workflows/iptrunk/test_create_iptrunk.py b/test/workflows/iptrunk/test_create_iptrunk.py
index 34a79604..a883f016 100644
--- a/test/workflows/iptrunk/test_create_iptrunk.py
+++ b/test/workflows/iptrunk/test_create_iptrunk.py
@@ -71,7 +71,7 @@ def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_r
     create_ip_trunk_side_a_router_name = {"side_a_node_id": router_side_a}
     create_ip_trunk_side_a_step = {
         "side_a_ae_iface": "lag-1",
-        "side_a_ae_geant_a_sid": faker.geant_sid(),
+        "side_a_ae_geant_a_sid": None,
         "side_a_ae_members": [
             LAGMember(
                 interface_name=f"Interface{interface}",
-- 
GitLab