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

Add support for modifying the IAS flavour in creation and modification workflows

parent 4eaa5fbc
No related branches found
No related tags found
1 merge request!407Add support for modifying the IAS flavour in creation and modification workflows
Pipeline #93417 canceled
...@@ -214,7 +214,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -214,7 +214,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
user_input = yield AddAccessPortForm user_input = yield AddAccessPortForm
return { return {
"operation": initial_input.operation, "operation": initial_input.operation,
"added_access_port": user_input, "added_access_port": user_input.model_dump(),
} }
case Operation.REMOVE: case Operation.REMOVE:
...@@ -357,7 +357,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -357,7 +357,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
return { return {
"operation": initial_input.operation, "operation": initial_input.operation,
"modified_access_port": user_input.access_port, "modified_access_port": user_input.access_port,
"modified_sbp": binding_port_input_form, "modified_sbp": binding_port_input_form.model_dump(),
} }
case _: case _:
......
...@@ -26,6 +26,7 @@ from gso.workflows.l3_core_service.base_create_l3_core_service import ( ...@@ -26,6 +26,7 @@ from gso.workflows.l3_core_service.base_create_l3_core_service import (
from gso.workflows.l3_core_service.base_create_l3_core_service import ( from gso.workflows.l3_core_service.base_create_l3_core_service import (
initial_input_form_generator as base_initial_input_form_generator, initial_input_form_generator as base_initial_input_form_generator,
) )
from gso.workflows.l3_core_service.ias.shared import update_ias_subscription_model
def initial_input_form_generator(product_name: str) -> FormGenerator: def initial_input_form_generator(product_name: str) -> FormGenerator:
...@@ -61,6 +62,7 @@ def create_ias() -> StepList: ...@@ -61,6 +62,7 @@ def create_ias() -> StepList:
>> create_subscription >> create_subscription
>> store_process_subscription(Target.CREATE) >> store_process_subscription(Target.CREATE)
>> initialize_subscription >> initialize_subscription
>> update_ias_subscription_model
>> start_moodi() >> start_moodi()
>> lso_interaction(provision_sbp_dry) >> lso_interaction(provision_sbp_dry)
>> lso_interaction(provision_sbp_real) >> lso_interaction(provision_sbp_real)
......
...@@ -19,6 +19,7 @@ from gso.workflows.l3_core_service.base_create_imported_l3_core_service import ( ...@@ -19,6 +19,7 @@ from gso.workflows.l3_core_service.base_create_imported_l3_core_service import (
from gso.workflows.l3_core_service.base_create_imported_l3_core_service import ( from gso.workflows.l3_core_service.base_create_imported_l3_core_service import (
initialize_subscription, initialize_subscription,
) )
from gso.workflows.l3_core_service.ias.shared import update_ias_subscription_model
def initial_input_form_generator() -> FormGenerator: def initial_input_form_generator() -> FormGenerator:
...@@ -53,6 +54,7 @@ def create_imported_ias() -> StepList: ...@@ -53,6 +54,7 @@ def create_imported_ias() -> StepList:
return ( return (
begin begin
>> create_subscription >> create_subscription
>> update_ias_subscription_model
>> store_process_subscription(Target.CREATE) >> store_process_subscription(Target.CREATE)
>> initialize_subscription >> initialize_subscription
>> set_status(SubscriptionLifecycle.ACTIVE) >> set_status(SubscriptionLifecycle.ACTIVE)
......
"""Modification workflow for a IAS subscription.""" """Modification workflow for a IAS subscription."""
from orchestrator import begin, conditional, done, workflow from orchestrator import begin, conditional, done, workflow
from orchestrator.domain import SubscriptionModel
from orchestrator.targets import Target from orchestrator.targets import Target
from orchestrator.workflow import StepList from orchestrator.workflow import StepList
from orchestrator.workflows.steps import resync, store_process_subscription, unsync from orchestrator.workflows.steps import resync, store_process_subscription, unsync
from orchestrator.workflows.utils import wrap_modify_initial_input_form from orchestrator.workflows.utils import wrap_modify_initial_input_form
from pydantic_forms.core import FormPage
from pydantic_forms.types import FormGenerator, UUIDstr
from gso.products.product_blocks.ias import IASFlavor
from gso.workflows.l3_core_service.base_modify_l3_core_service import ( from gso.workflows.l3_core_service.base_modify_l3_core_service import (
Operation, Operation,
create_new_sbp, create_new_sbp,
...@@ -13,11 +17,28 @@ from gso.workflows.l3_core_service.base_modify_l3_core_service import ( ...@@ -13,11 +17,28 @@ from gso.workflows.l3_core_service.base_modify_l3_core_service import (
modify_existing_sbp, modify_existing_sbp,
remove_old_sbp, remove_old_sbp,
) )
from gso.workflows.l3_core_service.ias.shared import update_ias_subscription_model
def modify_ias_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
"""Initial form generator for modifying the custom attributes of an existing IAS subscription."""
initial_generator = initial_input_form_generator(subscription_id)
initial_user_input = yield from initial_generator
subscription = SubscriptionModel.from_subscription(subscription_id)
# Additional IAS step
class IASExtraForm(FormPage):
# TODO: remove type hint workaround
ias_flavor: IASFlavor | str = subscription.ias.ias_flavor # type: ignore[attr-defined]
ias_extra = yield IASExtraForm
return initial_user_input | ias_extra.model_dump()
@workflow( @workflow(
"Modify IAS", "Modify IAS",
initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), initial_input_form=wrap_modify_initial_input_form(modify_ias_input_form_generator),
target=Target.MODIFY, target=Target.MODIFY,
) )
def modify_ias() -> StepList: def modify_ias() -> StepList:
...@@ -30,6 +51,7 @@ def modify_ias() -> StepList: ...@@ -30,6 +51,7 @@ def modify_ias() -> StepList:
begin begin
>> store_process_subscription(Target.MODIFY) >> store_process_subscription(Target.MODIFY)
>> unsync >> unsync
>> update_ias_subscription_model
>> access_port_is_added(create_new_sbp) >> access_port_is_added(create_new_sbp)
>> access_port_is_removed(remove_old_sbp) >> access_port_is_removed(remove_old_sbp)
>> access_port_is_modified(modify_existing_sbp) >> access_port_is_modified(modify_existing_sbp)
......
"""Shared logic for IAS service workflows."""
from orchestrator import step
from orchestrator.domain import SubscriptionModel
from pydantic_forms.types import State
from gso.products.product_blocks.ias import IASFlavor
@step("Update IAS-specific attributes")
def update_ias_subscription_model(subscription: SubscriptionModel, ias_flavor: IASFlavor) -> State:
"""Update the subscription model of an IAS subscription with a new IAS flavour."""
subscription.ias.ias_flavor = ias_flavor # type: ignore[attr-defined]
return {"subscription": subscription}
...@@ -14,7 +14,7 @@ from test.workflows import assert_complete, extract_state, run_workflow ...@@ -14,7 +14,7 @@ from test.workflows import assert_complete, extract_state, run_workflow
@pytest.mark.parametrize("product_name", L3_PRODUCT_NAMES) @pytest.mark.parametrize("product_name", L3_PRODUCT_NAMES)
def test_create_imported_l3_core_service_success(faker, partner_factory, edge_port_subscription_factory, product_name): def test_create_imported_l3_core_service_success(faker, partner_factory, edge_port_subscription_factory, product_name):
extra_ias_data = { extra_ias_data = {
"ias_flavor": IASFlavor.IAS_PS_OPT_OUT, "ias_flavor": IASFlavor.IASGWS,
} }
creation_form_input_data = { creation_form_input_data = {
"partner": partner_factory()["name"], "partner": partner_factory()["name"],
...@@ -83,3 +83,6 @@ def test_create_imported_l3_core_service_success(faker, partner_factory, edge_po ...@@ -83,3 +83,6 @@ def test_create_imported_l3_core_service_success(faker, partner_factory, edge_po
assert_complete(result) assert_complete(result)
assert subscription.status == SubscriptionLifecycle.ACTIVE assert subscription.status == SubscriptionLifecycle.ACTIVE
assert subscription.product.name == PRODUCT_IMPORTED_MAP[product_name] assert subscription.product.name == PRODUCT_IMPORTED_MAP[product_name]
if product_name == ProductName.IAS:
assert subscription.ias.ias_flavor == IASFlavor.IASGWS
...@@ -106,6 +106,7 @@ def test_create_l3_core_service_success( ...@@ -106,6 +106,7 @@ def test_create_l3_core_service_success(
assert_complete(result) assert_complete(result)
state = extract_state(result) state = extract_state(result)
subscription = SubscriptionModel.from_subscription(state["subscription_id"]) subscription = SubscriptionModel.from_subscription(state["subscription_id"])
assert subscription.product.name == product_name assert subscription.product.name == product_name
assert mock_lso_client.call_count == lso_interaction_count + 1 assert mock_lso_client.call_count == lso_interaction_count + 1
assert subscription.status == SubscriptionLifecycle.ACTIVE assert subscription.status == SubscriptionLifecycle.ACTIVE
...@@ -116,3 +117,6 @@ def test_create_l3_core_service_success( ...@@ -116,3 +117,6 @@ def test_create_l3_core_service_success(
) )
assert subscription.l3_core.ap_list[0].sbp.gs_id == "GS-12345" assert subscription.l3_core.ap_list[0].sbp.gs_id == "GS-12345"
assert mock_sharepoint_client.call_count == 1 assert mock_sharepoint_client.call_count == 1
if product_name == ProductName.IAS:
assert subscription.ias.ias_flavor == IASFlavor.IASGWS
import pytest import pytest
from orchestrator.domain import SubscriptionModel from orchestrator.domain import SubscriptionModel
from gso.products import ProductName
from gso.products.product_blocks.bgp_session import IPFamily from gso.products.product_blocks.bgp_session import IPFamily
from gso.products.product_blocks.ias import IASFlavor
from gso.utils.shared_enums import APType from gso.utils.shared_enums import APType
from gso.workflows.l3_core_service.base_modify_l3_core_service import Operation from gso.workflows.l3_core_service.base_modify_l3_core_service import Operation
from gso.workflows.l3_core_service.shared import L3_MODIFICATION_WF_MAP, L3_PRODUCT_NAMES from gso.workflows.l3_core_service.shared import L3_MODIFICATION_WF_MAP, L3_PRODUCT_NAMES
...@@ -19,6 +21,12 @@ def test_modify_l3_core_service_remove_edge_port_success(faker, l3_core_service_ ...@@ -19,6 +21,12 @@ def test_modify_l3_core_service_remove_edge_port_success(faker, l3_core_service_
{"access_port": str(access_port.subscription_instance_id)}, {"access_port": str(access_port.subscription_instance_id)},
] ]
if product_name == ProductName.IAS:
extra_ias_data = {
"ias_flavor": IASFlavor.IASGWS,
}
input_form_data.append(extra_ias_data)
result, _, _ = run_workflow(L3_MODIFICATION_WF_MAP[product_name], input_form_data) result, _, _ = run_workflow(L3_MODIFICATION_WF_MAP[product_name], input_form_data)
state = extract_state(result) state = extract_state(result)
...@@ -26,6 +34,8 @@ def test_modify_l3_core_service_remove_edge_port_success(faker, l3_core_service_ ...@@ -26,6 +34,8 @@ def test_modify_l3_core_service_remove_edge_port_success(faker, l3_core_service_
ap_list = subscription.l3_core.ap_list ap_list = subscription.l3_core.ap_list
assert len(ap_list) == 1 assert len(ap_list) == 1
assert ap_list[0].ap_type == APType.BACKUP assert ap_list[0].ap_type == APType.BACKUP
if product_name == ProductName.IAS:
assert subscription.ias.ias_flavor == IASFlavor.IASGWS
@pytest.mark.parametrize("product_name", L3_PRODUCT_NAMES) @pytest.mark.parametrize("product_name", L3_PRODUCT_NAMES)
...@@ -70,6 +80,12 @@ def test_modify_l3_core_service_add_new_edge_port_success( ...@@ -70,6 +80,12 @@ def test_modify_l3_core_service_add_new_edge_port_success(
}, },
] ]
if product_name == ProductName.IAS:
extra_ias_data = {
"ias_flavor": IASFlavor.IASGWS,
}
input_form_data.append(extra_ias_data)
result, _, _ = run_workflow(L3_MODIFICATION_WF_MAP[product_name], input_form_data) result, _, _ = run_workflow(L3_MODIFICATION_WF_MAP[product_name], input_form_data)
state = extract_state(result) state = extract_state(result)
...@@ -84,6 +100,8 @@ def test_modify_l3_core_service_add_new_edge_port_success( ...@@ -84,6 +100,8 @@ def test_modify_l3_core_service_add_new_edge_port_success(
assert str(new_ap.sbp.ipv6_address) == input_form_data[2]["ipv6_address"] assert str(new_ap.sbp.ipv6_address) == input_form_data[2]["ipv6_address"]
assert new_ap.sbp.ipv6_mask == input_form_data[2]["ipv6_mask"] assert new_ap.sbp.ipv6_mask == input_form_data[2]["ipv6_mask"]
assert len(ap_list) == 3 assert len(ap_list) == 3
if product_name == ProductName.IAS:
assert subscription.ias.ias_flavor == IASFlavor.IASGWS
@pytest.fixture() @pytest.fixture()
...@@ -145,6 +163,12 @@ def test_modify_l3_core_service_modify_edge_port_success( ...@@ -145,6 +163,12 @@ def test_modify_l3_core_service_modify_edge_port_success(
{**new_sbp_data}, {**new_sbp_data},
] ]
if product_name == ProductName.IAS:
extra_ias_data = {
"ias_flavor": IASFlavor.IASGWS,
}
input_form_data.append(extra_ias_data)
result, _, _ = run_workflow(L3_MODIFICATION_WF_MAP[product_name], input_form_data) result, _, _ = run_workflow(L3_MODIFICATION_WF_MAP[product_name], input_form_data)
state = extract_state(result) state = extract_state(result)
...@@ -193,3 +217,6 @@ def test_modify_l3_core_service_modify_edge_port_success( ...@@ -193,3 +217,6 @@ def test_modify_l3_core_service_modify_edge_port_success(
assert access_port.sbp.v6_bfd_settings.bfd_interval_rx == new_sbp_data["v6_bfd_interval_rx"] assert access_port.sbp.v6_bfd_settings.bfd_interval_rx == new_sbp_data["v6_bfd_interval_rx"]
assert access_port.sbp.v6_bfd_settings.bfd_interval_tx == new_sbp_data["v6_bfd_interval_tx"] assert access_port.sbp.v6_bfd_settings.bfd_interval_tx == new_sbp_data["v6_bfd_interval_tx"]
assert access_port.sbp.v6_bfd_settings.bfd_multiplier == new_sbp_data["v6_bfd_multiplier"] assert access_port.sbp.v6_bfd_settings.bfd_multiplier == new_sbp_data["v6_bfd_multiplier"]
if product_name == ProductName.IAS:
assert subscription.ias.ias_flavor == IASFlavor.IASGWS
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment