diff --git a/gso/oss-params-example.json b/gso/oss-params-example.json index 86e65d7f4309d2729d08bbcd7ada03b12ec0955f..a13415dd26ddb0a58ad7eb65abcfd191c2e40de2 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 5bdf205d461287b74ed21fc572c0d5b723de7da0..7dc9c6f08bbd6bb5f007b081dcb003662338ade3 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 ef78633201a788bbca4c3e70fe4bc9fb8d06dfe9..11cebf9d63dcf14633cae189df201ab295d31532 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 2a492c392fd1988411b8ea79383914cf56ecb18f..1d39fcdbe0bd9d28054c681dccd5c887d2521e0c 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 )