From 390d642fbea22b5f10c61c7369ce7c3487e35115 Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Tue, 9 Jan 2024 13:56:06 +0100
Subject: [PATCH] fill in workflow steps for removing configuration from a
 terminated router, and update the unit test

---
 gso/workflows/router/terminate_router.py      | 51 ++++++++++++++++---
 .../workflows/router/test_terminate_router.py | 33 ++++++------
 2 files changed, 60 insertions(+), 24 deletions(-)

diff --git a/gso/workflows/router/terminate_router.py b/gso/workflows/router/terminate_router.py
index b7d70d1e..1a83943a 100644
--- a/gso/workflows/router/terminate_router.py
+++ b/gso/workflows/router/terminate_router.py
@@ -1,12 +1,14 @@
 """A workflow that terminates a router."""
 
 import ipaddress
+import json
 import logging
 
 from orchestrator.forms import FormPage
 from orchestrator.forms.validators import Label
 from orchestrator.targets import Target
 from orchestrator.types import FormGenerator, SubscriptionLifecycle, UUIDstr
+from orchestrator.utils.json import json_dumps
 from orchestrator.workflow import StepList, conditional, done, init, step, workflow
 from orchestrator.workflows.steps import (
     resync,
@@ -20,6 +22,7 @@ from gso.products.product_blocks.router import RouterVendor
 from gso.products.product_types.router import Router
 from gso.services import infoblox
 from gso.services.netbox_client import NetboxClient
+from gso.services.provisioning_proxy import execute_playbook, pp_interaction
 
 logger = logging.getLogger(__name__)
 
@@ -49,13 +52,46 @@ def deprovision_loopback_ips(subscription: Router) -> dict:
     return {"subscription": subscription}
 
 
-@step("Remove configuration from router")
-def remove_config_from_router() -> None:
-    """Remove configuration from the router, first as a dry run.
+@step("[DRY RUN] Remove configuration from router")
+def remove_config_from_router_dry(
+    subscription: Router, callback_route: str, process_id: UUIDstr, tt_number: str
+) -> None:
+    """Remove configuration from the router, first as a dry run."""
+    extra_vars = {
+        "wfo_router_json": json.loads(json_dumps(subscription)),
+        "dry_run": True,
+        "verb": "terminate",
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Terminating "
+        f"{subscription.router.router_fqdn}",
+    }
+
+    execute_playbook(
+        playbook_name="base_config.yaml",
+        callback_route=callback_route,
+        inventory=subscription.router.router_fqdn,
+        extra_vars=extra_vars,
+    )
 
-    FIXME: Add actual content
-    TODO: update unit test accordingly
-    """
+
+@step("[FOR REAL] Remove configuration from router")
+def remove_config_from_router_real(
+    subscription: Router, callback_route: str, process_id: UUIDstr, tt_number: str
+) -> None:
+    """Remove configuration from the router."""
+    extra_vars = {
+        "wfo_router_json": json.loads(json_dumps(subscription)),
+        "dry_run": False,
+        "verb": "terminate",
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Terminating "
+        f"{subscription.router.router_fqdn}",
+    }
+
+    execute_playbook(
+        playbook_name="base_config.yaml",
+        callback_route=callback_route,
+        inventory=subscription.router.router_fqdn,
+        extra_vars=extra_vars,
+    )
 
 
 @step("Remove Device from Netbox")
@@ -87,7 +123,8 @@ def terminate_router() -> StepList:
         >> store_process_subscription(Target.TERMINATE)
         >> unsync
         >> run_ipam_steps(deprovision_loopback_ips)
-        >> run_config_steps(remove_config_from_router)
+        >> run_config_steps(pp_interaction(remove_config_from_router_dry))
+        >> run_config_steps(pp_interaction(remove_config_from_router_real))
         >> router_is_nokia(remove_device_from_netbox)
         >> set_status(SubscriptionLifecycle.TERMINATED)
         >> resync
diff --git a/test/workflows/router/test_terminate_router.py b/test/workflows/router/test_terminate_router.py
index 8603a207..7fa28615 100644
--- a/test/workflows/router/test_terminate_router.py
+++ b/test/workflows/router/test_terminate_router.py
@@ -3,38 +3,36 @@ from unittest.mock import patch
 import pytest
 
 from gso.products import Router
-from test.workflows import assert_complete, extract_state, run_workflow
-
-
-@pytest.fixture()
-def router_termination_input_form_data(site_subscription_factory, faker):
-    return {
-        "tt_number": faker.tt_number(),
-        "remove_configuration": True,
-        "clean_up_ipam": True,
-    }
+from test.workflows import assert_complete, extract_state, run_workflow, assert_pp_interaction_success
 
 
 @pytest.mark.workflow()
+@patch("gso.services.provisioning_proxy._send_request")
 @patch("gso.workflows.router.terminate_router.NetboxClient.delete_device")
 @patch("gso.workflows.router.terminate_router.infoblox.delete_host_by_ip")
-def test_terminate_router_success(
+def test_terminate_router_full_success(
     mock_delete_host_by_ip,
     mock_delete_device,
-    router_termination_input_form_data,
+    mock_execute_playbook,
     nokia_router_subscription_factory,
     faker,
     data_config_filename,
 ):
     #  Set up active subscription in database
     product_id = nokia_router_subscription_factory()
+    router_termination_input_form_data = {
+        "tt_number": faker.tt_number(),
+        "remove_configuration": True,
+        "clean_up_ipam": True,
+    }
 
     #  Run workflow
-    initial_router_data = [
-        {"subscription_id": product_id},
-        router_termination_input_form_data,
-    ]
-    result, _, _ = run_workflow("terminate_router", initial_router_data)
+    initial_router_data = [{"subscription_id": product_id}, router_termination_input_form_data]
+    result, process_stat, step_log = run_workflow("terminate_router", initial_router_data)
+
+    for _ in range(2):
+        result, step_log = assert_pp_interaction_success(result, process_stat, step_log)
+
     assert_complete(result)
 
     state = extract_state(result)
@@ -44,3 +42,4 @@ def test_terminate_router_success(
     assert subscription.status == "terminated"
     assert mock_delete_device.call_count == 1
     assert mock_delete_host_by_ip.call_count == 1
+    assert mock_execute_playbook.call_count == 2
-- 
GitLab