diff --git a/gso/api/v1/imports.py b/gso/api/v1/imports.py index 643b4bc09a8295a35ca1b6f4ee1bcc08a978371e..6bfa786f88550e770649a53d5d5240ce9740ebe0 100644 --- a/gso/api/v1/imports.py +++ b/gso/api/v1/imports.py @@ -178,8 +178,8 @@ def _start_process(process_name: str, data: dict) -> UUID: @router.post("/sites", status_code=status.HTTP_201_CREATED, response_model=ImportResponseModel) -def import_site(site: SiteImportModel) -> dict[str, Any]: - """Import a site by running the import_site workflow. +def create_imported_site(site: SiteImportModel) -> dict[str, Any]: + """Import a site by running the create_imported_site workflow. :param site: The site information to be imported. :type site: SiteImportModel @@ -189,13 +189,13 @@ def import_site(site: SiteImportModel) -> dict[str, Any]: :raises HTTPException: If the site already exists or if there's an error in the process. """ - pid = _start_process("import_site", site.dict()) + pid = _start_process("create_imported_site", site.dict()) return {"detail": "Site added successfully.", "pid": pid} @router.post("/routers", status_code=status.HTTP_201_CREATED, response_model=ImportResponseModel) -def import_router(router_data: RouterImportModel) -> dict[str, Any]: - """Import a router by running the import_router workflow. +def create_imported_router(router_data: RouterImportModel) -> dict[str, Any]: + """Import a router by running the create_imported_router workflow. :param router_data: The router information to be imported. :type router_data: RouterImportModel @@ -205,13 +205,13 @@ def import_router(router_data: RouterImportModel) -> dict[str, Any]: :raises HTTPException: If there's an error in the process. """ - pid = _start_process("import_router", router_data.dict()) + pid = _start_process("create_imported_router", router_data.dict()) return {"detail": "Router has been added successfully", "pid": pid} @router.post("/iptrunks", status_code=status.HTTP_201_CREATED, response_model=ImportResponseModel) -def import_iptrunk(iptrunk_data: IptrunkImportModel) -> dict[str, Any]: - """Import an iptrunk by running the import_iptrunk workflow. +def create_imported_iptrunk(iptrunk_data: IptrunkImportModel) -> dict[str, Any]: + """Import an iptrunk by running the create_imported_iptrunk workflow. :param iptrunk_data: The iptrunk information to be imported. :type iptrunk_data: IptrunkImportModel @@ -221,13 +221,13 @@ def import_iptrunk(iptrunk_data: IptrunkImportModel) -> dict[str, Any]: :raises HTTPException: If there's an error in the process. """ - pid = _start_process("import_iptrunk", iptrunk_data.dict()) + pid = _start_process("create_imported_iptrunk", iptrunk_data.dict()) return {"detail": "Iptrunk has been added successfully", "pid": pid} @router.post("/super-pop-switches", status_code=status.HTTP_201_CREATED, response_model=ImportResponseModel) -def import_super_pop_switch(super_pop_switch_data: SuperPopSwitchImportModel) -> dict[str, Any]: - """Import a Super PoP switch by running the import_super_pop_switch workflow. +def create_imported_super_pop_switch(super_pop_switch_data: SuperPopSwitchImportModel) -> dict[str, Any]: + """Import a Super PoP switch by running the create_imported_super_pop_switch workflow. :param super_pop_switch_data: The Super PoP switch information to be imported. :type super_pop_switch_data: SuperPopSwitchImportModel @@ -237,13 +237,13 @@ def import_super_pop_switch(super_pop_switch_data: SuperPopSwitchImportModel) -> :raises HTTPException: If there's an error in the process. """ - pid = _start_process("import_super_pop_switch", super_pop_switch_data.dict()) + pid = _start_process("create_imported_super_pop_switch", super_pop_switch_data.dict()) return {"detail": "Super PoP switch has been added successfully", "pid": pid} @router.post("/office-routers", status_code=status.HTTP_201_CREATED, response_model=ImportResponseModel) -def import_office_router(office_router_data: OfficeRouterImportModel) -> dict[str, Any]: - """Import a office router by running the import_office_router workflow. +def create_imported_office_router(office_router_data: OfficeRouterImportModel) -> dict[str, Any]: + """Import an office router by running the create_imported_office_router workflow. :param office_router_data: The office router information to be imported. :type office_router_data: OfficeRouterImportModel @@ -253,5 +253,5 @@ def import_office_router(office_router_data: OfficeRouterImportModel) -> dict[st :raises HTTPException: If there's an error in the process. """ - pid = _start_process("import_office_router", office_router_data.dict()) + pid = _start_process("create_imported_office_router", office_router_data.dict()) return {"detail": "Office router has been added successfully", "pid": pid} diff --git a/gso/cli/imports.py b/gso/cli/imports.py index 64a6af56cdb691a15c796fc27fce8e0d297b7950..fc8253a24369890e0596fc73f165ae41e22406ba 100644 --- a/gso/cli/imports.py +++ b/gso/cli/imports.py @@ -19,11 +19,11 @@ from gso.api.v1.imports import ( RouterImportModel, SiteImportModel, SuperPopSwitchImportModel, - import_iptrunk, - import_office_router, - import_router, - import_site, - import_super_pop_switch, + create_imported_iptrunk, + create_imported_office_router, + create_imported_router, + create_imported_site, + create_imported_super_pop_switch, ) from gso.db.models import PartnerTable from gso.services.subscriptions import get_active_subscriptions_by_field_and_value @@ -87,31 +87,31 @@ def generic_import_data( @app.command() -def import_sites(filepath: str = common_filepath_option) -> None: +def create_imported_sites(filepath: str = common_filepath_option) -> None: """Import sites into GSO.""" # Use the import_data function to handle common import logic - generic_import_data(filepath, SiteImportModel, import_site, "site_name") + generic_import_data(filepath, SiteImportModel, create_imported_site, "site_name") @app.command() -def import_routers(filepath: str = common_filepath_option) -> None: +def create_imported_routers(filepath: str = common_filepath_option) -> None: """Import routers into GSO.""" # Use the import_data function to handle common import logic - generic_import_data(filepath, RouterImportModel, import_router, "hostname") + generic_import_data(filepath, RouterImportModel, create_imported_router, "hostname") @app.command() -def import_super_pop_switches(filepath: str = common_filepath_option) -> None: +def create_imported_super_pop_switches(filepath: str = common_filepath_option) -> None: """Import Super PoP Switches into GSO.""" # Use the import_data function to handle common import logic - generic_import_data(filepath, SuperPopSwitchImportModel, import_super_pop_switch, "hostname") + generic_import_data(filepath, SuperPopSwitchImportModel, create_imported_super_pop_switch, "hostname") @app.command() -def import_office_routers(filepath: str = common_filepath_option) -> None: +def create_imported_office_routers(filepath: str = common_filepath_option) -> None: """Import office routers into GSO.""" # Use the import_data function to handle common import logic - generic_import_data(filepath, OfficeRouterImportModel, import_office_router, "office_router_fqdn") + generic_import_data(filepath, OfficeRouterImportModel, create_imported_office_router, "office_router_fqdn") def get_router_subscription_id(node_name: str) -> str | None: @@ -126,7 +126,7 @@ def get_router_subscription_id(node_name: str) -> str | None: @app.command() -def import_iptrunks(filepath: str = common_filepath_option) -> None: +def create_imported_iptrunks(filepath: str = common_filepath_option) -> None: """Import IP trunks into GSO.""" successfully_imported_data = [] data = read_data(filepath) @@ -192,7 +192,7 @@ def import_iptrunks(filepath: str = common_filepath_option) -> None: iptrunk_ipv4_network=iptrunk_ipv4_network, # type:ignore[arg-type] iptrunk_ipv6_network=iptrunk_ipv6_network, # type:ignore[arg-type] ) - import_iptrunk(initial_data) + create_imported_iptrunk(initial_data) successfully_imported_data.append(trunk["id"]) typer.echo(f"Successfully imported IP Trunk: {trunk['id']}") except ValidationError as e: diff --git a/gso/products/product_types/iptrunk.py b/gso/products/product_types/iptrunk.py index 82c912bf062b1c2afc5bd5f2b55e352507fd5a07..6f6b85b192874d0a120bdb7f4220940c11c8d190 100644 --- a/gso/products/product_types/iptrunk.py +++ b/gso/products/product_types/iptrunk.py @@ -34,7 +34,9 @@ class ImportedIptrunkInactive(SubscriptionModel, is_base=True): iptrunk: IptrunkBlockInactive -class ImportedIptrunk(ImportedIptrunkInactive, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class ImportedIptrunk( + ImportedIptrunkInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE] +): """An IP trunk that is active.""" iptrunk: IptrunkBlock diff --git a/gso/products/product_types/office_router.py b/gso/products/product_types/office_router.py index 04c47dfbadaaadac9c268cf47221c9dc462c5f98..cfb98cdbf1cc5e62468811bffdbdac317ff33fe8 100644 --- a/gso/products/product_types/office_router.py +++ b/gso/products/product_types/office_router.py @@ -34,7 +34,9 @@ class ImportedOfficeRouterInactive(SubscriptionModel, is_base=True): office_router: OfficeRouterBlockInactive -class ImportedOfficeRouter(ImportedOfficeRouterInactive, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class ImportedOfficeRouter( + ImportedOfficeRouterInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE] +): """An imported office router that is currently active.""" office_router: OfficeRouterBlock diff --git a/gso/products/product_types/router.py b/gso/products/product_types/router.py index e24df3e7b3f5af3b9810f8155b6ad9906b2a258d..973abc90a692b78c349c7a7387343596d2acce12 100644 --- a/gso/products/product_types/router.py +++ b/gso/products/product_types/router.py @@ -34,7 +34,9 @@ class ImportedRouterInactive(SubscriptionModel, is_base=True): router: RouterBlockInactive -class ImportedRouter(ImportedRouterInactive, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class ImportedRouter( + ImportedRouterInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE] +): """An imported router that is currently active.""" router: RouterBlock diff --git a/gso/products/product_types/site.py b/gso/products/product_types/site.py index 0fb16a574588e43cab41615a60162f49c16dbdc1..be5c90b0ccc3972f58786ba009267de401f4c9bc 100644 --- a/gso/products/product_types/site.py +++ b/gso/products/product_types/site.py @@ -34,7 +34,7 @@ class ImportedSiteInactive(SubscriptionModel, is_base=True): site: SiteBlockInactive -class ImportedSite(ImportedSiteInactive, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class ImportedSite(ImportedSiteInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE]): """An imported site that is currently active.""" site: SiteBlock diff --git a/gso/products/product_types/super_pop_switch.py b/gso/products/product_types/super_pop_switch.py index 3c80e3646b6b3a3d8108b1a44c30e38817255366..298627ae5c7d6949981fffb406685e19eb8b6f2e 100644 --- a/gso/products/product_types/super_pop_switch.py +++ b/gso/products/product_types/super_pop_switch.py @@ -34,7 +34,9 @@ class ImportedSuperPopSwitchInactive(SubscriptionModel, is_base=True): super_pop_switch: SuperPopSwitchBlockInactive -class ImportedSuperPopSwitch(ImportedSuperPopSwitchInactive, lifecycle=[SubscriptionLifecycle.ACTIVE]): +class ImportedSuperPopSwitch( + ImportedSuperPopSwitchInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE] +): """An imported Super PoP switch that is currently active.""" super_pop_switch: SuperPopSwitchBlock diff --git a/test/api/test_imports.py b/test/api/test_imports.py index f7b58f723eff687b92337281e14af11d5688cd8b..1752ea6170d8856c6379248263f97b48a284454a 100644 --- a/test/api/test_imports.py +++ b/test/api/test_imports.py @@ -86,7 +86,9 @@ def mock_routers(iptrunk_data): @patch("gso.api.v1.imports._start_process") -def test_import_iptrunk_successful_with_mocked_process(mock_start_process, test_client, mock_routers, iptrunk_data): +def test_create_imported_iptrunk_successful_with_mocked_process( + mock_start_process, test_client, mock_routers, iptrunk_data +): mock_start_process.return_value = "123e4567-e89b-12d3-a456-426655440000" response = test_client.post(IPTRUNK_IMPORT_API_URL, json=iptrunk_data) @@ -151,7 +153,7 @@ def office_router_data(faker, site_data): } -def test_import_site_endpoint(test_client, site_data): +def test_create_imported_site_endpoint(test_client, site_data): assert SubscriptionTable.query.all() == [] # Post data to the endpoint response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) @@ -165,7 +167,7 @@ def test_import_site_endpoint(test_client, site_data): assert subscription is not None -def test_import_site_endpoint_with_existing_site(test_client, site_data): +def test_create_imported_site_endpoint_with_existing_site(test_client, site_data): response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) assert SubscriptionTable.query.count() == 1 assert response.status_code == 201 @@ -175,7 +177,7 @@ def test_import_site_endpoint_with_existing_site(test_client, site_data): assert SubscriptionTable.query.count() == 1 -def test_import_site_endpoint_with_invalid_data(test_client, site_data): +def test_create_imported_site_endpoint_with_invalid_data(test_client, site_data): # invalid data, missing site_latitude and invalid site_longitude site_data.pop("site_latitude") site_data["site_longitude"] = "invalid" @@ -190,7 +192,7 @@ def test_import_site_endpoint_with_invalid_data(test_client, site_data): assert response["detail"][1]["msg"] == "value is not a valid float" -def test_import_router_endpoint(test_client, site_data, router_data): +def test_create_imported_router_endpoint(test_client, site_data, router_data): # Create a site first response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) assert response.status_code == 201 @@ -201,7 +203,7 @@ def test_import_router_endpoint(test_client, site_data, router_data): assert SubscriptionTable.query.count() == 2 -def test_import_router_endpoint_with_invalid_data(test_client, site_data, router_data): +def test_create_imported_router_endpoint_with_invalid_data(test_client, site_data, router_data): response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) assert response.status_code == 201 assert SubscriptionTable.query.count() == 1 @@ -219,7 +221,7 @@ def test_import_router_endpoint_with_invalid_data(test_client, site_data, router assert response["detail"][1]["msg"] == "value is not a valid IPv6 address" -def test_import_iptrunk_successful_with_real_process(test_client, mock_routers, iptrunk_data): +def test_create_imported_iptrunk_successful_with_real_process(test_client, mock_routers, iptrunk_data): response = test_client.post(IPTRUNK_IMPORT_API_URL, json=iptrunk_data) assert response.status_code == 201 @@ -235,7 +237,7 @@ def test_import_iptrunk_successful_with_real_process(test_client, mock_routers, @patch("gso.api.v1.imports._start_process") -def test_import_iptrunk_invalid_partner(mock_start_process, test_client, mock_routers, iptrunk_data): +def test_create_imported_iptrunk_invalid_partner(mock_start_process, test_client, mock_routers, iptrunk_data): iptrunk_data["partner"] = "not_existing_partner" mock_start_process.return_value = "123e4567-e89b-12d3-a456-426655440000" response = test_client.post(IPTRUNK_IMPORT_API_URL, json=iptrunk_data) @@ -253,7 +255,7 @@ def test_import_iptrunk_invalid_partner(mock_start_process, test_client, mock_ro @patch("gso.api.v1.imports._start_process") -def test_import_iptrunk_invalid_router_id_side_a_and_b(mock_start_process, test_client, iptrunk_data): +def test_create_imported_iptrunk_invalid_router_id_side_a_and_b(mock_start_process, test_client, iptrunk_data): iptrunk_data["side_a_node_id"] = "NOT FOUND" iptrunk_data["side_b_node_id"] = "NOT FOUND" @@ -278,7 +280,9 @@ def test_import_iptrunk_invalid_router_id_side_a_and_b(mock_start_process, test_ @patch("gso.api.v1.imports._start_process") -def test_import_iptrunk_non_unique_members_side_a(mock_start_process, test_client, mock_routers, iptrunk_data, faker): +def test_create_imported_iptrunk_non_unique_members_side_a( + mock_start_process, test_client, mock_routers, iptrunk_data, faker +): mock_start_process.return_value = "123e4567-e89b-12d3-a456-426655440000" repeat_interface_a = { @@ -317,7 +321,7 @@ def test_import_iptrunk_non_unique_members_side_a(mock_start_process, test_clien @patch("gso.api.v1.imports._start_process") -def test_import_iptrunk_fails_on_side_a_member_count_mismatch( +def test_create_imported_iptrunk_fails_on_side_a_member_count_mismatch( mock_start_process, test_client, mock_routers, @@ -342,7 +346,7 @@ def test_import_iptrunk_fails_on_side_a_member_count_mismatch( @patch("gso.api.v1.imports._start_process") -def test_import_iptrunk_fails_on_side_a_and_b_members_mismatch( +def test_create_imported_iptrunk_fails_on_side_a_and_b_members_mismatch( mock_start_process, test_client, iptrunk_data, @@ -366,7 +370,7 @@ def test_import_iptrunk_fails_on_side_a_and_b_members_mismatch( } -def test_import_super_pop_switch_endpoint(test_client, site_data, super_pop_switch_data): +def test_create_imported_super_pop_switch_endpoint(test_client, site_data, super_pop_switch_data): response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) assert response.status_code == 201 assert SubscriptionTable.query.count() == 1 @@ -376,7 +380,7 @@ def test_import_super_pop_switch_endpoint(test_client, site_data, super_pop_swit assert SubscriptionTable.query.count() == 2 -def test_import_super_pop_switch_endpoint_with_invalid_data(test_client, site_data, super_pop_switch_data): +def test_create_imported_super_pop_switch_endpoint_with_invalid_data(test_client, site_data, super_pop_switch_data): response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) assert response.status_code == 201 assert SubscriptionTable.query.count() == 1 @@ -394,7 +398,7 @@ def test_import_super_pop_switch_endpoint_with_invalid_data(test_client, site_da assert response["detail"][1]["msg"] == "value is not a valid IPv4 address" -def test_import_office_router_endpoint(test_client, site_data, office_router_data): +def test_create_imported_office_router_endpoint(test_client, site_data, office_router_data): response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) assert response.status_code == 201 assert SubscriptionTable.query.count() == 1 @@ -404,7 +408,7 @@ def test_import_office_router_endpoint(test_client, site_data, office_router_dat assert SubscriptionTable.query.count() == 2 -def test_import_office_router_endpoint_with_invalid_data(test_client, site_data, office_router_data): +def test_create_imported_office_router_endpoint_with_invalid_data(test_client, site_data, office_router_data): response = test_client.post(SITE_IMPORT_ENDPOINT, json=site_data) assert response.status_code == 201 assert SubscriptionTable.query.count() == 1