From b8c08435126a60936d79de023654d689f02dfb8f Mon Sep 17 00:00:00 2001 From: Neda Moeini <neda.moeini@geant.org> Date: Fri, 3 Nov 2023 10:45:23 +0100 Subject: [PATCH] Fixed site name validtor issues. --- gso/utils/helpers.py | 5 ++--- gso/workflows/tasks/import_site.py | 34 ++++++++++++++++++++++++++++++ test/imports/test_imports.py | 4 ---- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/gso/utils/helpers.py b/gso/utils/helpers.py index 78bf4c28..5e3b149a 100644 --- a/gso/utils/helpers.py +++ b/gso/utils/helpers.py @@ -187,10 +187,9 @@ def validate_site_name(site_name: str) -> str: The site name must consist of three uppercase letters (A-Z) followed by an optional single digit (0-9). """ pattern = re.compile(r"^[A-Z]{3}[0-9]?$") - if pattern.match(site_name): - return site_name - else: + if not pattern.match(site_name): raise ValueError( "Enter a valid site name. It must consist of three uppercase letters (A-Z) followed by an optional single " "digit (0-9)." ) + return site_name diff --git a/gso/workflows/tasks/import_site.py b/gso/workflows/tasks/import_site.py index af96fca2..fd3a55cc 100644 --- a/gso/workflows/tasks/import_site.py +++ b/gso/workflows/tasks/import_site.py @@ -5,12 +5,20 @@ from orchestrator.targets import Target from orchestrator.types import FormGenerator, State, SubscriptionLifecycle from orchestrator.workflow import StepList, done, init, step, workflow from orchestrator.workflows.steps import resync, set_status, store_process_subscription +from pydantic import validator +from pydantic.fields import ModelField from gso.products import ProductType from gso.products.product_blocks.site import SiteTier from gso.products.product_types.site import SiteInactive from gso.services import subscriptions from gso.services.crm import get_customer_by_name +from gso.utils.helpers import ( + validate_country_code, + validate_ipv4_or_ipv6, + validate_site_fields_is_unique, + validate_site_name, +) from gso.workflows.site.create_site import initialize_subscription @@ -43,6 +51,32 @@ def generate_initial_input_form() -> FormGenerator: site_ts_address: str customer: str + @validator("site_ts_address", allow_reuse=True) + def validate_ts_address(cls, site_ts_address: str) -> str: + validate_site_fields_is_unique("site_ts_address", site_ts_address) + validate_ipv4_or_ipv6(site_ts_address) + return site_ts_address + + @validator("site_country_code", allow_reuse=True) + def country_code_must_exist(cls, country_code: str) -> str: + validate_country_code(country_code) + return country_code + + @validator("site_internal_id", "site_bgp_community_id", allow_reuse=True) + def validate_unique_fields(cls, value: str, field: ModelField) -> str | int: + return validate_site_fields_is_unique(field.name, value) + + @validator("site_name", allow_reuse=True) + def site_name_must_be_valid(cls, site_name: str) -> str: + """Validate the site name. + + The site name must consist of three uppercase letters (A-Z) followed + by an optional single digit (0-9). + """ + validate_site_fields_is_unique("site_name", site_name) + validate_site_name(site_name) + return site_name + user_input = yield ImportSite return user_input.dict() diff --git a/test/imports/test_imports.py b/test/imports/test_imports.py index 5ebdc8e6..3cc72fcd 100644 --- a/test/imports/test_imports.py +++ b/test/imports/test_imports.py @@ -295,7 +295,3 @@ def test_import_iptrunk_fails_on_side_a_and_b_members_mismatch( assert response.json() == { "detail": [{"loc": ["body", "__root__"], "msg": "Mismatch between Side A and B members", "type": "value_error"}] } - - def test_site_name_is_valid(): - site_model = SiteImportModel(site_name="123456") - assert site_model is not None -- GitLab