diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py index 56a0b807d6ea46cf2270a6d3f0c787abee82714a..5e3fe962e154969617ca9e26c27225b187715d48 100644 --- a/gso/services/provisioning_proxy.py +++ b/gso/services/provisioning_proxy.py @@ -124,6 +124,24 @@ def provision_ip_trunk( _send_request("ip_trunk", parameters, process_id, CUDOperation.POST) +def check_ip_trunk( + subscription: IptrunkProvisioning, process_id: UUIDstr, check_name: str +) -> None: + """Provision an IP trunk service using {term}`LSO`. + + :param subscription: The subscription object that's to be provisioned. + :type subscription: {class}`IptrunkProvisioning` + :param process_id: The related process ID, used for callback. + :type process_id: UUIDstr + :param check_name: The name of the check to execute + :rtype: None + """ + parameters = { + "subscription": json.loads(json_dumps(subscription)), + "check_name": check_name, + } + + _send_request("ip_trunk/perform_check", parameters, process_id, CUDOperation.POST) def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, dry_run: bool = True) -> None: """Deprovision an IP trunk service using {term}`LSO`. diff --git a/gso/workflows/device/insert_in_ibgp.py b/gso/workflows/device/insert_in_ibgp.py new file mode 100644 index 0000000000000000000000000000000000000000..3383cf3b856a60f8e5a1bfaeea1e23f93cde325a --- /dev/null +++ b/gso/workflows/device/insert_in_ibgp.py @@ -0,0 +1,84 @@ +import ipaddress +import re +from uuid import uuid4 + +from orchestrator.db.models import ProductTable, SubscriptionTable + +# noinspection PyProtectedMember +from orchestrator.forms import FormPage +from orchestrator.forms.validators import Choice +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, store_process_subscription, unsync + +from orchestrator.workflows.utils import wrap_modify_initial_input_form +from gso.products.product_blocks import device as device_pb +from gso.products.product_types import device +from gso.products.product_types.device import ( + Device, +) +from gso.products.product_types.site import Site +from gso.services import _ipam + +def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: + subscription = Device.from_subscription(subscription_id) + + class SimoneDeviceForm(FormPage): + class Config: + random_input: str + + user_input = yield SimoneDeviceForm + + return user_input.dict() + +@step("Show the devices") +def display_devices() -> State: + devices = [] + for subscription_id in ( + SubscriptionTable.query.join(ProductTable) + .filter( + ProductTable.product_type == "Device", + SubscriptionTable.status == "active", + ) + .with_entities( + SubscriptionTable.subscription_id, + ) + .all() + ): + devices.append(Device.from_subscription(subscription_id)) + + pe_devices = [] + p_devices = [] + + for device in devices : + if device.device.device_access_via_ts == False : + if device.device.device_role == "p": + p_devices.append(device) + if device.device.device_role == "pe": + pe_devices.append(device) + + return { + "pe_devices": pe_devices, + "p_devices": p_devices, + } + + +@workflow( + "Add node to iBGP", + initial_input_form=wrap_modify_initial_input_form( + initial_input_form_generator + ), + target=Target.MODIFY, +) + +def insert_in_ibgp(): + return ( + init + >> store_process_subscription(Target.MODIFY) + >> unsync + >> display_devices + >> resync + >> done + ) \ No newline at end of file diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py index 13b2be132419f9e0e2b30be388164c794873a91f..c17b58323cc7e1f25f08b24a49f02d02a23b96c4 100644 --- a/gso/workflows/iptrunk/create_iptrunk.py +++ b/gso/workflows/iptrunk/create_iptrunk.py @@ -172,6 +172,14 @@ def provision_ip_trunk_iface_real(subscription: IptrunkProvisioning, process_id: "label_text": "Provisioning a trunk interface, please refresh to get the results of the playbook.", } +@step("Check IP connectivity of the trunk") +def check_ip_trunk_connectivity(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: + provisioning_proxy.check_ip_trunk(subscription, process_id, "ping") + + return { + "subscription": subscription, + "label_text": "Checking IP traffic flow on the trunk, to get the results of the playbook.", + } @step("Provision IP trunk ISIS interface [DRY RUN]") def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: @@ -193,6 +201,15 @@ def provision_ip_trunk_isis_iface_real(subscription: IptrunkProvisioning, proces } +@step("Check ISIS adjacency") +def check_ip_trunk_isis(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: + provisioning_proxy.check_ip_trunk(subscription, process_id, "isis") + + return { + "subscription": subscription, + "label_text": "Checking ISIS adjacencies, please refresh to get the results of the playbook.", + } + @step("Provision IP trunk LDP interface [DRY RUN]") def provision_ip_trunk_ldp_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: provisioning_proxy.provision_ip_trunk(subscription, process_id, "ldp_interface") @@ -247,10 +264,10 @@ def create_iptrunk() -> StepList: >> get_info_from_ipam >> pp_interaction(provision_ip_trunk_iface_dry, 3) >> pp_interaction(provision_ip_trunk_iface_real, 3) + >> check_ip_trunk_connectivity >> pp_interaction(provision_ip_trunk_isis_iface_dry, 3) >> pp_interaction(provision_ip_trunk_isis_iface_real, 3) - >> pp_interaction(provision_ip_trunk_ldp_iface_dry, 3) - >> pp_interaction(provision_ip_trunk_ldp_iface_real, 3) + >> check_ip_trunk_isis >> pp_interaction(provision_ip_trunk_lldp_iface_dry, 3) >> pp_interaction(provision_ip_trunk_lldp_iface_real, 3) >> set_status(SubscriptionLifecycle.ACTIVE)