Skip to content
Snippets Groups Projects
Commit a456a1ec authored by Karel van Klink's avatar Karel van Klink :smiley_cat:
Browse files

Add options to skip ansible playbook runs in layer 2 circuit workflows

parent 505e169d
No related branches found
No related tags found
1 merge request!400LSO steps added to the L2c workflows
Pipeline #93218 passed
......@@ -26,7 +26,7 @@ from orchestrator.forms import FormPage, SubmitFormPage
from orchestrator.forms.validators import Choice, Label
from orchestrator.targets import Target
from orchestrator.utils.errors import ProcessFailureError
from orchestrator.workflow import StepList, begin, done
from orchestrator.workflow import StepList, begin, conditional, done
from orchestrator.workflows.steps import resync, store_process_subscription, unsync
from orchestrator.workflows.utils import wrap_modify_initial_input_form
from pydantic import ConfigDict, Field
......@@ -75,6 +75,11 @@ def input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
label_a: Label = Field("Are we migrating to a different site?", exclude=True)
migrate_to_different_site: bool = False
label_b: Label = Field("Execute Ansible playbooks on the OLD side of the circuit?", exclude=True)
run_old_side_ansible: bool = True
label_c: Label = Field("Execute Ansible playbooks on the NEW side of the circuit?", exclude=True)
run_new_side_ansible: bool = True
initial_user_input = yield MigrateL2CircuitForm
replace_side_partner = get_partner_by_id(EdgePort.from_subscription(initial_user_input.replace_side).customer_id)
......@@ -87,6 +92,8 @@ def input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
return {
"tt_number": initial_user_input.tt_number,
"run_old_side_ansible": initial_user_input.run_old_side_ansible,
"run_new_side_ansible": initial_user_input.run_new_side_ansible,
"subscription": subscription,
"subscription_id": subscription_id,
"old_edge_port": initial_user_input.replace_side,
......@@ -124,19 +131,22 @@ def update_subscription_model(subscription: Layer2Circuit, old_edge_port: UUIDst
)
def migrate_layer_2_circuit() -> StepList:
"""Migrate a Layer 2 Circuit."""
run_old_side_ansible = conditional(lambda state: state["run_old_side_ansible"])
run_new_side_ansible = conditional(lambda state: state["run_new_side_ansible"])
return (
begin
>> store_process_subscription(Target.MODIFY)
>> unsync
>> generate_fqdn_list
>> extract_partner_name_from_edge_port
>> lso_interaction(terminate_l2circuit_dry)
>> lso_interaction(terminate_l2circuit_real)
>> run_old_side_ansible(generate_fqdn_list)
>> run_old_side_ansible(extract_partner_name_from_edge_port)
>> run_old_side_ansible(lso_interaction(terminate_l2circuit_dry))
>> run_old_side_ansible(lso_interaction(terminate_l2circuit_real))
>> update_subscription_model
>> generate_fqdn_list
>> extract_partner_name_from_edge_port
>> lso_interaction(provision_l2circuit_dry)
>> lso_interaction(provision_l2circuit_real)
>> run_new_side_ansible(generate_fqdn_list)
>> run_new_side_ansible(extract_partner_name_from_edge_port)
>> run_new_side_ansible(lso_interaction(provision_l2circuit_dry))
>> run_new_side_ansible(lso_interaction(provision_l2circuit_real))
>> resync
>> done
)
......@@ -3,7 +3,7 @@
from orchestrator import begin, done, workflow
from orchestrator.forms import FormPage, SubmitFormPage
from orchestrator.targets import Target
from orchestrator.workflow import StepList, step
from orchestrator.workflow import StepList, conditional, step
from orchestrator.workflows.steps import resync, store_process_subscription, unsync
from orchestrator.workflows.utils import wrap_modify_initial_input_form
from pydantic import BaseModel, ConfigDict, Field
......@@ -43,6 +43,9 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
policer_enabled: bool = subscription.layer_2_circuit.policer_enabled
custom_service_name: str | None = subscription.layer_2_circuit.custom_service_name
label: Label = Field("Should this workflow execute Ansible playbooks on routers?", exclude=True)
run_ansible_steps: bool = True
layer_2_circuit_input = yield ModifyL2CircuitForm
class ModifyLayer2CircuitServiceSidesPage(SubmitFormPage):
......@@ -134,15 +137,17 @@ def modify_layer_2_circuit_subscription(
)
def modify_layer_2_circuit() -> StepList:
"""Modify an existing Layer 2 Circuit service subscription."""
run_ansible_steps = conditional(lambda state: state["run_ansible_steps"])
return (
begin
>> store_process_subscription(Target.MODIFY)
>> unsync
>> generate_fqdn_list
>> extract_partner_name_from_edge_port
>> run_ansible_steps(generate_fqdn_list)
>> run_ansible_steps(extract_partner_name_from_edge_port)
>> modify_layer_2_circuit_subscription
>> lso_interaction(provision_l2circuit_dry)
>> lso_interaction(provision_l2circuit_real)
>> run_ansible_steps(lso_interaction(provision_l2circuit_dry))
>> run_ansible_steps(lso_interaction(provision_l2circuit_real))
>> resync
>> done
)
......@@ -4,10 +4,12 @@ from orchestrator import begin, workflow
from orchestrator.forms import SubmitFormPage
from orchestrator.targets import Target
from orchestrator.types import SubscriptionLifecycle
from orchestrator.workflow import StepList, done
from orchestrator.workflow import StepList, conditional, done
from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync
from orchestrator.workflows.utils import wrap_modify_initial_input_form
from pydantic import Field
from pydantic_forms.types import FormGenerator, UUIDstr
from pydantic_forms.validators import Label
from gso.products.product_types.layer_2_circuit import Layer2Circuit
from gso.services.lso_client import lso_interaction
......@@ -26,6 +28,9 @@ def _input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
class TerminateForm(SubmitFormPage):
tt_number: TTNumber
label: Label = Field("Should this workflow run Ansible playbooks to remove configuration from routers?")
run_ansible_steps: bool = True
user_input = yield TerminateForm
return {"subscription": layer_2_circuit} | user_input.model_dump()
......@@ -37,14 +42,16 @@ def _input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
)
def terminate_layer_2_circuit() -> StepList:
"""Terminate a Layer 2 Circuit subscription."""
run_ansible_steps = conditional(lambda state: state["run_ansible_steps"])
return (
begin
>> store_process_subscription(Target.TERMINATE)
>> unsync
>> generate_fqdn_list
>> extract_partner_name_from_edge_port
>> lso_interaction(terminate_l2circuit_dry)
>> lso_interaction(terminate_l2circuit_real)
>> run_ansible_steps(generate_fqdn_list)
>> run_ansible_steps(extract_partner_name_from_edge_port)
>> run_ansible_steps(lso_interaction(terminate_l2circuit_dry))
>> run_ansible_steps(lso_interaction(terminate_l2circuit_real))
>> set_status(SubscriptionLifecycle.TERMINATED)
>> resync
>> done
......
......@@ -10,9 +10,13 @@ from test.workflows import assert_complete, assert_lso_interaction_success, extr
@pytest.mark.workflow()
@pytest.mark.parametrize("layer_2_circuit_service_type", LAYER_2_CIRCUIT_SERVICE_TYPES)
@pytest.mark.parametrize("run_old_side_ansible", [False, True])
@pytest.mark.parametrize("run_new_side_ansible", [False, True])
@patch("gso.services.lso_client._send_request")
def test_migrate_layer_2_circuit(
mock_lso_interaction,
run_new_side_ansible,
run_old_side_ansible,
layer_2_circuit_service_type,
layer_2_circuit_subscription_factory,
edge_port_subscription_factory,
......@@ -33,13 +37,19 @@ def test_migrate_layer_2_circuit(
"tt_number": faker.tt_number(),
"replace_side": old_edge_port.subscription_id,
"migrate_to_different_site": False,
"run_old_side_ansible": run_old_side_ansible,
"run_new_side_ansible": run_new_side_ansible,
},
{"new_edge_port": new_edge_port.subscription_id},
]
result, process_stat, step_log = run_workflow("migrate_layer_2_circuit", initial_layer_2_circuit_data)
for _ in range(4):
lso_step_count = 0
lso_step_count += 2 if run_old_side_ansible else 0
lso_step_count += 2 if run_new_side_ansible else 0
for _ in range(lso_step_count):
result, step_log = assert_lso_interaction_success(result, process_stat, step_log)
assert_complete(result)
......@@ -48,7 +58,7 @@ def test_migrate_layer_2_circuit(
subscription_id = state["subscription_id"]
subscription = Layer2Circuit.from_subscription(subscription_id)
assert subscription.status == "active"
assert mock_lso_interaction.call_count == 4
assert mock_lso_interaction.call_count == lso_step_count
replaced_edge_port = subscription.layer_2_circuit.layer_2_circuit_sides[1].sbp.edge_port
assert replaced_edge_port.model_dump(exclude="edge_port_ae_members") == new_edge_port.edge_port.model_dump(
......
......@@ -9,11 +9,13 @@ from test.workflows import assert_complete, assert_lso_interaction_success, extr
@pytest.mark.parametrize("layer_2_circuit_service_type", LAYER_2_CIRCUIT_SERVICE_TYPES)
@pytest.mark.parametrize("run_ansible_steps", [False, True])
@pytest.mark.workflow()
@patch("gso.services.lso_client._send_request")
def test_modify_layer_2_circuit_change_policer_bandwidth(
mock_lso_interaction,
layer_2_circuit_service_type,
run_ansible_steps,
layer_2_circuit_subscription_factory,
faker,
partner_factory,
......@@ -26,6 +28,7 @@ def test_modify_layer_2_circuit_change_policer_bandwidth(
"layer_2_circuit_type": Layer2CircuitType.VLAN,
"policer_enabled": False,
"custom_service_name": faker.sentence(),
"run_ansible_steps": run_ansible_steps,
},
{
"vlan_range_lower_bound": subscription.layer_2_circuit.vlan_range_lower_bound,
......@@ -38,12 +41,14 @@ def test_modify_layer_2_circuit_change_policer_bandwidth(
]
result, process_stat, step_log = run_workflow("modify_layer_2_circuit", input_form_data)
for _ in range(2):
lso_step_count = 2 if run_ansible_steps else 0
for _ in range(lso_step_count):
result, step_log = assert_lso_interaction_success(result, process_stat, step_log)
subscription = Layer2Circuit.from_subscription(str(subscription.subscription_id))
assert_complete(result)
assert mock_lso_interaction.call_count == 2
assert mock_lso_interaction.call_count == lso_step_count
assert subscription.status == SubscriptionLifecycle.ACTIVE
assert subscription.layer_2_circuit.policer_enabled is False
assert subscription.layer_2_circuit.bandwidth is None
......@@ -63,11 +68,13 @@ def test_modify_layer_2_circuit_change_policer_bandwidth(
@pytest.mark.parametrize("layer_2_circuit_service_type", LAYER_2_CIRCUIT_SERVICE_TYPES)
@pytest.mark.parametrize("run_ansible_steps", [False, True])
@pytest.mark.workflow()
@patch("gso.services.lso_client._send_request")
def test_modify_layer_2_circuit_change_circuit_type(
mock_lso_interaction,
layer_2_circuit_service_type,
run_ansible_steps,
layer_2_circuit_subscription_factory,
faker,
partner_factory,
......@@ -78,6 +85,7 @@ def test_modify_layer_2_circuit_change_circuit_type(
{
"tt_number": faker.tt_number(),
"layer_2_circuit_type": Layer2CircuitType.ETHERNET,
"run_ansible_steps": run_ansible_steps,
},
{
"vlan_range_lower_bound": None,
......@@ -89,13 +97,15 @@ def test_modify_layer_2_circuit_change_circuit_type(
]
result, process_stat, step_log = run_workflow("modify_layer_2_circuit", input_form_data)
for _ in range(2):
lso_step_count = 2 if run_ansible_steps else 0
for _ in range(lso_step_count):
result, step_log = assert_lso_interaction_success(result, process_stat, step_log)
assert_complete(result)
state = extract_state(result)
subscription = Layer2Circuit.from_subscription(state["subscription_id"])
assert mock_lso_interaction.call_count == 2
assert mock_lso_interaction.call_count == lso_step_count
assert subscription.status == SubscriptionLifecycle.ACTIVE
assert subscription.layer_2_circuit.vlan_range_lower_bound is None
assert subscription.layer_2_circuit.vlan_range_upper_bound is None
......
......@@ -8,17 +8,23 @@ from test.workflows import assert_complete, assert_lso_interaction_success, extr
@pytest.mark.workflow()
@pytest.mark.parametrize("layer_2_circuit_service_type", LAYER_2_CIRCUIT_SERVICE_TYPES)
@pytest.mark.parametrize("run_ansible_steps", [True, False])
@patch("gso.services.lso_client._send_request")
def test_terminate_layer_2_circuit(
mock_lso_interaction, layer_2_circuit_service_type, layer_2_circuit_subscription_factory, faker
mock_lso_interaction, layer_2_circuit_service_type, run_ansible_steps, layer_2_circuit_subscription_factory, faker
):
subscription_id = str(
layer_2_circuit_subscription_factory(layer_2_circuit_service_type=layer_2_circuit_service_type).subscription_id
)
initial_layer_2_circuit_data = [{"subscription_id": subscription_id}, {"tt_number": faker.tt_number()}]
initial_layer_2_circuit_data = [
{"subscription_id": subscription_id},
{"tt_number": faker.tt_number(), "run_ansible_steps": run_ansible_steps},
]
result, process_stat, step_log = run_workflow("terminate_layer_2_circuit", initial_layer_2_circuit_data)
for _ in range(2):
lso_step_count = 2 if run_ansible_steps else 0
for _ in range(lso_step_count):
result, step_log = assert_lso_interaction_success(result, process_stat, step_log)
assert_complete(result)
......@@ -27,4 +33,4 @@ def test_terminate_layer_2_circuit(
subscription_id = state["subscription_id"]
subscription = Layer2Circuit.from_subscription(subscription_id)
assert subscription.status == "terminated"
assert mock_lso_interaction.call_count == 2
assert mock_lso_interaction.call_count == lso_step_count
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment