From 9b93e98134b4178a513395c31990a5f7cd043da8 Mon Sep 17 00:00:00 2001
From: Neda Moeini <neda.moeini@geant.org>
Date: Thu, 28 Nov 2024 13:59:59 +0100
Subject: [PATCH] Add validation to modify VRF router list to avoid having
 duplicate routers in the VRF router list.

---
 gso/workflows/vrf/modify_vrf_router_list.py | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/gso/workflows/vrf/modify_vrf_router_list.py b/gso/workflows/vrf/modify_vrf_router_list.py
index 01c0da3a8..7bfbba4e0 100644
--- a/gso/workflows/vrf/modify_vrf_router_list.py
+++ b/gso/workflows/vrf/modify_vrf_router_list.py
@@ -8,7 +8,7 @@ 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
+from pydantic import BaseModel, ConfigDict, Field, field_validator
 
 from gso.products.product_types.router import Router
 from gso.products.product_types.vrf import VRF
@@ -35,6 +35,14 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
             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()
-- 
GitLab