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

Device workflows: create, delete, get_facts

parent 4dc8655f
No related branches found
No related tags found
1 merge request!5Device workflows
from orchestrator.workflows import LazyWorkflowInstance
LazyWorkflowInstance("workflows.device.create_device", "create_device")
LazyWorkflowInstance("workflows.device.terminate_device", "terminate_device")
LazyWorkflowInstance("workflows.device.get_facts", "get_facts")
# from typing import List, Optional
from uuid import uuid4
# from orchestrator.db.models import ProductTable, SubscriptionTable
# from orchestrator.forms.validators import Choice, choice_list
from orchestrator.forms import FormPage
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.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 products.product_types.device import DeviceInactive, DeviceProvisioning
def initial_input_form_generator(product_name: str) -> FormGenerator:
class CreateUserForm(FormPage):
class Config:
title = product_name
fqdn: str
ts_address: str
ts_port: int
user_input = yield CreateUserForm
return user_input.dict()
@step("Create subscription")
def create_subscription(product: UUIDstr) -> State:
subscription = DeviceInactive.from_product_id(product, uuid4())
return {
"subscription": subscription,
"subscription_id": subscription.subscription_id,
}
@step("Get information from IPAM ")
def get_info_from_ipam(subscription: DeviceInactive) -> State:
subscription.device.lo_ipv4_address = "10.10.10.10"
subscription.device.lo_ipv6_address = "fc00:798:aa:1::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: DeviceInactive) -> State:
subscription.device.site_country = "Spain"
subscription.device.site_city = "Barcelona"
subscription.device.site_country_code = "ES"
subscription.device.site_latitude = "41.3743"
subscription.device.site_longitude = "2.1328"
subscription.device.snmp_location = (
"BARCELONA,SPAIN,[41.3743,2.1328]" # TODO: Duplicated data?
)
return {"subscription": subscription}
@step("Initialize subscription")
def initialize_subscription(
subscription: DeviceInactive, fqdn: str, ts_address: str, ts_port: str
) -> State:
subscription.device.fqdn = fqdn
subscription.device.ts_address = ts_address
subscription.device.ts_port = ts_port
subscription.description = f"Device {fqdn} type \
({subscription.device_type})"
subscription = DeviceProvisioning.from_other_lifecycle(
subscription, SubscriptionLifecycle.PROVISIONING
)
return {"subscription": subscription}
@step("Provision device")
def provision_device(
subscription: DeviceProvisioning, fqdn: str, ts_address: str, ts_port: str
) -> State:
import ansible_runner
r = ansible_runner.run(
private_data_dir="/opt",
playbook="base_config.yaml",
inventory=subscription.device.fqdn,
extravars={
"lo_ipv4_address": subscription.device.lo_ipv4_address,
"lo_ipv6_address": subscription.device.lo_ipv6_address,
"lo_iso_address": subscription.device.lo_iso_address,
"snmp_location": subscription.device.snmp_location,
"si_ipv4_network": subscription.device.si_ipv4_network,
"lt_ipv4_network": subscription.device.ias_lt_ipv4_network,
"lt_ipv6_network": 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 {"output": out_splitted}
# return {"subscription": subscription, "status": "ciao", "pippo": "pluto"}
@workflow(
"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
>> set_status(SubscriptionLifecycle.ACTIVE)
>> resync
>> done
)
from orchestrator.forms import FormPage
from orchestrator.forms.validators import Label
from orchestrator.targets import Target
# from orchestrator.types import SubscriptionLifecycle
from orchestrator.types import InputForm, UUIDstr
from orchestrator.workflow import done, init, step, workflow
# from orchestrator.workflows.steps import (
# resync,
# set_status,
# store_process_subscription,
# unsync,
# )
from orchestrator.workflows.utils import wrap_modify_initial_input_form
from products import Device
def initial_input_form_generator(
subscription_id: UUIDstr, organisation: UUIDstr
) -> InputForm:
subscription = Device.from_subscription(subscription_id)
class TerminateForm(FormPage):
are_you_sure: Label = (
f"Are you sure you want to get facts from \
{subscription.description}?"
)
return TerminateForm
@step("Get facts")
def get_facts(subscription_id) -> None:
subscription = Device.from_subscription(subscription_id)
import ansible_runner
r = ansible_runner.run(
private_data_dir="/opt",
playbook="get_facts.yaml",
inventory=subscription.device.fqdn,
)
out = r.stdout.read()
out_splitted = out.splitlines()
return {"output": out_splitted}
@workflow(
"Get Facts from Device",
initial_input_form=wrap_modify_initial_input_form(
initial_input_form_generator),
target=Target.SYSTEM,
)
def get_facts_from_device():
return (
init
>> get_facts
# >> resync
>> done
)
from orchestrator.forms import FormPage
from orchestrator.forms.validators import Label
from orchestrator.targets import Target
from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr
from orchestrator.workflow import done, init, step, workflow
from orchestrator.workflows.steps import (
resync,
set_status,
store_process_subscription,
unsync,
)
from orchestrator.workflows.utils import wrap_modify_initial_input_form
from products import Device
def initial_input_form_generator(subscription_id: UUIDstr) -> InputForm:
subscription = Device.from_subscription(subscription_id)
class TerminateForm(FormPage):
are_you_sure: Label = (
f"Are you sure you want to remove {subscription.description}?"
) # type:ignore
return TerminateForm
def _deprovision_in_user_management_system(fqdn: str) -> str:
pass
@step("Deprovision device")
def deprovision_user(subscription: Device) -> None:
# _deprovision_in_user_management_system(subscription.user.user_id)
pass
@workflow(
"Terminate device",
initial_input_form=wrap_modify_initial_input_form(
initial_input_form_generator),
target=Target.TERMINATE,
)
def terminate_user():
return (
init
>> store_process_subscription(Target.TERMINATE)
>> unsync
>> deprovision_user
>> set_status(SubscriptionLifecycle.TERMINATED)
>> resync
>> done
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment