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

Add iptrunks termination plus compile is working

parent 0806c772
Branches
Tags
1 merge request!12Add sites, and add integration of IPtrunks and routers with LSO deployment
"""add Terminate device workflow.
Revision ID: 61f8e90581c5
Revises: 21e7bb0e5cad
Create Date: 2023-05-08 10:48:21.655880
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = '61f8e90581c5'
down_revision = '21e7bb0e5cad'
branch_labels = None
depends_on = None
from orchestrator.migrations.helpers import create_workflow, delete_workflow
new_workflows = [
{
"name": "terminate_device",
"target": "TERMINATE",
"description": "Terminate device",
"product_type": "Device"
}
]
def upgrade() -> None:
conn = op.get_bind()
for workflow in new_workflows:
create_workflow(conn, workflow)
def downgrade() -> None:
conn = op.get_bind()
for workflow in new_workflows:
delete_workflow(conn, workflow["name"])
"""add Terminate Iptrunk workflow.
Revision ID: 647e066bc99e
Revises: 61f8e90581c5
Create Date: 2023-05-08 18:59:01.309425
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = '647e066bc99e'
down_revision = '61f8e90581c5'
branch_labels = None
depends_on = None
from orchestrator.migrations.helpers import create_workflow, delete_workflow
new_workflows = [
{
"name": "terminate_iptrunk",
"target": "TERMINATE",
"description": "Terminate IPtrunk",
"product_type": "Iptrunk"
}
]
def upgrade() -> None:
conn = op.get_bind()
for workflow in new_workflows:
create_workflow(conn, workflow)
def downgrade() -> None:
conn = op.get_bind()
for workflow in new_workflows:
delete_workflow(conn, workflow["name"])
...@@ -27,14 +27,14 @@ class IptrunkBlockInactive(ProductBlockModel, ...@@ -27,14 +27,14 @@ class IptrunkBlockInactive(ProductBlockModel,
iptrunk_sideA_node: DeviceBlockInactive iptrunk_sideA_node: DeviceBlockInactive
iptrunk_sideA_ae_iface: Optional[str] = None iptrunk_sideA_ae_iface: Optional[str] = None
iptrunk_sideA_ae_geant_a_sid: Optional[str] = None iptrunk_sideA_ae_geant_a_sid: Optional[str] = None
iptrunk_sideA_ae_members: Optional[list] = None iptrunk_sideA_ae_members: list[str] = Field(default_factory=list)
iptrunk_sideA_ae_members_description: Optional[list] = None iptrunk_sideA_ae_members_description: list[str] = Field(default_factory=list)
# #
iptrunk_sideB_node: DeviceBlockInactive iptrunk_sideB_node: DeviceBlockInactive
iptrunk_sideB_ae_iface: Optional[str] = None iptrunk_sideB_ae_iface: Optional[str] = None
iptrunk_sideB_ae_geant_a_sid: Optional[str] = None iptrunk_sideB_ae_geant_a_sid: Optional[str] = None
iptrunk_sideB_ae_members: Optional[list] = None iptrunk_sideB_ae_members: list[str] = Field(default_factory=list)
iptrunk_sideB_ae_members_description: Optional[list] = None iptrunk_sideB_ae_members_description: list[str] = Field(default_factory=list)
class IptrunkBlockProvisioning(IptrunkBlockInactive, class IptrunkBlockProvisioning(IptrunkBlockInactive,
......
...@@ -5,4 +5,6 @@ LazyWorkflowInstance("gso.workflows.device.terminate_device", ...@@ -5,4 +5,6 @@ LazyWorkflowInstance("gso.workflows.device.terminate_device",
"terminate_device") "terminate_device")
LazyWorkflowInstance("gso.workflows.device.get_facts", "get_facts") LazyWorkflowInstance("gso.workflows.device.get_facts", "get_facts")
LazyWorkflowInstance("gso.workflows.iptrunk.create_iptrunk", "create_iptrunk") LazyWorkflowInstance("gso.workflows.iptrunk.create_iptrunk", "create_iptrunk")
LazyWorkflowInstance("gso.workflows.iptrunk.terminate_iptrunk",
"terminate_iptrunk")
LazyWorkflowInstance("gso.workflows.site.create_site", "create_site") LazyWorkflowInstance("gso.workflows.site.create_site", "create_site")
...@@ -75,8 +75,8 @@ def get_info_from_ipam(subscription: device.DeviceInactive) -> State: ...@@ -75,8 +75,8 @@ def get_info_from_ipam(subscription: device.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 = "10.10.10.10" subscription.device.device_lo_ipv4_address = ipaddress.ip_address('10.10.10.10')
subscription.device.device_lo_ipv6_address = "fc00:798: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"
......
...@@ -41,7 +41,7 @@ def deprovision_user(subscription: Device) -> None: ...@@ -41,7 +41,7 @@ def deprovision_user(subscription: Device) -> None:
initial_input_form_generator), initial_input_form_generator),
target=Target.TERMINATE, target=Target.TERMINATE,
) )
def terminate_user(): def terminate_device():
return ( return (
init init
>> store_process_subscription(Target.TERMINATE) >> store_process_subscription(Target.TERMINATE)
......
# import ipaddress import ipaddress
from uuid import uuid4 from uuid import uuid4
from orchestrator.forms import FormPage from orchestrator.forms import FormPage
...@@ -19,6 +19,8 @@ from gso.products.product_types.device import Device ...@@ -19,6 +19,8 @@ from gso.products.product_types.device import Device
# from gso.products.product_types import device # from gso.products.product_types import device
from orchestrator.db.models import ProductTable, SubscriptionTable from orchestrator.db.models import ProductTable, SubscriptionTable
from orchestrator.forms.validators import Choice, choice_list from orchestrator.forms.validators import Choice, choice_list
from orchestrator.utils.json import json_dumps
def device_selector(choice_value: str) -> list: def device_selector(choice_value: str) -> list:
...@@ -91,8 +93,8 @@ def create_subscription(product: UUIDstr) -> State: ...@@ -91,8 +93,8 @@ def create_subscription(product: UUIDstr) -> State:
@step("Get information from IPAM ") @step("Get information from IPAM ")
def get_info_from_ipam(subscription: iptrunk.IptrunkInactive) -> State: def get_info_from_ipam(subscription: iptrunk.IptrunkInactive) -> State:
# TODO: get info about how these should be generated # TODO: get info about how these should be generated
subscription.iptrunk.iptrunk_ipv4_network = "192.168.1.0/31" subscription.iptrunk.iptrunk_ipv4_network = ipaddress.ip_network('192.168.255.0/31')
subscription.iptrunk.iptrunk_ipv6_network = "fc00:798:1::150/126" subscription.iptrunk.iptrunk_ipv6_network = ipaddress.ip_network('fc00:798:255::150/126')
return {"subscription": subscription} return {"subscription": subscription}
...@@ -153,35 +155,30 @@ def initialize_subscription( ...@@ -153,35 +155,30 @@ def initialize_subscription(
def provision_iptrunk_dry( def provision_iptrunk_dry(
subscription: iptrunk.IptrunkProvisioning, subscription: iptrunk.IptrunkProvisioning,
) -> State: ) -> State:
# import ansible_runner import ansible_runner
#
# r = ansible_runner.run( r = ansible_runner.run(
# private_data_dir="/opt/geant-gap-ansible", private_data_dir="/opt/geant-gap-ansible",
# playbook="base_config.yaml", playbook="iptrunks.yaml",
# inventory=subscription.iptrunk.fqdn, inventory= str(subscription.iptrunk.iptrunk_sideA_node.device_fqdn +"\n"+
# extravars={ subscription.iptrunk.iptrunk_sideB_node.device_fqdn+"\n"),
# "lo_ipv4_address": str(subscription.iptrunk.lo_ipv4_address), extravars={
# "lo_ipv6_address": str(subscription.iptrunk.lo_ipv6_address), "verb": "compile",
# "lo_iso_address": subscription.iptrunk.lo_iso_address, "wfo_trunk_json":json_dumps(subscription),
# "snmp_location": subscription.iptrunk.snmp_location, "config_object":"trunk_interface",
# "si_ipv4_network": str(subscription.iptrunk.si_ipv4_network), },
# "lt_ipv4_network": str(subscription.iptrunk.ias_lt_ipv4_network), )
# "lt_ipv6_network": str(subscription.iptrunk.ias_lt_ipv6_network), out = r.stdout.read()
# "site_country_code": subscription.iptrunk.site_country_code, out_splitted = out.splitlines()
# "verb": "deploy",
# },
# )
# out = r.stdout.read()
# out_splitted = out.splitlines()
# # if r.rc != 0: # # if r.rc != 0:
# # raise ValueError("Ansible has failed") # # raise ValueError("Ansible has failed")
# return {"dry_run_output": out_splitted, "return_code": r.rc} return {"dry_run_output": out_splitted, "return_code": r.rc}
# provisioning_proxy.provision_node( # provisioning_proxy.provision_node(
# node_subscription_params=subscription, # node_subscription_params=subscription,
# dry_run=True) # dry_run=True)
# TODO: figure out what to return when we are suspending & waiting # TODO: figure out what to return when we are suspending & waiting
# for the provisioning-proxy to call back # for the provisioning-proxy to call back
return {"return_code": 0} #return {"return_code": 0}
@inputstep("Confirm step", assignee="CHANGES") @inputstep("Confirm step", assignee="CHANGES")
......
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 gso.products.product_types.iptrunk import Iptrunk
def initial_input_form_generator(subscription_id: UUIDstr) -> InputForm:
subscription = Iptrunk.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 Iptrunk")
def deprovision_iptrunk(subscription: Iptrunk) -> None:
# _deprovision_in_user_management_system(subscription.user.user_id)
pass
@workflow(
"Terminate IPtrunk",
initial_input_form=wrap_modify_initial_input_form(
initial_input_form_generator),
target=Target.TERMINATE,
)
def terminate_iptrunk():
return (
init
>> store_process_subscription(Target.TERMINATE)
>> unsync
>> deprovision_iptrunk
>> 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