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

create_device workflow now calls provisioning proxy correctly

parent bca9e35c
No related branches found
No related tags found
2 merge requests!11Feature/test provisioning proxy,!10Make create_device use provisioning proxy
import logging
from orchestrator.types import UUIDstr
from gso.products.product_blocks.device import DeviceBlockProvisioning
from gso import settings
import requests
from orchestrator import inputstep
from orchestrator.config.assignee import Assignee
from orchestrator.forms import FormPage, ReadOnlyField
from orchestrator.forms.validators import Accept, Label, LongText
from orchestrator.types import UUIDstr, State
from gso import settings
from gso.products.product_types.device import DeviceProvisioning
logger = logging.getLogger(__name__)
......@@ -21,7 +23,7 @@ def provision_node(
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
f'/api/processes/{process_id}/resume'
logger.debug(f'[disabled] provisioning node {device_params}')
parameters = {
......@@ -56,3 +58,36 @@ def provision_node(
f'/api/device',
json=parameters)
post_request.raise_for_status()
@inputstep('Await provisioning proxy results', assignee=Assignee('SYSTEM'))
def await_pp_results() -> State:
class ProvisioningResultPage(FormPage):
class Config:
title = 'Do NOT click on confirm in this step!'
warning_label: Label = 'This step relies on an external service to ' \
'send an update to the orchestrator, do not ' \
'interfere with this process please.'
pp_run_results: dict = {'state': 'not_ready'}
confirm: Accept = Accept('INCOMPLETE')
result_page = yield ProvisioningResultPage
return result_page.dict()
@inputstep('Confirm provisioning proxy results', assignee=Assignee('SYSTEM'))
def confirm_pp_results(state: State) -> State:
class ConfirmRunPage(FormPage):
class Config:
title = 'Execution completed, please confirm the results.'
run_status: str = ReadOnlyField(state['pp_run_results']['status'])
run_results: LongText = ReadOnlyField(
f"{state['pp_run_results']['output']}")
confirm: Accept = Accept('INCOMPLETE')
yield ConfirmRunPage
return state
import ipaddress
from uuid import uuid4
from orchestrator.config.assignee import Assignee
from orchestrator.forms import FormPage
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.products.product_types.device import DeviceVendor, DeviceInactive, \
DeviceProvisioning
from gso.services import provisioning_proxy
from gso.services.provisioning_proxy import confirm_pp_results, \
await_pp_results
def initial_input_form_generator(product_name: str) -> FormGenerator:
......@@ -103,111 +101,47 @@ def initialize_subscription(
@step('Provision device [DRY RUN]')
def provision_device_dry(subscription: DeviceProvisioning,
process_id: UUIDstr) -> State:
provisioning_proxy.provision_node(
subscription,
process_id
)
# 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 {'subscription': subscription}
@inputstep('Verify dry run results', assignee=Assignee('SYSTEM'))
def confirm_step(subscription: DeviceProvisioning) -> State:
class ConfirmForm(FormPage):
confirm: Accept
user_input = yield ConfirmForm
return {'subscription': subscription, 'confirm': user_input}
@step('Provision device [FOR REAL]')
def provision_device_real(subscription: DeviceProvisioning,
process_id: UUIDstr) -> State:
provisioning_proxy.provision_node(
subscription,
process_id,
False
False # No dry run this time, run it for real
)
# 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 {'subscription': subscription}
@workflow(
'Create Device',
'Create device',
initial_input_form=wrap_create_initial_input_form(
initial_input_form_generator),
target=Target.CREATE,
)
def create_device():
return (
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
init
>> create_subscription
>> store_process_subscription(Target.CREATE)
>> get_info_from_ipam
>> get_snmp_info
>> initialize_subscription
>> provision_device_dry
>> await_pp_results
>> confirm_pp_results
>> provision_device_real
>> await_pp_results
>> confirm_pp_results
>> set_status(SubscriptionLifecycle.ACTIVE)
>> resync
>> done
)
......@@ -15,4 +15,3 @@ commands =
# coverage report --fail-under 80
coverage report
flake8
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