Skip to content
Snippets Groups Projects
Commit 17e60c9e authored by Simone Spinelli's avatar Simone Spinelli
Browse files

Merge branch 'feature/test-provisioning-proxy' into 'feature/new_device_model_and_sites_and_orgs'

Feature/test provisioning proxy

See merge request !11
parents b754fd1f ae916874
No related branches found
No related tags found
2 merge requests!12Add sites, and add integration of IPtrunks and routers with LSO deployment,!11Feature/test provisioning proxy
......@@ -4,4 +4,5 @@ __pycache__/
coverage.xml
.tox/device_vendor
.vscode
venv
\ No newline at end of file
venv
oss-params.json
{
"GENERAL": {
"public_hostname": "https://gap.geant.org"
},
"RESOURCE_MANAGER_API_PREFIX": "http://localhost:44444",
"IPAM": {
"INFOBLOX": {
......@@ -18,8 +21,9 @@
}
},
"PROVISIONING_PROXY": {
"api_base": "http://localhost:44444",
"scheme": "https",
"api_base": "localhost:44444",
"auth": "Bearer <token>",
"api_version": 1123
}
}
\ No newline at end of file
}
import logging
from gso.products.product_types.device \
import DeviceBlock
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
# import requests
from gso.products.product_types.device import DeviceProvisioning
logger = logging.getLogger(__name__)
def provision_node(
node_subscription_params: DeviceBlock,
node_subscription_params: DeviceProvisioning,
process_id: UUIDstr,
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
callback_url = f'{settings.load_oss_params().GENERAL.public_hostname}' \
f'/api/processes/{process_id}/resume'
logger.debug(f'[disabled] provisioning node {device_params}')
parameters = {
'callback': callback_url,
'dry_run': dry_run,
'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
}
}
post_request = requests.post(
f'{pp_params.scheme}://{pp_params.api_base}'
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
# r = requests.get(
# f'https://{pp_params.api_base}'
# f'/api/version',
# params=node_subscription_params.dict())
# r.raise_for_status()
return state
......@@ -4,6 +4,10 @@ import os
from pydantic import BaseSettings
class GeneralParams(BaseSettings):
public_hostname: str
class InfoBloxParams(BaseSettings):
scheme: str
wapi_version: str
......@@ -34,12 +38,14 @@ class IPAMParams(BaseSettings):
class ProvisioningProxyParams(BaseSettings):
scheme: str
api_base: str
auth: str # FIXME: unfinished
api_version: int
class OSSParams(BaseSettings):
GENERAL: GeneralParams
IPAM: IPAMParams
RESOURCE_MANAGER_API_PREFIX: str # api prefix
PROVISIONING_PROXY: ProvisioningProxyParams
......
......@@ -3,8 +3,6 @@ from uuid import uuid4
from orchestrator.forms import FormPage
from orchestrator.targets import Target
from orchestrator.workflow import inputstep
from orchestrator.forms.validators import Accept
from orchestrator.types import FormGenerator, State
from orchestrator.types import SubscriptionLifecycle, UUIDstr
from orchestrator.workflow import done, init, step, workflow
......@@ -59,18 +57,18 @@ 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 = device.DeviceInactive.from_product_id(product, uuid4())
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 ")
def get_info_from_ipam(subscription: device.DeviceInactive) -> State:
@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
......@@ -85,7 +83,7 @@ def get_info_from_ipam(subscription: device.DeviceInactive) -> State:
return {"subscription": subscription}
@step("Initialize subscription")
@step('Initialize subscription')
def initialize_subscription(
subscription: device.DeviceInactive,
hostname: str,
......@@ -199,22 +197,26 @@ def provision_device_real(
#return {"return_code": 0}
@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():
return (
init
>> create_subscription
>> store_process_subscription(Target.CREATE)
>> get_info_from_ipam
>> 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.
Please register or to comment