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

CreateDevice workflow now calls LSO

parent f38521ef
Branches
Tags
2 merge requests!11Feature/test provisioning proxy,!10Make create_device use provisioning proxy
......@@ -21,7 +21,8 @@
}
},
"PROVISIONING_PROXY": {
"api_base": "http://localhost:44444",
"scheme": "https",
"api_base": "localhost:44444",
"auth": "Bearer <token>",
"api_version": 1123
}
......
......@@ -4,28 +4,51 @@ from gso.products.product_blocks.device import DeviceBlockProvisioning
from gso import settings
import requests
from gso.products.product_types.device import DeviceProvisioning
logger = logging.getLogger(__name__)
def provision_node(
node_subscription_params: DeviceBlockProvisioning,
node_subscription_params: DeviceProvisioning,
callback_url: str,
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
logger.debug(f'[disabled] provisioning node {device_params}')
parameters = {
'callback': callback_url,
'dry_run': dry_run,
'device': node_subscription_params.dict()
'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
}
}
r = requests.post(
f'https://{pp_params.api_base}'
post_request = requests.post(
f'{pp_params.scheme}://{pp_params.api_base}'
f'/api/device',
json=parameters)
r.raise_for_status()
requests.post()
\ No newline at end of file
post_request.raise_for_status()
......@@ -38,6 +38,7 @@ class IPAMParams(BaseSettings):
class ProvisioningProxyParams(BaseSettings):
scheme: str
api_base: str
auth: str # FIXME: unfinished
api_version: int
......
import ipaddress
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
......@@ -14,7 +15,8 @@ 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 import device
from gso.products.product_types.device import DeviceVendor, DeviceInactive, \
DeviceProvisioning
def initial_input_form_generator(product_name: str) -> FormGenerator:
......@@ -25,7 +27,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
fqdn: str
ts_address: ipaddress.IPv4Address
ts_port: int
device_vendor: device.DeviceVendor
device_vendor: DeviceVendor
user_input = yield CreateDeviceForm
......@@ -34,7 +36,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
@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,
......@@ -43,7 +45,7 @@ def create_subscription(product: UUIDstr) -> State:
@step("Get information from IPAM ")
def get_info_from_ipam(subscription: device.DeviceInactive) -> State:
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
......@@ -58,7 +60,7 @@ def get_info_from_ipam(subscription: device.DeviceInactive) -> State:
@step("get information about SNMP")
def get_snmp_info(subscription: device.DeviceInactive) -> State:
def get_snmp_info(subscription: DeviceInactive) -> State:
country = 'Spain'
city = 'Barcelona'
country_code = 'ES'
......@@ -78,11 +80,11 @@ def get_snmp_info(subscription: device.DeviceInactive) -> State:
@step("Initialize subscription")
def initialize_subscription(
subscription: device.DeviceInactive,
subscription: DeviceInactive,
fqdn: str,
ts_address: ipaddress.IPv4Address,
ts_port: str,
device_vendor: device.DeviceVendor
device_vendor: DeviceVendor
) -> State:
subscription.device.fqdn = fqdn
subscription.device.ts_address = str(ts_address)
......@@ -90,7 +92,7 @@ def initialize_subscription(
subscription.device_vendor = device_vendor
subscription.description = f"Device {fqdn} type \
({subscription.device_type})"
subscription = device.DeviceProvisioning.from_other_lifecycle(
subscription = DeviceProvisioning.from_other_lifecycle(
subscription, SubscriptionLifecycle.PROVISIONING
)
......@@ -98,13 +100,13 @@ def initialize_subscription(
@step("Provision device [DRY RUN]")
def provision_device_dry(subscription: device.DeviceProvisioning) -> State:
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'
proxy_result = provisioning_proxy.provision_node(
subscription.device,
provisioning_proxy.provision_node(
subscription,
callback_url
)
......@@ -136,32 +138,28 @@ def provision_device_dry(subscription: device.DeviceProvisioning) -> State:
# dry_run=True)
# TODO: figure out what to return when we are suspending & waiting
# for the provisioning-proxy to call back
return {"subscription": proxy_result}
return {'subscription': subscription}
@inputstep("Confirm step", assignee="CHANGES")
def confirm_step() -> FormGenerator:
@inputstep("Confirm step", assignee=Assignee('SYSTEM'))
def confirm_step(subscription: DeviceProvisioning) -> State:
class ConfirmForm(FormPage):
confirm: Accept
user_input = yield ConfirmForm
return {"confirm": user_input.confirm}
return {'subscription': subscription, 'confirm': user_input}
@step("Provision device [FOR REAL]")
def provision_device_real(
subscription: device.DeviceProvisioning,
fqdn: str,
ts_address: str,
ts_port: str
) -> State:
def provision_device_real(subscription: DeviceProvisioning) -> State:
# TODO: generate actual callback URL
callback_url = settings.load_oss_params().GENERAL.public_hostname
provisioning_proxy.provision_node(
subscription.device,
subscription,
callback_url,
False
)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment