From e8614e72e06deb5859f4cf5083f732c9512c66f4 Mon Sep 17 00:00:00 2001 From: Aleksandr Kurbatov <ak@geant.org> Date: Tue, 10 Dec 2024 19:09:01 +0000 Subject: [PATCH] `modify_vrf_router_list`: Added LSO steps --- gso/workflows/vrf/modify_vrf_router_list.py | 58 ++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/gso/workflows/vrf/modify_vrf_router_list.py b/gso/workflows/vrf/modify_vrf_router_list.py index d198d8f9..17f888d0 100644 --- a/gso/workflows/vrf/modify_vrf_router_list.py +++ b/gso/workflows/vrf/modify_vrf_router_list.py @@ -1,6 +1,6 @@ """Modify VRF to add or remove routers.""" -from typing import Annotated +from typing import Annotated, Any from orchestrator.forms import FormPage from orchestrator.targets import Target @@ -13,7 +13,9 @@ from pydantic_forms.validators import validate_unique_list from gso.products.product_types.router import Router from gso.products.product_types.vrf import VRF +from gso.services.lso_client import LSOState, lso_interaction from gso.utils.helpers import active_router_selector +from gso.utils.types.tt_number import TTNumber def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: @@ -25,6 +27,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: class ModifyVRFRouterListForm(FormPage): model_config = ConfigDict(title=f"Modify the {subscription.vrf.vrf_name} VRF to add or remove routers.") + tt_number: TTNumber router_list: Annotated[ list[RouterSelection], @@ -51,6 +54,48 @@ def update_subscription_model(subscription: VRF, router_list: list[dict[str, UUI return {"subscription": subscription} +@step("[DRY RUN] Update VRF on list of routers") +def update_vrf_on_routers_dry( + subscription: dict[str, Any], process_id: UUIDstr, tt_number: str, router_list +) -> LSOState: + """Deploy VRF on a list of routers - Dry run.""" + vrf_new_router_list = [Router.from_subscription(router["router_id"]) for router in router_list] + inventory = {"all": {"hosts": {router.router.router_fqdn: None for router in vrf_new_router_list}}} + extra_vars = { + "subscription": subscription, + "dry_run": True, + "verb": "update", + "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " + f"Deploy config for {subscription["description"]}", + } + return { + "playbook_name": "gap_ansible/playbooks/vrf_update.yaml", + "inventory": inventory, + "extra_vars": extra_vars, + } + + +@step("[FOR REAL] Update VRF on list of routers") +def update_vrf_on_routers_real( + subscription: dict[str, Any], process_id: UUIDstr, tt_number: str, router_list +) -> LSOState: + """Deploy VRF on a list of routers - with commit.""" + vrf_new_router_list = [Router.from_subscription(router["router_id"]) for router in router_list] + inventory = {"all": {"hosts": {router.router.router_fqdn: None for router in vrf_new_router_list}}} + extra_vars = { + "subscription": subscription, + "dry_run": False, + "verb": "update", + "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " + f"Deploy config for {subscription["description"]}", + } + return { + "playbook_name": "gap_ansible/playbooks/vrf_update.yaml", + "inventory": inventory, + "extra_vars": extra_vars, + } + + @workflow( "Modify VRF router list", initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), @@ -58,4 +103,13 @@ def update_subscription_model(subscription: VRF, router_list: list[dict[str, UUI ) def modify_vrf_router_list() -> StepList: """Modify the VRF router list.""" - return begin >> store_process_subscription(Target.MODIFY) >> unsync >> update_subscription_model >> resync >> done + return ( + begin + >> store_process_subscription(Target.MODIFY) + >> unsync + >> lso_interaction(update_vrf_on_routers_dry) + >> lso_interaction(update_vrf_on_routers_real) + >> update_subscription_model + >> resync + >> done + ) -- GitLab