diff --git a/gso/migrations/versions/2024-04-02_1ec810b289c0_add_orchestrator_2_1_2_migrations.py b/gso/migrations/versions/2024-04-20_1ec810b289c0_add_orchestrator_2_1_2_migrations.py similarity index 98% rename from gso/migrations/versions/2024-04-02_1ec810b289c0_add_orchestrator_2_1_2_migrations.py rename to gso/migrations/versions/2024-04-20_1ec810b289c0_add_orchestrator_2_1_2_migrations.py index c9842e731cab00e90653b8ca5bb32185a3d0b025..89fcbfcd056850a331ca92e379bf392a51a0cdc4 100644 --- a/gso/migrations/versions/2024-04-02_1ec810b289c0_add_orchestrator_2_1_2_migrations.py +++ b/gso/migrations/versions/2024-04-20_1ec810b289c0_add_orchestrator_2_1_2_migrations.py @@ -10,7 +10,7 @@ from orchestrator.migrations.helpers import create_workflow, delete_workflow # revision identifiers, used by Alembic. revision = '1ec810b289c0' -down_revision = '4ec89ab289c0' +down_revision = '393acfa175c0' branch_labels = None # TODO: check it carefuly depends_on = '048219045729' # in this revision, SURF has added a new columns to the workflow table like delted_at, so we need to add a dependency on the revision that added the columns to the workflow table. diff --git a/gso/products/product_blocks/pop_vlan.py b/gso/products/product_blocks/pop_vlan.py index 4935c2f69966874c686489c7e06e3061d5509365..e556ad1e9903772f7fb58a38a4047286595a1fb8 100644 --- a/gso/products/product_blocks/pop_vlan.py +++ b/gso/products/product_blocks/pop_vlan.py @@ -1,12 +1,13 @@ """Pop VLAN product block that has all parameters of a subscription throughout its lifecycle.""" from ipaddress import IPv4Network, IPv6Network -from typing import TypeVar +from typing import TypeVar, Annotated from orchestrator.domain.base import ProductBlockModel -from orchestrator.forms.validators import UniqueConstrainedList from orchestrator.types import SubscriptionLifecycle +from pydantic import AfterValidator from pydantic_forms.types import strEnum +from pydantic_forms.validators import validate_unique_list from gso.products.product_blocks.lan_switch_interconnect import ( LanSwitchInterconnectBlock, @@ -14,7 +15,7 @@ from gso.products.product_blocks.lan_switch_interconnect import ( LanSwitchInterconnectBlockProvisioning, ) -T_co = TypeVar("T_co", covariant=True) +T = TypeVar("T") class LayerPreference(strEnum): @@ -24,8 +25,7 @@ class LayerPreference(strEnum): L3 = "L3" -class PortList(UniqueConstrainedList[T_co]): # type: ignore[type-var] - """A list of ports.""" +PortList = Annotated[list[T], AfterValidator(validate_unique_list)] class PopVlanPortBlockInactive( diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py index dcbb40cf874dafb4507aa6c8f8c7c7c00d5be182..3395774c577957fcbf1bdfa5a08a9de6d23233ee 100644 --- a/gso/workflows/iptrunk/modify_trunk_interface.py +++ b/gso/workflows/iptrunk/modify_trunk_interface.py @@ -62,7 +62,7 @@ def initialize_ae_members(subscription: Iptrunk, initial_user_input: dict, side_ ) ) - ae_members = Annotated[list[NokiaLAGMember], AfterValidator(validate_unique_list), Len(min_length=iptrunk_number_of_members, max_lenght=iptrunk_number_of_members)] + ae_members = Annotated[list[NokiaLAGMember], AfterValidator(validate_unique_list), Len(min_length=iptrunk_number_of_members, max_length=iptrunk_number_of_members)] else: ae_members = Annotated[list[LAGMember], AfterValidator(validate_unique_list), Len(min_length=iptrunk_number_of_members, max_length=iptrunk_number_of_members)] diff --git a/gso/workflows/tasks/import_iptrunk.py b/gso/workflows/tasks/import_iptrunk.py index 8763ca8e094c4da1f611e9d6b4ad02c1b8fb610a..e1290bc3d91d023b959b2ef1b20a91c49e2443c4 100644 --- a/gso/workflows/tasks/import_iptrunk.py +++ b/gso/workflows/tasks/import_iptrunk.py @@ -1,15 +1,18 @@ """A creation workflow for adding an existing IP trunk to the service database.""" import ipaddress +from typing import Annotated from uuid import uuid4 from orchestrator import workflow from orchestrator.forms import FormPage -from orchestrator.forms.validators import Choice, UniqueConstrainedList +from orchestrator.forms.validators import Choice from orchestrator.targets import Target from orchestrator.types import FormGenerator, State, SubscriptionLifecycle from orchestrator.workflow import StepList, done, init, step from orchestrator.workflows.steps import resync, set_status, store_process_subscription +from pydantic import AfterValidator, ConfigDict +from pydantic_forms.validators import validate_unique_list from gso.products import ProductName from gso.products.product_blocks.iptrunk import IptrunkInterfaceBlockInactive, IptrunkType, PhysicalPortCapacity