Skip to content
Snippets Groups Projects

Add sites, and add integration of IPtrunks and routers with LSO deployment

Merged Karel van Klink requested to merge feature/new_device_model_and_sites_and_orgs into develop
1 file
+ 49
104
Compare changes
  • Side-by-side
  • Inline
import ipaddress
import ipaddress
from uuid import uuid4
from uuid import uuid4
 
from orchestrator.db.models import ProductTable, SubscriptionTable
from orchestrator.forms import FormPage
from orchestrator.forms import FormPage
 
from orchestrator.forms.validators import Choice, choice_list
from orchestrator.targets import Target
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
@@ -9,25 +11,28 @@ from orchestrator.workflow import done, init, step, workflow
@@ -9,25 +11,28 @@ from orchestrator.workflow import done, init, step, workflow
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.products.product_types import device
from gso.products.product_blocks import device as device_pb
from gso.products.product_blocks import device as device_pb
from orchestrator.db.models import ProductTable, SubscriptionTable
from gso.products.product_types import device
from orchestrator.forms.validators import Choice, choice_list
from gso.products.product_types.device import DeviceInactive, \
 
DeviceProvisioning
from gso.products.product_types.site import Site
from gso.products.product_types.site import Site
# from gso.services import ipam, provisioning_proxy
from gso.services import provisioning_proxy
 
from gso.services.provisioning_proxy import await_pp_results, \
 
confirm_pp_results
def site_selector() -> list:
def site_selector() -> list:
site_subscriptions = {}
site_subscriptions = {}
for site_id, site_description in (
for site_id, site_description in (
SubscriptionTable.query.join(ProductTable)
SubscriptionTable.query.join(ProductTable)
.filter(
.filter(
ProductTable.product_type == "Site",
ProductTable.product_type == "Site",
SubscriptionTable.status == "active",
SubscriptionTable.status == "active",
)
)
.with_entities(SubscriptionTable.subscription_id,
.with_entities(SubscriptionTable.subscription_id,
SubscriptionTable.description)
SubscriptionTable.description)
.all()
.all()
):
):
site_subscriptions[str(site_id)] = site_description
site_subscriptions[str(site_id)] = site_description
@@ -73,8 +78,10 @@ def get_info_from_ipam(subscription: DeviceInactive) -> State:
@@ -73,8 +78,10 @@ def get_info_from_ipam(subscription: DeviceInactive) -> State:
# 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.device_lo_ipv4_address = ipaddress.ip_address('10.10.10.10')
subscription.device.device_lo_ipv4_address = \
subscription.device.device_lo_ipv6_address = ipaddress.ip_address('fc00:798:10::10')
ipaddress.ip_address('10.10.10.10')
 
subscription.device.device_lo_ipv6_address = \
 
