diff --git a/requirements.txt b/requirements.txt index 5e4d359a2a07e2730713b91b211c106f5c00f585..3ed157891187822ede5522f406647a8ab99bee2d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,6 +20,7 @@ dictdiffer~=0.9.0 jmespath~=1.0.1 pytest~=7.4.0 +Faker~=19.3.1 responses~=0.23.1 sphinx sphinx-rtd-theme diff --git a/test/conftest.py b/test/conftest.py index bc4781a512dfbf09bca43571853eed69eb5ac783..0059e8213b19a99d5723b99d1f94358bba4253bf 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -4,6 +4,7 @@ import tempfile from typing import Any, Generator import pytest +from faker import Faker from fastapi.testclient import TestClient import lso @@ -11,13 +12,13 @@ import lso TEST_CONFIG = {"collection-name": "kvklink.echo", "test-role": "kvklink.echo.echo_uptime"} -@pytest.fixture +@pytest.fixture(scope="session") def config_data() -> dict[str, str]: """Start the server with valid configuration data.""" return {"ansible_playbooks_root_dir": "/"} -@pytest.fixture +@pytest.fixture(scope="session") def config_file(config_data: dict[str, str]) -> Generator[str, Any, None]: """Fixture that will yield a filename that contains a valid configuration. @@ -29,9 +30,14 @@ def config_file(config_data: dict[str, str]) -> Generator[str, Any, None]: yield file.name -@pytest.fixture +@pytest.fixture(scope="session") def client(config_file: str) -> Generator[TestClient, Any, None]: """Return a client that can be used to test the server.""" os.environ["SETTINGS_FILENAME"] = config_file app = lso.create_app() yield TestClient(app) # wait here until calling context ends + + +@pytest.fixture(scope="session") +def faker() -> Faker: + return Faker(locale="en_GB") diff --git a/test/routes/test_ip_trunk.py b/test/routes/test_ip_trunk.py index c9a5af2f1fe0071dc431cb0e6a574ae7e8c4d498..40dd84de836b32ebccc5c1185478cf6b2adeb7ad 100644 --- a/test/routes/test_ip_trunk.py +++ b/test/routes/test_ip_trunk.py @@ -2,151 +2,162 @@ import time from unittest.mock import patch import jsonschema +import pytest import responses +from faker import Faker from starlette.testclient import TestClient from lso.playbook import PlaybookLaunchResponse from test.routes import TEST_CALLBACK_URL, test_ansible_runner_run -_SUBSCRIPTION_OBJECT = { - "subscription_id": "0", - "description": "IP trunk, geant_s_sid:GS-00000", - "iptrunk": { - "geant_s_sid": "GS-00000", - "iptrunk_description": "A description for this trunk", - "iptrunk_isis_metric": 9000, - "iptrunk_minimum_links": 1, - "iptrunk_sides": [ - { - "name": "IptrunkSideBlock", - "label": None, - "iptrunk_side_node": { - "name": "RouterBlock", + +@pytest.fixture(scope="session") +def subscription_object(faker: Faker) -> dict: + return { + "subscription_id": faker.pyint(), + "description": "IP trunk, geant_s_sid:GS-00000", + "iptrunk": { + "geant_s_sid": "GS-00000", + "iptrunk_description": faker.pystr(), + "iptrunk_isis_metric": faker.pyint(), + "iptrunk_minimum_links": 1, + "iptrunk_sides": [ + { + "name": "IptrunkSideBlock", "label": None, - "router_fqdn": "rt1.city.country.geant.net", - "router_role": "p", - "router_site": { - "name": "SiteBlock", + "iptrunk_side_node": { + "name": "RouterBlock", "label": None, - "site_city": "City", - "site_name": "city", - "site_tier": "1", - "site_country": "Country", - "site_latitude": 1, - "site_longitude": 1, - "site_ts_address": "0.0.0.0", - "site_internal_id": 1, - "site_country_code": "xxx", - "owner_subscription_id": "b5146e62-da79-4791-b703-d03b0ebeebf8", - "site_bgp_community_id": 1, - "subscription_instance_id": "039e03e5-5c09-4236-8d28-cd569e04315e", + "router_fqdn": "rt1.city.country.geant.net", + "router_role": "p", + "router_site": { + "name": "SiteBlock", + "label": None, + "site_city": faker.city(), + "site_name": "city", + "site_tier": "1", + "site_country": faker.country(), + "site_latitude": float(faker.latitude()), + "site_longitude": float(faker.longitude()), + "site_ts_address": faker.ipv4(), + "site_internal_id": faker.pyint(), + "site_country_code": faker.country_code(), + "owner_subscription_id": faker.uuid4(), + "site_bgp_community_id": faker.pyint(), + "subscription_instance_id": faker.uuid4(), + }, + "router_vendor": "juniper", + "router_ts_port": faker.pyint(), + "router_access_via_ts": faker.pybool(), + "owner_subscription_id": faker.uuid4(), + "router_lo_iso_address": "49.51e5.0001.0620.4009.6014.00", + "router_lo_ipv4_address": faker.ipv4(), + "router_lo_ipv6_address": faker.ipv6(), + "router_si_ipv4_network": faker.ipv4() + "/31", + "router_is_ias_connected": faker.pybool(), + "subscription_instance_id": faker.uuid4(), + "router_ias_lt_ipv4_network": faker.ipv4() + "/31", + "router_ias_lt_ipv6_network": faker.ipv6() + "/126", }, - "router_vendor": "juniper", - "router_ts_port": 22222, - "router_access_via_ts": True, - "owner_subscription_id": "4a0001f1-459d-46f5-9a85-b8177e1bbc1b", - "router_lo_iso_address": "49.51e5.0001.0620.4009.6014.00", - "router_lo_ipv4_address": "0.0.0.0", - "router_lo_ipv6_address": "::", - "router_si_ipv4_network": "0.0.0.0/31", - "router_is_ias_connected": True, - "subscription_instance_id": "2242883e-a581-4ce1-919c-9c986ded57f6", - "router_ias_lt_ipv4_network": "0.0.0.0/31", - "router_ias_lt_ipv6_network": "::/126", + "iptrunk_side_ae_iface": "ae1", + "owner_subscription_id": faker.uuid4(), + "iptrunk_side_ae_members": ["ge-0/0/0", "ge-0/0/1"], + "subscription_instance_id": faker.uuid4(), + "iptrunk_side_ae_geant_a_sid": "SID-11112", + "iptrunk_side_ae_members_description": [faker.pystr(), faker.pystr()], }, - "iptrunk_side_ae_iface": "ae1", - "owner_subscription_id": "c9ddbe14-e107-4749-82ac-e22091cdb132", - "iptrunk_side_ae_members": ["ge-0/0/0", "ge-0/0/1"], - "subscription_instance_id": "6276fac5-9d31-4c9a-9247-48f02a19f151", - "iptrunk_side_ae_geant_a_sid": "SID-11112", - "iptrunk_side_ae_members_description": ["first one", "second one"], - }, - { - "name": "IptrunkSideBlock", - "label": None, - "iptrunk_side_node": { - "name": "RouterBlock", + { + "name": "IptrunkSideBlock", "label": None, - "router_fqdn": "rt2.city.country.geant.net", - "router_role": "p", - "router_site": { - "name": "SiteBlock", + "iptrunk_side_node": { + "name": "RouterBlock", "label": None, - "site_city": "City", - "site_name": "city", - "site_tier": "1", - "site_country": "Country", - "site_latitude": 1, - "site_longitude": 1, - "site_ts_address": "0.0.0.0", - "site_internal_id": 2, - "site_country_code": "country", - "owner_subscription_id": "93cba8dc-7424-44c0-8872-13159df93042", - "site_bgp_community_id": 2, - "subscription_instance_id": "6bf4f274-6496-438d-9dba-9c3984d0ec07", + "router_fqdn": "rt1.city.country.geant.net", + "router_role": "p", + "router_site": { + "name": "SiteBlock", + "label": None, + "site_city": faker.city(), + "site_name": "city", + "site_tier": "1", + "site_country": faker.country(), + "site_latitude": float(faker.latitude()), + "site_longitude": float(faker.longitude()), + "site_ts_address": faker.ipv4(), + "site_internal_id": faker.pyint(), + "site_country_code": faker.country_code(), + "owner_subscription_id": faker.uuid4(), + "site_bgp_community_id": faker.pyint(), + "subscription_instance_id": faker.uuid4(), + }, + "router_vendor": "juniper", + "router_ts_port": faker.pyint(), + "router_access_via_ts": faker.pybool(), + "owner_subscription_id": faker.uuid4(), + "router_lo_iso_address": "49.51e5.0001.0620.4009.6014.00", + "router_lo_ipv4_address": faker.ipv4(), + "router_lo_ipv6_address": faker.ipv6(), + "router_si_ipv4_network": faker.ipv4() + "/31", + "router_is_ias_connected": faker.pybool(), + "subscription_instance_id": faker.uuid4(), + "router_ias_lt_ipv4_network": faker.ipv4() + "/31", + "router_ias_lt_ipv6_network": faker.ipv6() + "/126", }, - "router_vendor": "juniper", - "router_ts_port": 11111, - "router_access_via_ts": True, - "owner_subscription_id": "9cb1fc7d-9608-42ce-aacc-2a97f9620a91", - "router_lo_iso_address": "49.51e5.0001.0620.4009.6066.00", - "router_lo_ipv4_address": "0.0.0.0", - "router_lo_ipv6_address": "::", - "router_si_ipv4_network": "0.0.0.0/31", - "router_is_ias_connected": True, - "subscription_instance_id": "6d09394e-658b-4e55-8b1f-8b812d59f5a1", - "router_ias_lt_ipv4_network": "0.0.0.0/31", - "router_ias_lt_ipv6_network": "::/126", + "iptrunk_side_ae_iface": "ae1", + "owner_subscription_id": faker.uuid4(), + "iptrunk_side_ae_members": ["ge-0/0/0", "ge-0/0/1"], + "subscription_instance_id": faker.uuid4(), + "iptrunk_side_ae_geant_a_sid": "SID-11112", + "iptrunk_side_ae_members_description": [faker.pystr(), faker.pystr()], }, - "iptrunk_side_ae_iface": "ae1", - "owner_subscription_id": "c9ddbe14-e107-4749-82ac-e22091cdb132", - "iptrunk_side_ae_members": ["ge-0/0/0", "ge-0/0/1"], - }, - ], - }, - "status": "provisioning", -} - -_MIGRATION_OBJECT = { - "new_node": { - "description": "Router rt1.luc.it.geant.net", - "router": { - "router_access_via_ts": "true", - "router_fqdn": "rt1.luc.it.geant.net", - "router_role": "pe", - "router_is_ias_connected": "false", - "router_lo_ipv4_address": "62.40.96.7", - "router_lo_ipv6_address": "2001:798:aa:1::49", - "router_lo_iso_address": "49.51e5.0001.0620.4009.6007.00", - "router_site": { - "name": "SiteBlock", - "label": "null", - "site_city": "Lucca", - "site_name": "luc", - "site_tier": "1", - "site_country": "Italy", - "site_latitude": "10.0", - "site_longitude": "43.0", - "site_ts_address": "172.16.100.151", - "site_internal_id": 133, - "site_country_code": "IT", - "owner_subscription_id": "f4bacf38-39bb-4553-8e74-190699bd9b4e", - "site_bgp_community_id": 33, - "subscription_instance_id": "2cf443a2-4039-4402-ab75-73ff1a1096f5", - }, - "router_ts_port": 22111, - "router_vendor": "juniper", + ], }, "status": "provisioning", - }, - "new_lag_interface": "ae1", - "new_lag_member_interfaces": ["ge-0/0/0", "ge-0/0/1"], - "replace_index": 0, -} + } + + +@pytest.fixture(scope="session") +def migration_object(faker: Faker) -> dict: + return { + "new_node": { + "description": "Router rt1.luc.it.geant.net", + "router": { + "router_access_via_ts": "true", + "router_fqdn": "rt1.luc.it.geant.net", + "router_role": "pe", + "router_is_ias_connected": faker.pybool(), + "router_lo_ipv4_address": faker.ipv4(), + "router_lo_ipv6_address": faker.ipv6(), + "router_lo_iso_address": "49.51e5.0001.0620.4009.6007.00", + "router_site": { + "name": "SiteBlock", + "label": "null", + "site_city": faker.city(), + "site_name": "luc", + "site_tier": "1", + "site_country": faker.country(), + "site_latitude": "10.0", + "site_longitude": "43.0", + "site_ts_address": faker.ipv4(), + "site_internal_id": faker.pyint(), + "site_country_code": faker.country_code(), + "owner_subscription_id": faker.uuid4(), + "site_bgp_community_id": faker.pyint(), + "subscription_instance_id": faker.uuid4(), + }, + "router_ts_port": faker.pyint(), + "router_vendor": "juniper", + }, + "status": "provisioning", + }, + "new_lag_interface": "ae1", + "new_lag_member_interfaces": ["ge-0/0/0", "ge-0/0/1"], + "replace_index": 0, + } @responses.activate -def test_ip_trunk_provisioning(client: TestClient) -> None: +def test_ip_trunk_provisioning(client: TestClient, subscription_object: dict) -> None: responses.put(url=TEST_CALLBACK_URL, status=204) params = { @@ -156,7 +167,7 @@ def test_ip_trunk_provisioning(client: TestClient) -> None: "dry_run": True, "object": "trunk_interface", "verb": "deploy", - "subscription": _SUBSCRIPTION_OBJECT, + "subscription": subscription_object, } with patch("lso.playbook.ansible_runner.run", new=test_ansible_runner_run) as _: @@ -173,7 +184,7 @@ def test_ip_trunk_provisioning(client: TestClient) -> None: @responses.activate -def test_ip_trunk_modification(client: TestClient) -> None: +def test_ip_trunk_modification(client: TestClient, subscription_object: dict) -> None: responses.put(url=TEST_CALLBACK_URL, status=204) params = { @@ -182,8 +193,8 @@ def test_ip_trunk_modification(client: TestClient) -> None: "tt_number": "TT123456789", "dry_run": True, "verb": "modify", - "subscription": _SUBSCRIPTION_OBJECT, - "old_subscription": _SUBSCRIPTION_OBJECT, + "subscription": subscription_object, + "old_subscription": subscription_object, } with patch("lso.playbook.ansible_runner.run", new=test_ansible_runner_run) as _: @@ -200,7 +211,7 @@ def test_ip_trunk_modification(client: TestClient) -> None: @responses.activate -def test_ip_trunk_deletion(client: TestClient) -> None: +def test_ip_trunk_deletion(client: TestClient, subscription_object: dict) -> None: responses.put(url=TEST_CALLBACK_URL, status=204) params = { @@ -209,7 +220,7 @@ def test_ip_trunk_deletion(client: TestClient) -> None: "tt_number": "TT123456789", "dry_run": True, "verb": "terminate", - "subscription": _SUBSCRIPTION_OBJECT, + "subscription": subscription_object, } with patch("lso.playbook.ansible_runner.run", new=test_ansible_runner_run) as _: @@ -226,7 +237,7 @@ def test_ip_trunk_deletion(client: TestClient) -> None: @responses.activate -def test_ip_trunk_migration(client: TestClient) -> None: +def test_ip_trunk_migration(client: TestClient, subscription_object: dict, migration_object: dict) -> None: responses.put(url=TEST_CALLBACK_URL, status=204) params = { @@ -236,8 +247,8 @@ def test_ip_trunk_migration(client: TestClient) -> None: "tt_number": "TT123456789", "verb": "migrate", "config_object": "trunk_interface", - "subscription": _SUBSCRIPTION_OBJECT, - "new_side": _MIGRATION_OBJECT, + "subscription": subscription_object, + "new_side": migration_object, } with patch("lso.playbook.ansible_runner.run", new=test_ansible_runner_run) as _: diff --git a/test/routes/test_router.py b/test/routes/test_router.py index 3f7c5aa912302e97a99e6e3c3ebd223fe7167124..96af82937e3e5b3a1124d0eae8104d56a52e558a 100644 --- a/test/routes/test_router.py +++ b/test/routes/test_router.py @@ -3,6 +3,7 @@ from unittest.mock import patch import jsonschema import responses +from faker import Faker from starlette.testclient import TestClient from lso.playbook import PlaybookLaunchResponse @@ -10,29 +11,29 @@ from test.routes import TEST_CALLBACK_URL, test_ansible_runner_run @responses.activate -def test_router_provisioning(client: TestClient) -> None: +def test_router_provisioning(client: TestClient, faker: Faker) -> None: responses.put(url=TEST_CALLBACK_URL, status=204) params = { "callback": TEST_CALLBACK_URL, - "dry_run": True, - "process_id": "cb5f6c71-63d7-4857-9124-4fc6e7ef3f41", - "tt_number": "TT123456789", + "dry_run": faker.pybool(), + "process_id": faker.uuid4(), + "tt_number": faker.pystr(), "verb": "deploy", "subscription": { "router": { - "ts_address": "127.0.0.1", - "ts_port": "1234", + "ts_address": faker.ipv4(), + "ts_port": str(faker.pyint()), "router_fqdn": "bogus.fqdn.org", - "lo_address": {"v4": "1.2.3.4", "v6": "2001:db8::1"}, + "lo_address": {"v4": faker.ipv4(), "v6": faker.ipv6()}, "lo_iso_address": "1.2.3.4.5.6", "snmp_location": "city,country[1.2,3.4]", - "si_ipv4_network": "1.2.3.0/24", - "ias_lt_network": {"v4": "1.2.3.0/24", "v6": "2001:db8::/64"}, - "site_country_code": "XX", - "site_city": "NOWHERE", - "site_latitude": "0.000", - "site_longitude": "0.000", + "si_ipv4_network": faker.ipv4() + "/24", + "ias_lt_network": {"v4": faker.ipv4() + "/24", "v6": faker.ipv6() + "/64"}, + "site_country_code": faker.country_code(), + "site_city": faker.city(), + "site_latitude": float(faker.latitude()), + "site_longitude": float(faker.longitude()), }, "router_type": "router", "router_vendor": "vendor",