Skip to content
Snippets Groups Projects
Verified Commit f3bb5ce7 authored by Saket Agrahari's avatar Saket Agrahari Committed by Karel van Klink
Browse files

adding lso to modify l3_core_service wf

parent 2cd67397
No related branches found
No related tags found
1 merge request!437adding lso to modify l3_core_service wf
...@@ -14,6 +14,7 @@ from gso.products.product_blocks.bgp_session import BGPSession, IPFamily, IPType ...@@ -14,6 +14,7 @@ from gso.products.product_blocks.bgp_session import BGPSession, IPFamily, IPType
from gso.products.product_blocks.l3_core_service import AccessPort from gso.products.product_blocks.l3_core_service import AccessPort
from gso.products.product_blocks.service_binding_port import BFDSettings, ServiceBindingPort from gso.products.product_blocks.service_binding_port import BFDSettings, ServiceBindingPort
from gso.products.product_types.edge_port import EdgePort from gso.products.product_types.edge_port import EdgePort
from gso.services.partners import get_partner_by_id
from gso.services.subscriptions import generate_unique_id, get_active_edge_port_subscriptions from gso.services.subscriptions import generate_unique_id, get_active_edge_port_subscriptions
from gso.utils.helpers import partner_choice from gso.utils.helpers import partner_choice
from gso.utils.shared_enums import APType, SBPType from gso.utils.shared_enums import APType, SBPType
...@@ -226,6 +227,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -226,6 +227,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,
"tt_number": initial_input.tt_number,
"added_access_port": user_input.model_dump(), "added_access_port": user_input.model_dump(),
} }
...@@ -243,6 +245,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -243,6 +245,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
user_input = yield RemoveAccessPortForm user_input = yield RemoveAccessPortForm
return { return {
"operation": initial_input.operation, "operation": initial_input.operation,
"tt_number": initial_input.tt_number,
"removed_access_port": user_input.access_port, "removed_access_port": user_input.access_port,
} }
...@@ -373,6 +376,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -373,6 +376,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,
"tt_number": initial_input.tt_number,
"modified_sbp": binding_port_input_form.model_dump(), "modified_sbp": binding_port_input_form.model_dump(),
} }
...@@ -464,3 +468,17 @@ def modify_existing_sbp( ...@@ -464,3 +468,17 @@ def modify_existing_sbp(
current_ap.custom_service_name = modified_sbp["custom_service_name"] current_ap.custom_service_name = modified_sbp["custom_service_name"]
return {"subscription": subscription} return {"subscription": subscription}
@step("Populate partner name and edge port FQDN list")
def populate_partner_and_fqdn(subscription: SubscriptionModel) -> dict[str, Any]:
"""Populate the partner name and a list of edge port FQDNs for the subscription."""
edge_port_fqdn_list = [
ap.sbp.edge_port.node.router_fqdn
for ap in subscription.l3_core.ap_list # type: ignore[attr-defined]
]
partner_name = get_partner_by_id(subscription.customer_id).name
return {
"edge_port_fqdn_list": edge_port_fqdn_list,
"partner_name": partner_name,
}
...@@ -5,19 +5,42 @@ from orchestrator.targets import Target ...@@ -5,19 +5,42 @@ 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.services.lso_client import lso_interaction
from gso.workflows.l3_core_service.base_create_l3_core_service import (
deploy_bgp_peers_dry,
deploy_bgp_peers_real,
provision_sbp_dry,
provision_sbp_real,
)
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,
initial_input_form_generator, initial_input_form_generator,
modify_existing_sbp, modify_existing_sbp,
populate_partner_and_fqdn,
remove_old_sbp, remove_old_sbp,
) )
def modify_geant_ip_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
"""Generate the input form for modifying the custom attributes of an existing GÉANT IP subscription."""
orig_form_gen = initial_input_form_generator(subscription_id)
initial_user_input = yield from orig_form_gen
class GeantIPExtraForm(FormPage):
update_sbp_config: bool = True
update_bgp_config: bool = True
geant_ip_extra = yield GeantIPExtraForm
return initial_user_input | geant_ip_extra.model_dump()
@workflow( @workflow(
"Modify GÉANT IP", "Modify GÉANT IP",
initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), initial_input_form=wrap_modify_initial_input_form(modify_geant_ip_input_form_generator),
target=Target.MODIFY, target=Target.MODIFY,
) )
def modify_geant_ip() -> StepList: def modify_geant_ip() -> StepList:
...@@ -25,6 +48,8 @@ def modify_geant_ip() -> StepList: ...@@ -25,6 +48,8 @@ def modify_geant_ip() -> StepList:
access_port_is_added = conditional(lambda state: state["operation"] == Operation.ADD) access_port_is_added = conditional(lambda state: state["operation"] == Operation.ADD)
access_port_is_removed = conditional(lambda state: state["operation"] == Operation.REMOVE) access_port_is_removed = conditional(lambda state: state["operation"] == Operation.REMOVE)
access_port_is_modified = conditional(lambda state: state["operation"] == Operation.EDIT) access_port_is_modified = conditional(lambda state: state["operation"] == Operation.EDIT)
update_sbp = conditional(lambda state: bool(state["update_sbp_config"]))
update_bgp = conditional(lambda state: bool(state["update_bgp_config"]))
return ( return (
begin begin
...@@ -33,6 +58,11 @@ def modify_geant_ip() -> StepList: ...@@ -33,6 +58,11 @@ def modify_geant_ip() -> StepList:
>> 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)
>> populate_partner_and_fqdn
>> update_sbp(lso_interaction(provision_sbp_dry))
>> update_sbp(lso_interaction(provision_sbp_real))
>> update_bgp(lso_interaction(deploy_bgp_peers_dry))
>> update_bgp(lso_interaction(deploy_bgp_peers_real))
>> resync >> resync
>> done >> done
) )
...@@ -10,11 +10,19 @@ from pydantic_forms.types import FormGenerator, UUIDstr ...@@ -10,11 +10,19 @@ from pydantic_forms.types import FormGenerator, UUIDstr
from gso.products.product_blocks.ias import IASFlavor from gso.products.product_blocks.ias import IASFlavor
from gso.products.product_types.ias import IAS from gso.products.product_types.ias import IAS
from gso.services.lso_client import lso_interaction
from gso.workflows.l3_core_service.base_create_l3_core_service import (
deploy_bgp_peers_dry,
deploy_bgp_peers_real,
provision_sbp_dry,
provision_sbp_real,
)
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,
initial_input_form_generator, initial_input_form_generator,
modify_existing_sbp, modify_existing_sbp,
populate_partner_and_fqdn,
remove_old_sbp, remove_old_sbp,
) )
from gso.workflows.l3_core_service.ias.shared import update_ias_subscription_model from gso.workflows.l3_core_service.ias.shared import update_ias_subscription_model
...@@ -31,6 +39,8 @@ def modify_ias_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -31,6 +39,8 @@ def modify_ias_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
class IASExtraForm(FormPage): class IASExtraForm(FormPage):
# TODO: remove type hint workaround # TODO: remove type hint workaround
ias_flavor: IASFlavor | str = subscription.ias.ias_flavor ias_flavor: IASFlavor | str = subscription.ias.ias_flavor
update_sbp_config: bool = True
update_bgp_config: bool = True
ias_extra = yield IASExtraForm ias_extra = yield IASExtraForm
return initial_user_input | ias_extra.model_dump() return initial_user_input | ias_extra.model_dump()
...@@ -46,7 +56,8 @@ def modify_ias() -> StepList: ...@@ -46,7 +56,8 @@ def modify_ias() -> StepList:
access_port_is_added = conditional(lambda state: state["operation"] == Operation.ADD) access_port_is_added = conditional(lambda state: state["operation"] == Operation.ADD)
access_port_is_removed = conditional(lambda state: state["operation"] == Operation.REMOVE) access_port_is_removed = conditional(lambda state: state["operation"] == Operation.REMOVE)
access_port_is_modified = conditional(lambda state: state["operation"] == Operation.EDIT) access_port_is_modified = conditional(lambda state: state["operation"] == Operation.EDIT)
update_sbp = conditional(lambda state: bool(state["update_sbp_config"]))
update_bgp = conditional(lambda state: bool(state["update_bgp_config"]))
return ( return (
begin begin
>> store_process_subscription(Target.MODIFY) >> store_process_subscription(Target.MODIFY)
...@@ -55,6 +66,11 @@ def modify_ias() -> StepList: ...@@ -55,6 +66,11 @@ def modify_ias() -> StepList:
>> 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)
>> populate_partner_and_fqdn
>> update_sbp(lso_interaction(provision_sbp_dry))
>> update_sbp(lso_interaction(provision_sbp_real))
>> update_bgp(lso_interaction(deploy_bgp_peers_dry))
>> update_bgp(lso_interaction(deploy_bgp_peers_real))
>> resync >> resync
>> done >> done
) )
...@@ -5,19 +5,42 @@ from orchestrator.targets import Target ...@@ -5,19 +5,42 @@ 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.services.lso_client import lso_interaction
from gso.workflows.l3_core_service.base_create_l3_core_service import (
deploy_bgp_peers_dry,
deploy_bgp_peers_real,
provision_sbp_dry,
provision_sbp_real,
)
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,
initial_input_form_generator, initial_input_form_generator,
modify_existing_sbp, modify_existing_sbp,
populate_partner_and_fqdn,
remove_old_sbp, remove_old_sbp,
) )
def modify_lhcone_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
"""Generate the initial input form for modifying the custom attributes of an existing LHC One subscription."""
orig_form_gen = initial_input_form_generator(subscription_id)
initial_user_input = yield from orig_form_gen
class LHCOneExtraForm(FormPage):
update_sbp_config: bool = True
update_bgp_config: bool = True
lhcone_extra = yield LHCOneExtraForm
return initial_user_input | lhcone_extra.model_dump()
@workflow( @workflow(
"Modify LHCOne", "Modify LHCOne",
initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), initial_input_form=wrap_modify_initial_input_form(modify_lhcone_input_form_generator),
target=Target.MODIFY, target=Target.MODIFY,
) )
def modify_lhcone() -> StepList: def modify_lhcone() -> StepList:
...@@ -25,6 +48,8 @@ def modify_lhcone() -> StepList: ...@@ -25,6 +48,8 @@ def modify_lhcone() -> StepList:
access_port_is_added = conditional(lambda state: state["operation"] == Operation.ADD) access_port_is_added = conditional(lambda state: state["operation"] == Operation.ADD)
access_port_is_removed = conditional(lambda state: state["operation"] == Operation.REMOVE) access_port_is_removed = conditional(lambda state: state["operation"] == Operation.REMOVE)
access_port_is_modified = conditional(lambda state: state["operation"] == Operation.EDIT) access_port_is_modified = conditional(lambda state: state["operation"] == Operation.EDIT)
update_sbp = conditional(lambda state: bool(state["update_sbp_config"]))
update_bgp = conditional(lambda state: bool(state["update_bgp_config"]))
return ( return (
begin begin
...@@ -33,6 +58,11 @@ def modify_lhcone() -> StepList: ...@@ -33,6 +58,11 @@ def modify_lhcone() -> StepList:
>> 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)
>> populate_partner_and_fqdn
>> update_sbp(lso_interaction(provision_sbp_dry))
>> update_sbp(lso_interaction(provision_sbp_real))
>> update_bgp(lso_interaction(deploy_bgp_peers_dry))
>> update_bgp(lso_interaction(deploy_bgp_peers_real))
>> resync >> resync
>> done >> done
) )
...@@ -24,8 +24,16 @@ def test_modify_l3_core_service_remove_edge_port_success(faker, l3_core_service_ ...@@ -24,8 +24,16 @@ def test_modify_l3_core_service_remove_edge_port_success(faker, l3_core_service_
if product_name == ProductName.IAS: if product_name == ProductName.IAS:
extra_ias_data = { extra_ias_data = {
"ias_flavor": IASFlavor.IASGWS, "ias_flavor": IASFlavor.IASGWS,
"update_sbp_config": True,
"update_bgp_config": True,
} }
input_form_data.append(extra_ias_data) input_form_data.append(extra_ias_data)
elif product_name in {ProductName.LHCONE, ProductName.GEANT_IP}:
extra_data = {
"update_sbp_config": True,
"update_bgp_config": True,
}
input_form_data.append(extra_data)
elif product_name in {ProductName.R_AND_E_PEER, ProductName.R_AND_E_LHCONE}: elif product_name in {ProductName.R_AND_E_PEER, ProductName.R_AND_E_LHCONE}:
extra_r_and_e_data = { extra_r_and_e_data = {
"v6_bgp_local_preference": 5555, "v6_bgp_local_preference": 5555,
...@@ -101,6 +109,8 @@ def test_modify_l3_core_service_add_new_edge_port_success( ...@@ -101,6 +109,8 @@ def test_modify_l3_core_service_add_new_edge_port_success(
if product_name == ProductName.IAS: if product_name == ProductName.IAS:
extra_ias_data = { extra_ias_data = {
"ias_flavor": IASFlavor.IASGWS, "ias_flavor": IASFlavor.IASGWS,
"update_sbp_config": True,
"update_bgp_config": True,
} }
input_form_data.append(extra_ias_data) input_form_data.append(extra_ias_data)
elif product_name in {ProductName.R_AND_E_PEER, ProductName.R_AND_E_LHCONE}: elif product_name in {ProductName.R_AND_E_PEER, ProductName.R_AND_E_LHCONE}:
...@@ -109,6 +119,12 @@ def test_modify_l3_core_service_add_new_edge_port_success( ...@@ -109,6 +119,12 @@ def test_modify_l3_core_service_add_new_edge_port_success(
"v6_bgp_med": "123123", "v6_bgp_med": "123123",
} }
input_form_data.append(extra_r_and_e_data) input_form_data.append(extra_r_and_e_data)
elif product_name in {ProductName.LHCONE, ProductName.GEANT_IP}:
extra_data = {
"update_sbp_config": True,
"update_bgp_config": True,
}
input_form_data.append(extra_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)
...@@ -201,6 +217,8 @@ def test_modify_l3_core_service_modify_edge_port_success( # noqa: PLR0915 ...@@ -201,6 +217,8 @@ def test_modify_l3_core_service_modify_edge_port_success( # noqa: PLR0915
if product_name == ProductName.IAS: if product_name == ProductName.IAS:
extra_ias_data = { extra_ias_data = {
"ias_flavor": IASFlavor.IASGWS, "ias_flavor": IASFlavor.IASGWS,
"update_sbp_config": True,
"update_bgp_config": True,
} }
input_form_data.append(extra_ias_data) input_form_data.append(extra_ias_data)
elif product_name in {ProductName.R_AND_E_PEER, ProductName.R_AND_E_LHCONE}: elif product_name in {ProductName.R_AND_E_PEER, ProductName.R_AND_E_LHCONE}:
...@@ -209,6 +227,12 @@ def test_modify_l3_core_service_modify_edge_port_success( # noqa: PLR0915 ...@@ -209,6 +227,12 @@ def test_modify_l3_core_service_modify_edge_port_success( # noqa: PLR0915
"v6_bgp_med": "min-igp", "v6_bgp_med": "min-igp",
} }
input_form_data.append(extra_r_and_e_data) input_form_data.append(extra_r_and_e_data)
elif product_name in {ProductName.LHCONE, ProductName.GEANT_IP}:
extra_data = {
"update_sbp_config": True,
"update_bgp_config": True,
}
input_form_data.append(extra_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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment