diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py
index 1dc9d0579f92b4ff1c1ac099f40b0b784cb779fe..fa5b3fa8602e28c1f6f0a0b4d1f72bf1bf5a16fe 100644
--- a/gso/workflows/iptrunk/create_iptrunk.py
+++ b/gso/workflows/iptrunk/create_iptrunk.py
@@ -3,7 +3,7 @@ from uuid import uuid4
from orchestrator.db.models import ProductTable, SubscriptionTable
# noinspection PyProtectedMember
from orchestrator.forms import FormPage
-from orchestrator.forms.validators import Choice
+from orchestrator.forms.validators import Choice, UniqueConstrainedList
from orchestrator.targets import Target
from orchestrator.types import FormGenerator, State
from orchestrator.types import SubscriptionLifecycle, UUIDstr
@@ -52,6 +52,10 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
initial_user_input = yield CreateIptrunkForm
+ class AeMembersList(UniqueConstrainedList[str]):
+ min_items = initial_user_input.iptrunk_minimum_links
+ max_items = initial_user_input.iptrunk_minimum_links
+
DeviceEnumA = Choice('Device A', zip(devices.keys(), devices.items()))
class CreateIptrunkSideAForm(FormPage):
@@ -61,8 +65,8 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
iptrunk_sideA_node_id: DeviceEnumA
iptrunk_sideA_ae_iface: str
iptrunk_sideA_ae_geant_a_sid: str
- iptrunk_sideA_ae_members: list[str]
- iptrunk_sideA_ae_members_descriptions: list[str]
+ iptrunk_sideA_ae_members: AeMembersList
+ iptrunk_sideA_ae_members_descriptions: AeMembersList
user_input_side_a = yield CreateIptrunkSideAForm
@@ -77,8 +81,8 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
iptrunk_sideB_node_id: DeviceEnumB
iptrunk_sideB_ae_iface: str
iptrunk_sideB_ae_geant_a_sid: str
- iptrunk_sideB_ae_members: list[str]
- iptrunk_sideB_ae_members_descriptions: list[str]
+ iptrunk_sideB_ae_members: AeMembersList
+ iptrunk_sideB_ae_members_descriptions: AeMembersList
user_input_side_b = yield CreateIptrunkSideBForm