diff --git a/gso/oss-params-example.json b/gso/oss-params-example.json index afc41967d1dbe3eb333eca86567f4546db71dcdd..4f4bca6c8c29ea38ef67272251fe21409685296b 100644 --- a/gso/oss-params-example.json +++ b/gso/oss-params-example.json @@ -12,18 +12,18 @@ "password": "robot-user-password" }, "LO": { - "V4": {"containers": ["1.1.0.0/24"], "mask": 32}, - "V6": {"containers": ["dead:beef::/64"], "mask": 128}, + "V4": {"containers": ["1.1.0.0/24"], "networks": [], "mask": 32}, + "V6": {"containers": ["dead:beef::/64"], "networks": [], "mask": 128}, "domain_name": ".lo" }, "TRUNK": { - "V4": {"containers": ["1.1.1.0/24"], "mask": 31}, - "V6": {"containers": ["dead:beef::/64"], "mask": 126}, + "V4": {"containers": ["1.1.1.0/24"], "networks": [], "mask": 31}, + "V6": {"containers": ["dead:beef::/64"], "networks": [], "mask": 126}, "domain_name": ".trunk" }, "GEANT_IP": { - "V4": {"containers": ["1.1.2.0/24"], "mask": 31}, - "V6": {"containers": ["dead:beef::/64"], "mask": 126}, + "V4": {"containers": ["1.1.2.0/24"], "networks": [], "mask": 31}, + "V6": {"containers": ["dead:beef::/64"], "networks": [], "mask": 126}, "domain_name": ".geantip" } }, diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py index 0368a473a214c3373ad44cabd4265ca317574280..d7646e5da5b0ff2f484372266abf905d5302206e 100644 --- a/gso/workflows/device/create_device.py +++ b/gso/workflows/device/create_device.py @@ -19,10 +19,11 @@ from gso.products.product_types import device from gso.products.product_types.device import DeviceInactive, \ DeviceProvisioning from gso.products.product_types.site import Site +from gso.services import _ipam from gso.services import provisioning_proxy from gso.services.provisioning_proxy import await_pp_results, \ confirm_pp_results -from gso.services import ipam, _ipam + def site_selector() -> list: site_subscriptions = {} @@ -85,21 +86,13 @@ def iso_from_ipv4(ipv4_address): @step('Get information from IPAM') def get_info_from_ipam(subscription: DeviceProvisioning) -> State: - # lo = ipam.new_device_lo_address() - # subscription.device.lo_ipv4_address = lo.v4 - # subscription.device.lo_ipv6_address = lo.v6 - # TODO: get info about how these should be generated - lo0_alias = re.sub(".geant.net", "", subscription.device.device_fqdn) - lo0_name = f"lo0.{lo0_alias}" - #print(lo0_alias) - lo0_addr = _ipam.allocate_service_host(hostname=lo0_name, service_type='LO', cname_aliases=[lo0_alias]) + lo0_alias = re.sub('.geant.net', '', subscription.device.device_fqdn) + lo0_name = f'lo0.{lo0_alias}' + lo0_addr = _ipam.allocate_service_host(hostname=lo0_name, + service_type='LO', + cname_aliases=[lo0_alias]) subscription.device.device_lo_ipv4_address = lo0_addr.v4 subscription.device.device_lo_ipv6_address = lo0_addr.v6 - # subscription.device.device_lo_ipv4_address = \ - # ipam.new_service_host() - # ipaddress.ip_address('10.10.10.20') - # subscription.device.device_lo_ipv6_address = \ - # ipaddress.ip_address('fc00:798:10::20') subscription.device.device_lo_iso_address \ = iso_from_ipv4(str(subscription.device.device_lo_ipv4_address)) subscription.device.device_si_ipv4_network = '192.168.0.0/31' @@ -123,20 +116,19 @@ def initialize_subscription( subscription.device.device_vendor = device_vendor subscription.device.device_site \ = Site.from_subscription(device_site[0]).site - fqdn = f"{hostname}.{subscription.device.device_site.site_name.lower()}.{subscription.device.device_site.site_country_code.lower()}.geant.net" - #fqdn = str(hostname + '.' + - # subscription.device.device_site.site_name.lower() + '.' + - # subscription.device.device_site.site_country_code.lower() + - # '.geant.net') + fqdn = f'{hostname}.{subscription.device.device_site.site_name.lower()}.' \ + f'{subscription.device.device_site.site_country_code.lower()}' \ + f'.geant.net' subscription.device.device_fqdn = fqdn subscription.device.device_role = device_role subscription.description = f'Device {fqdn} ' \ f'({subscription.device_type})' + subscription = device.DeviceProvisioning.from_other_lifecycle( subscription, SubscriptionLifecycle.PROVISIONING ) - return {'subscription': subscription, 'fqdn': fqdn} + return {'subscription': subscription} @step('Provision device [DRY RUN]') diff --git a/test/conftest.py b/test/conftest.py index 2ef1475af538d31f0a235e78bd42fb79a834d859..e714bf98ee8be66741b220731ba07ae1693ab16b 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -2,9 +2,10 @@ import contextlib import json import os import socket -import pytest import tempfile +import pytest + @pytest.fixture(scope='session') def configuration_data(): @@ -26,17 +27,21 @@ def configuration_data(): "password": "robot-user-password" }, "LO": { - "V4": {"containers": ["10.255.255.0/24"], "mask": 32}, - "V6": {"containers": ["dead:beef::/64"], "mask": 128}, + "V4": {"containers": ["10.255.255.0/24"], "networks": [], + "mask": 32}, + "V6": {"containers": ["dead:beef::/64"], "networks": [], + "mask": 128}, "domain_name": ".lo" }, "TRUNK": { "V4": { "containers": ["10.255.255.0/24", "10.255.254.0/24"], + "networks": [], "mask": 31 }, "V6": { "containers": ["dead:beef::/64", "dead:beee::/64"], + "networks": [], "mask": 126 }, "domain_name": ".trunk" @@ -44,10 +49,12 @@ def configuration_data(): "GEANT_IP": { "V4": { "containers": ["10.255.255.0/24", "10.255.254.0/24"], + "networks": [], "mask": 31 }, "V6": { "containers": ["dead:beef::/64", "dead:beee::/64"], + "networks": [], "mask": 126 }, "domain_name": ".geantip" diff --git a/test/test_ipam.py b/test/test_ipam.py index 2778148347a7fe84164305d86029efe3c5750ddc..23c1aec2ce6598a64d34e65f6cf421839af85629 100644 --- a/test/test_ipam.py +++ b/test/test_ipam.py @@ -1,5 +1,6 @@ import ipaddress import re + import responses from gso.services import ipam @@ -7,12 +8,12 @@ from gso.services import ipam @responses.activate def test_new_service_networks(data_config_filename): - responses.add( method=responses.POST, url=re.compile(r'.*/wapi.*/network.*'), json={ - '_ref': 'network/ZG5zLm5ldHdvcmskMTAuMjU1LjI1NS4yMC8zMi8w:10.255.255.20/32/default', # noqa: E501 + '_ref': 'network/ZG5zLm5ldHdvcmskMTAuMjU1LjI1NS4yMC8zMi8w:10.255.2' + '55.20/32/default', # noqa: E501 'network': '10.255.255.20/32' } ) @@ -21,7 +22,8 @@ def test_new_service_networks(data_config_filename): method=responses.POST, url=re.compile(r'.*/wapi.*/ipv6network.*'), json={ - '_ref': 'ipv6network/ZG5zLm5ldHdvcmskZGVhZDpiZWVmOjoxOC8xMjgvMA:dead%3Abeef%3A%3A18/128/default', # noqa: E501 + '_ref': 'ipv6network/ZG5zLm5ldHdvcmskZGVhZDpiZWVmOjoxOC8xMjgvMA:de' + 'ad%3Abeef%3A%3A18/128/default', # noqa: E501 'network': 'dead:beef::18/128' } ) @@ -35,23 +37,25 @@ def test_new_service_networks(data_config_filename): @responses.activate def test_new_service_host(data_config_filename): - responses.add( method=responses.POST, url=re.compile(r'.*/wapi.*/record:host$'), - json='record:host/ZG5zLmhvc3QkLm5vbl9ETlNfaG9zdF9yb290LjAuMTY4MzcwNTU4MzY3MC5nc28udGVzdA:test.lo/%20' # noqa: E501 + json='record:host/ZG5zLmhvc3QkLm5vbl9ETlNfaG9zdF9yb290LjAuMTY4MzcwNTU4' + 'MzY3MC5nc28udGVzdA:test.lo/%20' # noqa: E501 ) responses.add( method=responses.POST, url=re.compile(r'.*/wapi.*/record:a$'), - json='record:a/ZG5zLmJpbmRfYSQuX2RlZmF1bHQuZ3NvLHRlc3QsMTAuMjU1LjI1NS44:test.lo/default' # noqa: E501 + json='record:a/ZG5zLmJpbmRfYSQuX2RlZmF1bHQuZ3NvLHRlc3QsMTAuMjU1LjI1NS4' + '4:test.lo/default' # noqa: E501 ) responses.add( method=responses.POST, url=re.compile(r'.*/wapi.*/record:aaaa$'), - json='record:aaaa/ZG5zLmJpbmRfYSQuX2RlZmF1bHQuZ3NvLHRlc3QsMTAuMjU1LjI1NS44:test.lo/default' # noqa: E501 + json='record:aaaa/ZG5zLmJpbmRfYSQuX2RlZmF1bHQuZ3NvLHRlc3QsMTAuMjU1LjI1' + 'NS44:test.lo/default' # noqa: E501 ) responses.add( @@ -59,7 +63,8 @@ def test_new_service_host(data_config_filename): url=re.compile(r'.*/wapi.*/network.*'), json=[ { - "_ref": "network/ZG5zLm5ldHdvcmskMTAuMjU1LjI1NS4yMC8zMi8w:10.255.255.20/32/default", # noqa: E501 + "_ref": "network/ZG5zLm5ldHdvcmskMTAuMjU1LjI1NS4yMC8zMi8w:10.2" + "55.255.20/32/default", # noqa: E501 "network": "10.255.255.20/32", "network_view": "default" } @@ -72,7 +77,8 @@ def test_new_service_host(data_config_filename): url=re.compile(r'.*/wapi.*/ipv6network.*'), json=[ { - "_ref": "ipv6network/ZG5zLm5ldHdvcmskZGVhZDpiZWVmOjoxOC8xMjgvMA:dead%3Abeef%3A%3A18/128/default", # noqa: E501 + "_ref": "ipv6network/ZG5zLm5ldHdvcmskZGVhZDpiZWVmOjoxOC8xMjgvM" + "A:dead%3Abeef%3A%3A18/128/default", # noqa: E501 "network": "dead:beef::18/128", "network_view": "default" } @@ -81,13 +87,17 @@ def test_new_service_host(data_config_filename): responses.add( method=responses.POST, - url=re.compile(r'.*/wapi.*/network.*/.*?_function=next_available_ip&num=1.*'), # noqa: E501 + url=re.compile( + r'.*/wapi.*/network.*/.*?_function=next_available_ip&num=1.*'), + # noqa: E501 json={'ips': ['10.255.255.20']} ) responses.add( method=responses.POST, - url=re.compile(r'.*/wapi.*/ipv6network.*/.*?_function=next_available_ip&num=1.*'), # noqa: E501 + url=re.compile( + r'.*/wapi.*/ipv6network.*/.*?_function=next_available_ip&num=1.*'), + # noqa: E501 json={'ips': ['dead:beef::18']} )