diff --git a/gso/services/provisioning_proxy.py b/gso/services/provisioning_proxy.py index d633a68f96d5bb215d47433abf2d2d287aec6a41..12439929a1744f3a9eaf6960a01923a78a44cf2e 100644 --- a/gso/services/provisioning_proxy.py +++ b/gso/services/provisioning_proxy.py @@ -4,6 +4,7 @@ import logging import requests from orchestrator import inputstep from orchestrator.config.assignee import Assignee +# noinspection PyProtectedMember from orchestrator.forms import FormPage, ReadOnlyField from orchestrator.forms.validators import Accept, Label, LongText from orchestrator.types import UUIDstr, State, strEnum @@ -92,7 +93,7 @@ def provision_device( def provision_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, - config_object: str, + config_object: str, dry_run: bool = True): """ Function that provisions an IP trunk service using LSO. @@ -100,20 +101,21 @@ def provision_ip_trunk(subscription: IptrunkProvisioning, :param :class:`IptrunkProvisioning` subscription: The subscription object that is to be provisioned. :param UUIDstr process_id: The related process ID, used for callback. + :param str config_object: The type of object that is deployed :param bool dry_run: A boolean indicating whether this should be a dry run or not, defaults to ``True``. """ parameters = { 'subscription': json.loads(json_dumps(subscription)), 'dry_run': dry_run, - 'verb': "deploy", # FIXME - 'object': config_object # FIXME + 'verb': "deploy", + 'object': config_object } _send_request('ip_trunk', parameters, process_id, CUDOperation.POST) -#def modify_ip_trunk(old_subscription: Iptrunk, +# def modify_ip_trunk(old_subscription: Iptrunk, # new_subscription: Iptrunk, # process_id: UUIDstr, # dry_run: bool = True): @@ -137,9 +139,10 @@ def provision_ip_trunk(subscription: IptrunkProvisioning, # # _send_request('ip_trunk', parameters, process_id, CUDOperation.PUT) + def deprovision_ip_trunk(subscription: Iptrunk, - process_id: UUIDstr, - dry_run: bool = True): + process_id: UUIDstr, + dry_run: bool = True): """ Function that provisions an IP trunk service using LSO. @@ -157,6 +160,7 @@ def deprovision_ip_trunk(subscription: Iptrunk, _send_request('ip_trunk', parameters, process_id, CUDOperation.DELETE) + @inputstep('Await provisioning proxy results', assignee=Assignee('SYSTEM')) def await_pp_results() -> State: class ProvisioningResultPage(FormPage): diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py index 0581d5b11226e3b09a3ba82104344b09c05d36fb..76a37e89a9cd0cbbc61ecfa46822830143478cd1 100644 --- a/gso/workflows/device/create_device.py +++ b/gso/workflows/device/create_device.py @@ -3,6 +3,7 @@ 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, choice_list from orchestrator.targets import Target @@ -92,8 +93,6 @@ def get_info_from_ipam(subscription: DeviceInactive) -> State: ipaddress.ip_address('10.10.10.20') subscription.device.device_lo_ipv6_address = \ ipaddress.ip_address('fc00:798:10::20') - #subscription.device.device_lo_iso_address \ - # = "49.51e5.0001.0620.4009.6047.00" subscription.device.device_lo_iso_address \ = iso_from_ipv4(str(subscription.device.device_lo_ipv4_address)) subscription.device.device_si_ipv4_network = '192.168.0.0/31' diff --git a/gso/workflows/device/terminate_device.py b/gso/workflows/device/terminate_device.py index d5de3c3d17f22d220da5001241f306e283d94d10..30da64eb0dab8abc251b48d056c325b51abd9d6a 100644 --- a/gso/workflows/device/terminate_device.py +++ b/gso/workflows/device/terminate_device.py @@ -19,8 +19,8 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> InputForm: class TerminateForm(FormPage): are_you_sure: Label = ( - f"Are you sure you want to remove {subscription.description}?" - ) # type:ignore + f'Are you sure you want to remove {subscription.description}?' + ) return TerminateForm diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py index 5ddc3bfa8aa9e64a035f5bbf15164a13f3472a93..1c096575bb674c9e879c22c147fbc664fac8f352 100644 --- a/gso/workflows/iptrunk/create_iptrunk.py +++ b/gso/workflows/iptrunk/create_iptrunk.py @@ -2,6 +2,7 @@ import ipaddress from uuid import uuid4 from orchestrator.db.models import ProductTable, SubscriptionTable +# noinspection PyProtectedMember from orchestrator.forms import FormPage from orchestrator.forms.validators import Choice, choice_list from orchestrator.targets import Target @@ -25,16 +26,17 @@ def device_selector(choice_value: str) -> list: device_subscriptions = {} for device_id, device_description in ( SubscriptionTable.query.join(ProductTable) - .filter( + .filter( ProductTable.product_type == 'Device', SubscriptionTable.status == 'active', ) - .with_entities(SubscriptionTable.subscription_id, - SubscriptionTable.description) - .all() + .with_entities(SubscriptionTable.subscription_id, + SubscriptionTable.description) + .all() ): device_subscriptions[str(device_id)] = device_description + # noinspection PyTypeChecker return choice_list( Choice(choice_value, zip(device_subscriptions.keys(), device_subscriptions.items())), # type:ignore @@ -68,10 +70,10 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: iptrunk_sideB_ae_members: list[str] iptrunk_sideB_ae_members_descriptions: list[str] # TODO: we need additional validation: - # sideA fqdn must be different from sideB fqdn - # the lenght of iptrunk_sideA_ae_members should - # be the same as iptrunk_sideA_ae_members - # interface names must be validated + # * sideA fqdn must be different from sideB fqdn + # * the length of iptrunk_sideA_ae_members should + # be the same as iptrunk_sideB_ae_members + # * interface names must be validated user_input = yield CreateIptrunkForm @@ -152,64 +154,72 @@ def initialize_subscription( @step('Provision IP trunk interface [DRY RUN]') def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, - process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface") + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'trunk_interface') return {'subscription': subscription} @step('Provision IP trunk interface [FOR REAL]') def provision_ip_trunk_iface_real(subscription: IptrunkProvisioning, - process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface", False) + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'trunk_interface', False) return {'subscription': subscription} @step('Provision IP trunk ISIS interface [DRY RUN]') def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, - process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface") + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'isis_interface') return {'subscription': subscription} @step('Provision IP trunk ISIS interface [FOR REAL]') def provision_ip_trunk_isis_iface_real(subscription: IptrunkProvisioning, - process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface", False) + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'isis_interface', False) return {'subscription': subscription} @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") + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'ldp_interface') return {'subscription': subscription} @step('Provision IP trunk LDP interface [FOR REAL]') def provision_ip_trunk_ldp_iface_real(subscription: IptrunkProvisioning, - process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "ldp_interface", False) + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'ldp_interface', False) return {'subscription': subscription} @step('Provision IP trunk LLDP interface [DRY RUN]') def provision_ip_trunk_lldp_iface_dry(subscription: IptrunkProvisioning, - process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "lldp_interface") + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'lldp_interface') return {'subscription': subscription} @step('Provision IP trunk LLDP interface [FOR REAL]') def provision_ip_trunk_lldp_iface_real(subscription: IptrunkProvisioning, - process_id: UUIDstr) -> State: - provisioning_proxy.provision_ip_trunk(subscription, process_id, "lldp_interface", False) + process_id: UUIDstr) -> State: + provisioning_proxy.provision_ip_trunk(subscription, process_id, + 'lldp_interface', False) return {'subscription': subscription} diff --git a/gso/workflows/iptrunk/terminate_iptrunk.py b/gso/workflows/iptrunk/terminate_iptrunk.py index 54e00e0ee6fa7af4a63f4704485549790fbbb7f8..c77cb2f9ca339ae33d4e0c8ee5fe55165d0261e3 100644 --- a/gso/workflows/iptrunk/terminate_iptrunk.py +++ b/gso/workflows/iptrunk/terminate_iptrunk.py @@ -1,8 +1,9 @@ +# noinspection PyProtectedMember from orchestrator.forms import FormPage -from orchestrator.types import FormGenerator, State from orchestrator.forms.validators import Label from orchestrator.targets import Target from orchestrator.types import InputForm, SubscriptionLifecycle, UUIDstr +from orchestrator.types import State from orchestrator.workflow import done, init, step, workflow from orchestrator.workflows.steps import ( resync, @@ -23,50 +24,46 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> InputForm: class TerminateForm(FormPage): are_you_sure: Label = ( - f"Are you sure you want to remove {subscription.description}?" - ) # type:ignore + f'Are you sure you want to remove {subscription.description}?' + ) return TerminateForm -def _deprovision_in_user_management_system(fqdn: str) -> str: - pass - - @step('Deprovision IP trunk [DRY RUN]') def deprovision_ip_trunk_dry(subscription: Iptrunk, - process_id: UUIDstr) -> State: - provisioning_proxy.deprovision_ip_trunk(subscription, process_id ) + process_id: UUIDstr) -> State: + provisioning_proxy.deprovision_ip_trunk(subscription, process_id) return {'subscription': subscription} @step('Deprovision IP trunk [FOR REAL]') def deprovision_ip_trunk_real(subscription: Iptrunk, - process_id: UUIDstr) -> State: + process_id: UUIDstr) -> State: provisioning_proxy.deprovision_ip_trunk(subscription, process_id, False) return {'subscription': subscription} @workflow( - "Terminate IPtrunk", + 'Terminate IPtrunk', initial_input_form=wrap_modify_initial_input_form( - initial_input_form_generator), + initial_input_form_generator), target=Target.TERMINATE, ) def terminate_iptrunk(): return ( - init - >> store_process_subscription(Target.TERMINATE) - >> unsync - >> deprovision_ip_trunk_dry - >> await_pp_results - >> confirm_pp_results - >> deprovision_ip_trunk_real - >> await_pp_results - >> confirm_pp_results - >> set_status(SubscriptionLifecycle.TERMINATED) - >> resync - >> done + init + >> store_process_subscription(Target.TERMINATE) + >> unsync + >> deprovision_ip_trunk_dry + >> await_pp_results + >> confirm_pp_results + >> deprovision_ip_trunk_real + >> await_pp_results + >> confirm_pp_results + >> set_status(SubscriptionLifecycle.TERMINATED) + >> resync + >> done )