From fd2b3ef93dabd75c59ea264d15a60955c22273fb Mon Sep 17 00:00:00 2001
From: Neda Moeini <neda.moeini@geant.org>
Date: Thu, 28 Nov 2024 15:38:25 +0100
Subject: [PATCH] Improve the functionality of checking duplicate routers in
 VRF router list

---
 gso/workflows/vrf/modify_vrf_router_list.py       | 13 ++++---------
 test/workflows/vrf/test_modify_vrf_router_list.py |  2 +-
 2 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/gso/workflows/vrf/modify_vrf_router_list.py b/gso/workflows/vrf/modify_vrf_router_list.py
index 7bfbba4e..b0618d95 100644
--- a/gso/workflows/vrf/modify_vrf_router_list.py
+++ b/gso/workflows/vrf/modify_vrf_router_list.py
@@ -8,7 +8,8 @@ from orchestrator.types import FormGenerator, State, UUIDstr
 from orchestrator.workflow import StepList, begin, done, step, workflow
 from orchestrator.workflows.steps import resync, store_process_subscription, unsync
 from orchestrator.workflows.utils import wrap_modify_initial_input_form
-from pydantic import BaseModel, ConfigDict, Field, field_validator
+from pydantic import AfterValidator, BaseModel, ConfigDict, Field
+from pydantic_forms.validators import validate_unique_list
 
 from gso.products.product_types.router import Router
 from gso.products.product_types.vrf import VRF
@@ -27,22 +28,16 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 
         router_list: Annotated[
             list[RouterSelection],
+            AfterValidator(validate_unique_list),
             Field(
                 description="A list of routers to add or remove from the VRF.",
                 min_length=0 if subscription.vrf.vrf_router_list else 1,
+                json_schema_extra={"uniqueItems": True},
             ),
         ] = [  # noqa: RUF012
             RouterSelection(router_id=str(router.owner_subscription_id)) for router in subscription.vrf.vrf_router_list
         ]
 
-        @field_validator("router_list")
-        def router_list_must_not_have_duplicates(cls, router_list: list[RouterSelection]) -> list[RouterSelection]:
-            router_ids = [router.router_id for router in router_list]
-            if len(router_ids) != len(set(router_ids)):
-                msg = "Duplicate router IDs found in the list."
-                raise ValueError(msg)
-            return router_list
-
     user_input = yield ModifyVRFRouterListForm
 
     return user_input.model_dump()
diff --git a/test/workflows/vrf/test_modify_vrf_router_list.py b/test/workflows/vrf/test_modify_vrf_router_list.py
index bd076390..97f04656 100644
--- a/test/workflows/vrf/test_modify_vrf_router_list.py
+++ b/test/workflows/vrf/test_modify_vrf_router_list.py
@@ -51,5 +51,5 @@ def test_modify_vrf_router_list_with_duplicate_router_id(vrf_subscription_factor
         },
     ]
 
-    with pytest.raises(FormValidationError, match="Duplicate router IDs found in the list."):
+    with pytest.raises(FormValidationError, match="List must be unique"):
         run_workflow("modify_vrf_router_list", initial_vrf_data)
-- 
GitLab