diff --git a/gso/workflows/site/create_site.py b/gso/workflows/site/create_site.py index 1d34ae143daf954c5a411db389ee09018f7f0963..ae683d57592919448ca3d458458bc10d306dd8bc 100644 --- a/gso/workflows/site/create_site.py +++ b/gso/workflows/site/create_site.py @@ -11,26 +11,32 @@ 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.products.product_types import site +from gso.products.product_blocks import site as site_pb def initial_input_form_generator(product_name: str) -> FormGenerator: - class CreateDeviceForm(FormPage): + class CreateSiteForm(FormPage): class Config: title = product_name - fqdn: str - ts_address: ipaddress.IPv4Address - ts_port: int - device_vendor: device.DeviceVendor + site_name: str + site_country: str + site_country_code: str + site_latitude: float + site_longitude: float + site_bgp_community_id: int + site_internal_id: int + site_tier: site_pb.SiteTier - user_input = yield CreateDeviceForm + + user_input = yield CreateSiteForm return user_input.dict() @step("Create subscription") def create_subscription(product: UUIDstr) -> State: - subscription = device.DeviceInactive.from_product_id(product, uuid4()) + subscription = site.SiteInactive.from_product_id(product, uuid4()) return { "subscription": subscription, @@ -38,54 +44,27 @@ def create_subscription(product: UUIDstr) -> State: } -@step("Get information from IPAM ") -def get_info_from_ipam(subscription: device.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} - - -@step("get information about SNMP") -def get_snmp_info(subscription: device.DeviceInactive) -> State: - country = 'Spain' - city = 'Barcelona' - country_code = 'ES' - latitude = '41.3743' - longitude = '2.1328' - subscription.device.site_country = country - subscription.device.site_city = city - subscription.device.site_country_code = country_code - subscription.device.site_latitude = latitude - subscription.device.site_longitude = longitude - subscription.device.snmp_location = ( - f'{city.upper()},{country.upper()}[{latitude},{longitude}]' - ) - - return {"subscription": subscription} - - @step("Initialize subscription") def initialize_subscription( - subscription: device.DeviceInactive, - fqdn: str, - ts_address: ipaddress.IPv4Address, - ts_port: str, - device_vendor: device.DeviceVendor + subscription: site.SiteInactive, + site_name: str, + site_country: str, + site_country_code: str, + site_latitude: float, + site_longitude: float, + site_bgp_community_id: int, + site_internal_id: int, + site_tier: site_pb.SiteTier ) -> 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.site_name: site_name + subscription.site_country: site_country + subscription.site_country_code: site_country_code + subscription.site_latitude: site_longitude + subscription.site_longitude: site_latitude + subscription.site_bgp_community_id: site_bgp_community_id + subscription.site_internal_id: site_internal_id + subscription.site_tier: site_tier + subscription.description = f"Site {site_name} " subscription = device.DeviceProvisioning.from_other_lifecycle( subscription, SubscriptionLifecycle.PROVISIONING ) @@ -93,90 +72,6 @@ def initialize_subscription( return {"subscription": subscription} -@step("Provision device [DRY RUN]") -def provision_device_dry( - subscription: device.DeviceProvisioning, - fqdn: str, - ts_address: str, - ts_port: str -) -> State: - # import ansible_runner - # - # r = ansible_runner.run( - # 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", - # }, - # ) - # 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} - # provisioning_proxy.provision_node( - # node_subscription_params=subscription, - # dry_run=True) - # TODO: figure out what to return when we are suspending & waiting - # for the provisioning-proxy to call back - return {"return_code": 0} - - -@inputstep("Confirm step", assignee="CHANGES") -def confirm_step() -> FormGenerator: - class ConfirmForm(FormPage): - confirm: Accept - - user_input = yield ConfirmForm - - return {"confirm": user_input.confirm} - - -@step("Provision device [FOR REAL]") -def provision_device_real( - subscription: device.DeviceProvisioning, - fqdn: str, - ts_address: str, - ts_port: str -) -> State: - # import ansible_runner - # - # r = ansible_runner.run( - # 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", - # }, - # ) - # out = r.stdout.read() - # out_splitted = out.splitlines() - # - # 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 {"return_code": 0} - - @workflow( "Create Device", initial_input_form=wrap_create_initial_input_form( @@ -188,12 +83,7 @@ def create_device(): init >> create_subscription >> store_process_subscription(Target.CREATE) - >> get_info_from_ipam - >> get_snmp_info >> initialize_subscription - >> provision_device_dry - >> confirm_step - >> provision_device_real >> set_status(SubscriptionLifecycle.ACTIVE) >> resync >> done