ipaddress.ip_address('fc00:798:10::10')
subscription.device.device_lo_iso_address \
subscription.device.device_lo_iso_address \
= "49.51e5.0001.0620.4009.6047.00"
= "49.51e5.0001.0620.4009.6047.00"
subscription.device.device_si_ipv4_network = "192.168.0.0/31"
subscription.device.device_si_ipv4_network = "192.168.0.0/31"
@@ -85,13 +92,13 @@ def get_info_from_ipam(subscription: DeviceInactive) -> State:
@@ -85,13 +92,13 @@ def get_info_from_ipam(subscription: DeviceInactive) -> State:
@step('Initialize subscription')
@step('Initialize subscription')
def initialize_subscription(
def initialize_subscription(
subscription: device.DeviceInactive,
subscription: device.DeviceInactive,
hostname: str,
hostname: str,
ts_address: ipaddress.IPv4Address,
ts_address: ipaddress.IPv4Address,
ts_port: str,
ts_port: str,
device_vendor: device_pb.DeviceVendor,
device_vendor: device_pb.DeviceVendor,
device_site: str,
device_site: str,
device_role: device_pb.DeviceRole
device_role: device_pb.DeviceRole
) -> State:
) -> State:
subscription.device.device_ts_address = str(ts_address)
subscription.device.device_ts_address = str(ts_address)
subscription.device.device_ts_port = str(ts_port)
subscription.device.device_ts_port = str(ts_port)
@@ -113,88 +120,27 @@ def initialize_subscription(
@@ -113,88 +120,27 @@ def initialize_subscription(
return {"subscription": subscription, "fqdn": fqdn}
return {"subscription": subscription, "fqdn": fqdn}
@step("Provision device [DRY RUN]")
@step('Provision device [DRY RUN]')
def provision_device_dry(
def provision_device_dry(subscription: DeviceProvisioning,
subscription: device.DeviceProvisioning
process_id: UUIDstr) -> State:
) -> State:
provisioning_proxy.provision_node(
import ansible_runner
subscription,
process_id
snmp_location = subscription.device.device_site.site_country_code
)
r = ansible_runner.run(
private_data_dir="/opt/geant-gap-ansible",
return {'subscription': subscription}
playbook="base_config.yaml",
inventory=subscription.device.device_fqdn,
extravars={
@step('Provision device [FOR REAL]')
"lo_ipv4_address": str(subscription.device.device_lo_ipv4_address),
def provision_device_real(subscription: DeviceProvisioning,
"lo_ipv6_address": str(subscription.device.device_lo_ipv6_address),
process_id: UUIDstr) -> State:
"lo_iso_address": subscription.device.device_lo_iso_address,
provisioning_proxy.provision_node(
"snmp_location": snmp_location,
subscription,
"si_ipv4_network": str(subscription.device.device_si_ipv4_network),
process_id,
"lt_ipv4_network": str(subscription.device.device_ias_lt_ipv4_network),
False # No dry run this time, run it for real
"lt_ipv6_network": str(subscription.device.device_ias_lt_ipv6_network),
)
"site_country_code": subscription.device.device_site.site_country_code,
"verb": "deploy",
return {'subscription': subscription}
},
)
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 {"return_code": 0}
@inputstep("Confirm step", assignee="CHANGES")
def confirm_step() -> FormGenerator:
class ConfirmForm(FormPage):
confirm: Accept
user_input = yield ConfirmForm
return {"confirm": user_input.confirm}
@step("Provision device [FOR REAL]")
def provision_device_real(
subscription: device.DeviceProvisioning
) -> State:
import ansible_runner
snmp_location = subscription.device.device_site.site_country_code
r = ansible_runner.run(
private_data_dir="/opt/geant-gap-ansible",
playbook="base_config.yaml",
inventory=subscription.device.device_fqdn,
extravars={
"lo_ipv4_address": str(subscription.device.device_lo_ipv4_address),
"lo_ipv6_address": str(subscription.device.device_lo_ipv6_address),
"lo_iso_address": subscription.device.device_lo_iso_address,
"snmp_location": snmp_location,
"si_ipv4_network": str(subscription.device.device_si_ipv4_network),
"lt_ipv4_network": str(subscription.device.device_ias_lt_ipv4_network),
"lt_ipv6_network": str(subscription.device.device_ias_lt_ipv6_network),
"site_country_code": subscription.device.device_site.site_country_code,
"verb": "deploy",
"dryrun": "False",
"commit_comment": "Deployed with WFO and Ansible",
},
)
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 {"return_code": 0}
@workflow(
@workflow(
'Create device',
'Create device',
@@ -208,7 +154,6 @@ def create_device():
@@ -208,7 +154,6 @@ def create_device():
>> create_subscription
>> create_subscription
>> store_process_subscription(Target.CREATE)
>> store_process_subscription(Target.CREATE)
>> get_info_from_ipam
>> get_info_from_ipam
>> get_snmp_info
>> initialize_subscription
>> initialize_subscription
>> provision_device_dry
>> provision_device_dry
>> await_pp_results
>> await_pp_results
Loading