Skip to content
Snippets Groups Projects
Verified Commit bca9e35c authored by Karel van Klink's avatar Karel van Klink :smiley_cat:
Browse files

fix formatting, move callback url logic to pp_service

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