diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py index 7dc9c6f08bbd6bb5f007b081dcb003662338ade3..ea96507da8fe9dad6685029ee075473a2afcec5e 100644 --- a/gso/services/provisioning_proxy.py +++ b/gso/services/provisioning_proxy.py @@ -1,5 +1,7 @@ import logging +from orchestrator.types import UUIDstr + from gso.products.product_blocks.device import DeviceBlockProvisioning from gso import settings import requests @@ -11,13 +13,15 @@ logger = logging.getLogger(__name__) def provision_node( node_subscription_params: DeviceProvisioning, - callback_url: str, + process_id: UUIDstr, dry_run: bool = True): oss = settings.load_oss_params() pp_params = oss.PROVISIONING_PROXY assert pp_params device_params = node_subscription_params.device + callback_url = f'{settings.load_oss_params().GENERAL.public_hostname}' \ + f'/api/process/{process_id}/resume' # TODO: verify this URL logger.debug(f'[disabled] provisioning node {device_params}') parameters = { diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py index 1d39fcdbe0bd9d28054c681dccd5c887d2521e0c..51fced6409e1c7face78f305bfd2537a3758d349 100644 --- a/gso/workflows/device/create_device.py +++ b/gso/workflows/device/create_device.py @@ -3,20 +3,20 @@ 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 from orchestrator.forms.validators import Accept +from orchestrator.targets import Target from orchestrator.types import FormGenerator, State from orchestrator.types import SubscriptionLifecycle, UUIDstr from orchestrator.workflow import done, init, step, workflow +from orchestrator.workflow import inputstep from orchestrator.workflows.steps import resync, set_status from orchestrator.workflows.steps import store_process_subscription 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.device import DeviceVendor, DeviceInactive, \ DeviceProvisioning +from gso.services import provisioning_proxy def initial_input_form_generator(product_name: str) -> FormGenerator: @@ -34,32 +34,33 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: return user_input.dict() -@step("Create subscription") +@step('Create subscription') def create_subscription(product: UUIDstr) -> State: subscription = DeviceInactive.from_product_id(product, uuid4()) return { - "subscription": subscription, - "subscription_id": subscription.subscription_id, + 'subscription': subscription, + 'subscription_id': subscription.subscription_id, } -@step("Get information from IPAM ") +@step('Get information from IPAM') 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 # TODO: get info about how these should be generated - subscription.device.lo_ipv4_address = "10.10.10.10" - subscription.device.lo_ipv6_address = "fc00:798:10::10" - subscription.device.lo_iso_address = "49.51e5.0001.0620.4009.6047.00" - subscription.device.si_ipv4_network = "192.168.0.0/31" - subscription.device.ias_lt_ipv4_network = "192.168.1.0/31" - subscription.device.ias_lt_ipv6_network = "fc00:798:1::150/126" - return {"subscription": subscription} + subscription.device.lo_ipv4_address = '10.10.10.10' + subscription.device.lo_ipv6_address = 'fc00:798:10::10' + subscription.device.lo_iso_address = '49.51e5.0001.0620.4009.6047.00' + subscription.device.si_ipv4_network = '192.168.0.0/31' + subscription.device.ias_lt_ipv4_network = '192.168.1.0/31' + subscription.device.ias_lt_ipv6_network = 'fc00:798:1::150/126' + return {'subscription': subscription} -@step("get information about SNMP") + +@step('Get information about SNMP') def get_snmp_info(subscription: DeviceInactive) -> State: country = 'Spain' city = 'Barcelona' @@ -75,64 +76,62 @@ def get_snmp_info(subscription: DeviceInactive) -> State: f'{city.upper()},{country.upper()}[{latitude},{longitude}]' ) - return {"subscription": subscription} + return {'subscription': subscription} -@step("Initialize subscription") +@step('Initialize subscription') def initialize_subscription( - subscription: DeviceInactive, - fqdn: str, - ts_address: ipaddress.IPv4Address, - ts_port: str, - device_vendor: DeviceVendor + subscription: DeviceInactive, + fqdn: str, + ts_address: ipaddress.IPv4Address, + ts_port: str, + device_vendor: DeviceVendor ) -> State: subscription.device.fqdn = fqdn subscription.device.ts_address = str(ts_address) subscription.device.ts_port = str(ts_port) subscription.device_vendor = device_vendor - subscription.description = f"Device {fqdn} type \ - ({subscription.device_type})" + subscription.description = f'Device {fqdn} ' \ + f'({subscription.device_type})' subscription = DeviceProvisioning.from_other_lifecycle( subscription, SubscriptionLifecycle.PROVISIONING ) - return {"subscription": subscription} + return {'subscription': subscription} -@step("Provision device [DRY RUN]") -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' +@step('Provision device [DRY RUN]') +def provision_device_dry(subscription: DeviceProvisioning, + process_id: UUIDstr) -> State: provisioning_proxy.provision_node( subscription, - callback_url + process_id ) # import ansible_runner # # r = ansible_runner.run( - # private_data_dir="/opt/geant-gap-ansible", - # playbook="base_config.yaml", + # private_data_dir='/opt/geant-gap-ansible', + # playbook='base_config.yaml', # inventory=subscription.device.fqdn, # extravars={ - # "lo_ipv4_address": str(subscription.device.lo_ipv4_address), - # "lo_ipv6_address": str(subscription.device.lo_ipv6_address), - # "lo_iso_address": subscription.device.lo_iso_address, - # "snmp_location": subscription.device.snmp_location, - # "si_ipv4_network": str(subscription.device.si_ipv4_network), - # "lt_ipv4_network": str(subscription.device.ias_lt_ipv4_network), - # "lt_ipv6_network": str(subscription.device.ias_lt_ipv6_network), - # "site_country_code": subscription.device.site_country_code, - # "verb": "deploy", + # 'lo_ipv4_address': str(subscription.device.lo_ipv4_address), + # 'lo_ipv6_address': str(subscription.device.lo_ipv6_address), + # 'lo_iso_address': subscription.device.lo_iso_address, + # 'snmp_location': subscription.device.snmp_location, + # 'si_ipv4_network': str(subscription.device.si_ipv4_network), + # 'lt_ipv4_network': str(subscription.device.ias_lt_ipv4_network), + # 'lt_ipv6_network': str(subscription.device.ias_lt_ipv6_network), + # 'site_country_code': subscription.device.site_country_code, + # 'verb': 'deploy', # }, # ) # out = r.stdout.read() # out_splitted = out.splitlines() # # if r.rc != 0: - # # raise ValueError("Ansible has failed") - # return {"dry_run_output": out_splitted, "return_code": r.rc} + # # raise ValueError('Ansible has failed') + # return {'dry_run_output': out_splitted, 'return_code': r.rc} # provisioning_proxy.provision_node( # node_subscription_params=subscription, # dry_run=True) @@ -142,7 +141,7 @@ def provision_device_dry(subscription: DeviceProvisioning) -> State: return {'subscription': subscription} -@inputstep("Confirm step", assignee=Assignee('SYSTEM')) +@inputstep('Verify dry run results', assignee=Assignee('SYSTEM')) def confirm_step(subscription: DeviceProvisioning) -> State: class ConfirmForm(FormPage): confirm: Accept @@ -152,51 +151,49 @@ def confirm_step(subscription: DeviceProvisioning) -> State: return {'subscription': subscription, 'confirm': user_input} -@step("Provision device [FOR REAL]") -def provision_device_real(subscription: DeviceProvisioning) -> State: - - # TODO: generate actual callback URL - callback_url = settings.load_oss_params().GENERAL.public_hostname +@step('Provision device [FOR REAL]') +def provision_device_real(subscription: DeviceProvisioning, + process_id: UUIDstr) -> State: provisioning_proxy.provision_node( subscription, - callback_url, + process_id, False ) # import ansible_runner # # r = ansible_runner.run( - # private_data_dir="/opt/geant-gap-ansible", - # playbook="base_config.yaml", + # private_data_dir='/opt/geant-gap-ansible', + # playbook='base_config.yaml', # inventory=subscription.device.fqdn, # extravars={ - # "lo_ipv4_address": str(subscription.device.lo_ipv4_address), - # "lo_ipv6_address": str(subscription.device.lo_ipv6_address), - # "lo_iso_address": subscription.device.lo_iso_address, - # "snmp_location": subscription.device.snmp_location, - # "si_ipv4_network": str(subscription.device.si_ipv4_network), - # "lt_ipv4_network": str(subscription.device.ias_lt_ipv4_network), - # "lt_ipv6_network": str(subscription.device.ias_lt_ipv6_network), - # "site_country_code": subscription.device.site_country_code, - # "verb": "deploy", + # 'lo_ipv4_address': str(subscription.device.lo_ipv4_address), + # 'lo_ipv6_address': str(subscription.device.lo_ipv6_address), + # 'lo_iso_address': subscription.device.lo_iso_address, + # 'snmp_location': subscription.device.snmp_location, + # 'si_ipv4_network': str(subscription.device.si_ipv4_network), + # 'lt_ipv4_network': str(subscription.device.ias_lt_ipv4_network), + # 'lt_ipv6_network': str(subscription.device.ias_lt_ipv6_network), + # 'site_country_code': subscription.device.site_country_code, + # 'verb': 'deploy', # }, # ) # out = r.stdout.read() # out_splitted = out.splitlines() # - # return {"real_run_output": out_splitted, "return_code": r.rc} + # return {'real_run_output': out_splitted, 'return_code': r.rc} # provisioning_proxy.provision_node( # node_subscription_params=subscription) # TODO: figure out what to return when we are suspending & waiting # for the provisioning-proxy to call back - return {"subscription": subscription} + return {'subscription': subscription} @workflow( - "Create Device", + 'Create Device', initial_input_form=wrap_create_initial_input_form( - initial_input_form_generator), + initial_input_form_generator), target=Target.CREATE, ) def create_device():