From 60cd8c05ccfed75ef517c332f0213b5596d4bf42 Mon Sep 17 00:00:00 2001 From: Karel van Klink <karel.vanklink@geant.org> Date: Thu, 4 May 2023 15:07:25 +0200 Subject: [PATCH] CreateDevice workflow now calls LSO --- gso/oss-params-example.json | 3 +- gso/services/provisioning_proxy.py | 37 ++++++++++++++++++----- gso/settings.py | 1 + gso/workflows/device/create_device.py | 42 +++++++++++++-------------- 4 files changed, 53 insertions(+), 30 deletions(-) diff --git a/gso/oss-params-example.json b/gso/oss-params-example.json index 86e65d7f..a13415dd 100644 --- a/gso/oss-params-example.json +++ b/gso/oss-params-example.json @@ -21,7 +21,8 @@ } }, "PROVISIONING_PROXY": { - "api_base": "http://localhost:44444", + "scheme": "https", + "api_base": "localhost:44444", "auth": "Bearer <token>", "api_version": 1123 } diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py index 5bdf205d..7dc9c6f0 100644 --- a/gso/services/provisioning_proxy.py +++ b/gso/services/provisioning_proxy.py @@ -4,28 +4,51 @@ from gso.products.product_blocks.device import DeviceBlockProvisioning from gso import settings import requests +from gso.products.product_types.device import DeviceProvisioning + logger = logging.getLogger(__name__) def provision_node( - node_subscription_params: DeviceBlockProvisioning, + node_subscription_params: DeviceProvisioning, callback_url: str, dry_run: bool = True): oss = settings.load_oss_params() pp_params = oss.PROVISIONING_PROXY assert pp_params - logger.debug(f'[disabled] provisioning node {node_subscription_params}') + device_params = node_subscription_params.device + logger.debug(f'[disabled] provisioning node {device_params}') parameters = { 'callback': callback_url, 'dry_run': dry_run, - 'device': node_subscription_params.dict() + 'device': { + 'fqdn': device_params.fqdn, + 'lo_address': { + 'v4': str(device_params.lo_ipv4_address), + 'v6': str(device_params.lo_ipv6_address) + }, + 'lo_iso_address': device_params.lo_iso_address, + 'si_ipv4_network': str(device_params.si_ipv4_network), + 'ias_lt_network': { + 'v4': str(device_params.ias_lt_ipv4_network), + 'v6': str(device_params.ias_lt_ipv6_network) + }, + 'site_country_code': device_params.site_country_code, + 'site_city': device_params.site_city, + 'site_latitude': device_params.site_latitude, + 'site_longitude': device_params.site_longitude, + 'snmp_location': device_params.snmp_location, + 'device_type': node_subscription_params.device_type, + 'device_vendor': node_subscription_params.device_vendor, + 'ts_address': device_params.ts_address, + 'ts_port': device_params.ts_port + } } - r = requests.post( - f'https://{pp_params.api_base}' + post_request = requests.post( + f'{pp_params.scheme}://{pp_params.api_base}' f'/api/device', json=parameters) - r.raise_for_status() - requests.post() \ No newline at end of file + post_request.raise_for_status() diff --git a/gso/settings.py b/gso/settings.py index ef786332..11cebf9d 100644 --- a/gso/settings.py +++ b/gso/settings.py @@ -38,6 +38,7 @@ class IPAMParams(BaseSettings): class ProvisioningProxyParams(BaseSettings): + scheme: str api_base: str auth: str # FIXME: unfinished api_version: int diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py index 2a492c39..1d39fcdb 100644 --- a/gso/workflows/device/create_device.py +++ b/gso/workflows/device/create_device.py @@ -1,6 +1,7 @@ import ipaddress from uuid import uuid4 +from orchestrator.config.assignee import Assignee from orchestrator.forms import FormPage from orchestrator.targets import Target from orchestrator.workflow import inputstep @@ -14,7 +15,8 @@ from orchestrator.workflows.utils import wrap_create_initial_input_form from gso import settings from gso.services import provisioning_proxy -from gso.products.product_types import device +from gso.products.product_types.device import DeviceVendor, DeviceInactive, \ + DeviceProvisioning def initial_input_form_generator(product_name: str) -> FormGenerator: @@ -25,7 +27,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: fqdn: str ts_address: ipaddress.IPv4Address ts_port: int - device_vendor: device.DeviceVendor + device_vendor: DeviceVendor user_input = yield CreateDeviceForm @@ -34,7 +36,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: @step("Create subscription") def create_subscription(product: UUIDstr) -> State: - subscription = device.DeviceInactive.from_product_id(product, uuid4()) + subscription = DeviceInactive.from_product_id(product, uuid4()) return { "subscription": subscription, @@ -43,7 +45,7 @@ def create_subscription(product: UUIDstr) -> State: @step("Get information from IPAM ") -def get_info_from_ipam(subscription: device.DeviceInactive) -> State: +def get_info_from_ipam(subscription: DeviceInactive) -> State: # lo = ipam.new_device_lo_address() # subscription.device.lo_ipv4_address = lo.v4 # subscription.device.lo_ipv6_address = lo.v6 @@ -58,7 +60,7 @@ def get_info_from_ipam(subscription: device.DeviceInactive) -> State: @step("get information about SNMP") -def get_snmp_info(subscription: device.DeviceInactive) -> State: +def get_snmp_info(subscription: DeviceInactive) -> State: country = 'Spain' city = 'Barcelona' country_code = 'ES' @@ -78,11 +80,11 @@ def get_snmp_info(subscription: device.DeviceInactive) -> State: @step("Initialize subscription") def initialize_subscription( - subscription: device.DeviceInactive, + subscription: DeviceInactive, fqdn: str, ts_address: ipaddress.IPv4Address, ts_port: str, - device_vendor: device.DeviceVendor + device_vendor: DeviceVendor ) -> State: subscription.device.fqdn = fqdn subscription.device.ts_address = str(ts_address) @@ -90,7 +92,7 @@ def initialize_subscription( subscription.device_vendor = device_vendor subscription.description = f"Device {fqdn} type \ ({subscription.device_type})" - subscription = device.DeviceProvisioning.from_other_lifecycle( + subscription = DeviceProvisioning.from_other_lifecycle( subscription, SubscriptionLifecycle.PROVISIONING ) @@ -98,13 +100,13 @@ def initialize_subscription( @step("Provision device [DRY RUN]") -def provision_device_dry(subscription: device.DeviceProvisioning) -> State: +def provision_device_dry(subscription: DeviceProvisioning) -> State: # TODO: verify this URL callback_url = f'{settings.load_oss_params().GENERAL.public_hostname}' \ f'/api/process/{subscription.product.product_id}/resume' - proxy_result = provisioning_proxy.provision_node( - subscription.device, + provisioning_proxy.provision_node( + subscription, callback_url ) @@ -136,32 +138,28 @@ def provision_device_dry(subscription: device.DeviceProvisioning) -> State: # dry_run=True) # TODO: figure out what to return when we are suspending & waiting # for the provisioning-proxy to call back - return {"subscription": proxy_result} + + return {'subscription': subscription} -@inputstep("Confirm step", assignee="CHANGES") -def confirm_step() -> FormGenerator: +@inputstep("Confirm step", assignee=Assignee('SYSTEM')) +def confirm_step(subscription: DeviceProvisioning) -> State: class ConfirmForm(FormPage): confirm: Accept user_input = yield ConfirmForm - return {"confirm": user_input.confirm} + return {'subscription': subscription, 'confirm': user_input} @step("Provision device [FOR REAL]") -def provision_device_real( - subscription: device.DeviceProvisioning, - fqdn: str, - ts_address: str, - ts_port: str -) -> State: +def provision_device_real(subscription: DeviceProvisioning) -> State: # TODO: generate actual callback URL callback_url = settings.load_oss_params().GENERAL.public_hostname provisioning_proxy.provision_node( - subscription.device, + subscription, callback_url, False ) -- GitLab