Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • goat/gap/geant-service-orchestrator
1 result
Show changes
Commits on Source (2)
...@@ -8,8 +8,7 @@ RUN pip install \ ...@@ -8,8 +8,7 @@ RUN pip install \
geant-service-orchestrator==${ARTIFACT_VERSION} geant-service-orchestrator==${ARTIFACT_VERSION}
# Create the directory for the configuration and copy the example config into it # Create the directory for the configuration and copy the example config into it
# NOTE: a real config must be mounted at # NOTE: a real config must be mounted at /etc/gso/config.json when running the container
# /etc/gso/config.json when running the container
RUN mkdir -p /etc/gso RUN mkdir -p /etc/gso
COPY gso/oss-params-example.json /etc/gso/config.json COPY gso/oss-params-example.json /etc/gso/config.json
......
...@@ -14,7 +14,7 @@ from orchestrator.forms import FormPage, ReadOnlyField ...@@ -14,7 +14,7 @@ from orchestrator.forms import FormPage, ReadOnlyField
from orchestrator.forms.validators import Accept, Label, LongText from orchestrator.forms.validators import Accept, Label, LongText
from orchestrator.types import FormGenerator, State, UUIDstr, strEnum from orchestrator.types import FormGenerator, State, UUIDstr, strEnum
from orchestrator.utils.json import json_dumps from orchestrator.utils.json import json_dumps
from orchestrator.workflow import Step, StepList, abort from orchestrator.workflow import Step, StepList, abort, init
from pydantic import validator from pydantic import validator
from gso import settings from gso import settings
...@@ -80,7 +80,9 @@ def _send_request(endpoint: str, parameters: dict, process_id: UUIDstr, operatio ...@@ -80,7 +80,9 @@ def _send_request(endpoint: str, parameters: dict, process_id: UUIDstr, operatio
raise AssertionError(request.content) raise AssertionError(request.content)
def provision_router(subscription: RouterProvisioning, process_id: UUIDstr, dry_run: bool = True) -> None: def provision_router(
subscription: RouterProvisioning, process_id: UUIDstr, tt_number: str, dry_run: bool = True
) -> None:
"""Provision a new router using {term}`LSO`. """Provision a new router using {term}`LSO`.
:param subscription: The subscription object that's to be provisioned. :param subscription: The subscription object that's to be provisioned.
...@@ -91,13 +93,18 @@ def provision_router(subscription: RouterProvisioning, process_id: UUIDstr, dry_ ...@@ -91,13 +93,18 @@ def provision_router(subscription: RouterProvisioning, process_id: UUIDstr, dry_
:type dry_run: bool :type dry_run: bool
:rtype: None :rtype: None
""" """
parameters = {"dry_run": dry_run, "subscription": json.loads(json_dumps(subscription))} parameters = {
"process_id": process_id,
"tt_number": tt_number,
"dry_run": dry_run,
"subscription": json.loads(json_dumps(subscription)),
}
_send_request("router", parameters, process_id, CUDOperation.POST) _send_request("router", parameters, process_id, CUDOperation.POST)
def provision_ip_trunk( def provision_ip_trunk(
subscription: IptrunkProvisioning, process_id: UUIDstr, config_object: str, dry_run: bool = True subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str, config_object: str, dry_run: bool = True
) -> None: ) -> None:
"""Provision an IP trunk service using {term}`LSO`. """Provision an IP trunk service using {term}`LSO`.
...@@ -115,13 +122,15 @@ def provision_ip_trunk( ...@@ -115,13 +122,15 @@ def provision_ip_trunk(
"subscription": json.loads(json_dumps(subscription)), "subscription": json.loads(json_dumps(subscription)),
"dry_run": dry_run, "dry_run": dry_run,
"verb": "deploy", "verb": "deploy",
"tt_number": tt_number,
"process_id": process_id,
"object": config_object, "object": config_object,
} }
_send_request("ip_trunk", parameters, process_id, CUDOperation.POST) _send_request("ip_trunk", parameters, process_id, CUDOperation.POST)
def check_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, check_name: str) -> None: def check_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str, check_name: str) -> None:
"""Provision an IP trunk service using {term}`LSO`. """Provision an IP trunk service using {term}`LSO`.
:param subscription: The subscription object that's to be provisioned. :param subscription: The subscription object that's to be provisioned.
...@@ -133,13 +142,15 @@ def check_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, check ...@@ -133,13 +142,15 @@ def check_ip_trunk(subscription: IptrunkProvisioning, process_id: UUIDstr, check
""" """
parameters = { parameters = {
"subscription": json.loads(json_dumps(subscription)), "subscription": json.loads(json_dumps(subscription)),
"tt_number": tt_number,
"process_id": process_id,
"check_name": check_name, "check_name": check_name,
} }
_send_request("ip_trunk/perform_check", parameters, process_id, CUDOperation.POST) _send_request("ip_trunk/perform_check", parameters, process_id, CUDOperation.POST)
def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, dry_run: bool = True) -> None: def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, tt_number: str, dry_run: bool = True) -> None:
"""Deprovision an IP trunk service using {term}`LSO`. """Deprovision an IP trunk service using {term}`LSO`.
:param subscription: The subscription object that's to be provisioned. :param subscription: The subscription object that's to be provisioned.
...@@ -150,7 +161,13 @@ def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, dry_run: bo ...@@ -150,7 +161,13 @@ def deprovision_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, dry_run: bo
:type dry_run: bool :type dry_run: bool
:rtype: None :rtype: None
""" """
parameters = {"subscription": json.loads(json_dumps(subscription)), "dry_run": dry_run, "verb": "terminate"} parameters = {
"subscription": json.loads(json_dumps(subscription)),
"tt_number": tt_number,
"process_id": process_id,
"dry_run": dry_run,
"verb": "terminate",
}
_send_request("ip_trunk", parameters, process_id, CUDOperation.DELETE) _send_request("ip_trunk", parameters, process_id, CUDOperation.DELETE)
...@@ -162,7 +179,9 @@ def migrate_ip_trunk( ...@@ -162,7 +179,9 @@ def migrate_ip_trunk(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
verb: str, verb: str,
config_object: str,
dry_run: bool = True, dry_run: bool = True,
) -> None: ) -> None:
"""Migrate an IP trunk service using {term}`LSO`. """Migrate an IP trunk service using {term}`LSO`.
...@@ -188,6 +207,8 @@ def migrate_ip_trunk( ...@@ -188,6 +207,8 @@ def migrate_ip_trunk(
""" """
parameters = { parameters = {
"subscription": json.loads(json_dumps(subscription)), "subscription": json.loads(json_dumps(subscription)),
"tt_number": tt_number,
"process_id": process_id,
"new_side": { "new_side": {
"new_node": json.loads(json_dumps(new_node)), "new_node": json.loads(json_dumps(new_node)),
"new_lag_interface": new_lag_interface, "new_lag_interface": new_lag_interface,
...@@ -195,6 +216,7 @@ def migrate_ip_trunk( ...@@ -195,6 +216,7 @@ def migrate_ip_trunk(
"replace_index": replace_index, "replace_index": replace_index,
}, },
"verb": verb, "verb": verb,
"config_object": config_object,
"dry_run": dry_run, "dry_run": dry_run,
} }
...@@ -318,7 +340,7 @@ def pp_interaction(provisioning_step: Step, attempts: int, abort_on_failure: boo ...@@ -318,7 +340,7 @@ def pp_interaction(provisioning_step: Step, attempts: int, abort_on_failure: boo
""" """
should_retry_pp_steps = conditional(lambda state: not state.get("pp_did_succeed")) should_retry_pp_steps = conditional(lambda state: not state.get("pp_did_succeed"))
pp_steps = StepList([_reset_pp_success_state]) pp_steps = init >> _reset_pp_success_state
for _ in range(attempts): for _ in range(attempts):
pp_steps >>= ( pp_steps >>= (
......
{ {
"forms": { "forms": {
"fields": { "fields": {
"tt_number": "Insert the Ticket number that covers this activity",
"confirm": "Confirm", "confirm": "Confirm",
"confirm_info": "Please verify this form looks correct.", "confirm_info": "Please verify this form looks correct.",
......
from logging import getLogger
from orchestrator import step
from orchestrator.types import State
from gso.products.product_types.iptrunk import Iptrunk
logger = getLogger(__name__)
@step("Set ISIS metric to 9000")
def set_isis_to_9000(subscription: Iptrunk) -> State:
old_isis_metric = subscription.iptrunk.iptrunk_isis_metric
subscription.iptrunk.iptrunk_isis_metric = 90000
logger.warning("ISIS metric is only updated in the subscription, not in the real world.")
return {"subscription": subscription, "old_isis_metric": old_isis_metric}
@step("Restore ISIS metric to original value")
def restore_isis_metric(subscription: Iptrunk, old_isis_metric: int) -> State:
subscription.iptrunk.iptrunk_isis_metric = old_isis_metric
logger.warning("ISIS metric is only updated in the subscription, not in the real world.")
return {"subscription": subscription}
...@@ -29,6 +29,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -29,6 +29,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
class Config: class Config:
title = product_name title = product_name
tt_number: str
customer: customer_selector() # type: ignore customer: customer_selector() # type: ignore
geant_s_sid: str geant_s_sid: str
iptrunk_description: str iptrunk_description: str
...@@ -145,8 +146,8 @@ def initialize_subscription( ...@@ -145,8 +146,8 @@ def initialize_subscription(
@step("Provision IP trunk interface [DRY RUN]") @step("Provision IP trunk interface [DRY RUN]")
def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface") provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface")
return { return {
"subscription": subscription, "subscription": subscription,
...@@ -155,28 +156,28 @@ def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, process_id: ...@@ -155,28 +156,28 @@ def provision_ip_trunk_iface_dry(subscription: IptrunkProvisioning, process_id:
@step("Provision IP trunk interface [FOR REAL]") @step("Provision IP trunk interface [FOR REAL]")
def provision_ip_trunk_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: def provision_ip_trunk_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface", False) provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface", False)
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Provisioning a trunk interface, please refresh to get the results of the playbook.", "label_text": "[COMMIT] Provisioning a trunk interface, please refresh to get the results of the playbook.",
} }
@step("Check IP connectivity of the trunk") @step("Check IP connectivity of the trunk")
def check_ip_trunk_connectivity(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: def check_ip_trunk_connectivity(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.check_ip_trunk(subscription, process_id, "ping") provisioning_proxy.check_ip_trunk(subscription, process_id, tt_number, "ping")
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Checking IP traffic flow on the trunk, to get the results of the playbook.", "label_text": "[CHECK] Checking IP traffic flow on the trunk, to get the results of the playbook.",
} }
@step("Provision IP trunk ISIS interface [DRY RUN]") @step("Provision IP trunk ISIS interface [DRY RUN]")
def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface") provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface")
return { return {
"subscription": subscription, "subscription": subscription,
...@@ -185,42 +186,22 @@ def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process ...@@ -185,42 +186,22 @@ def provision_ip_trunk_isis_iface_dry(subscription: IptrunkProvisioning, process
@step("Provision IP trunk ISIS interface [FOR REAL]") @step("Provision IP trunk ISIS interface [FOR REAL]")
def provision_ip_trunk_isis_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: def provision_ip_trunk_isis_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface", False) provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False)
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Provisioning ISIS interfaces, please refresh to get the results of the playbook.", "label_text": "[COMMIT] Provisioning ISIS interfaces, please refresh to get the results of the playbook.",
} }
@step("Check ISIS adjacency") @step("Check ISIS adjacency")
def check_ip_trunk_isis(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State: def check_ip_trunk_isis(subscription: IptrunkProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.check_ip_trunk(subscription, process_id, "isis") provisioning_proxy.check_ip_trunk(subscription, process_id, tt_number, "isis")
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Checking ISIS adjacency, please refresh to get the results of the playbook.", "label_text": "[CHECK] Checking ISIS adjacency, please refresh to get the results of the playbook.",
}
@step("Provision IP trunk LDP interface [DRY RUN]")
def provision_ip_trunk_ldp_iface_dry(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "ldp_interface")
return {
"subscription": subscription,
"label_text": "[DRY RUN] Provisioning LDP interface, please refresh to get the results of the playbook.",
}
@step("Provision IP trunk LDP interface [FOR REAL]")
def provision_ip_trunk_ldp_iface_real(subscription: IptrunkProvisioning, process_id: UUIDstr) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "ldp_interface", False)
return {
"subscription": subscription,
"label_text": "Provisioning LDP interface, please refresh to get the results of the playbook.",
} }
......
...@@ -18,7 +18,7 @@ from gso.products.product_types.iptrunk import Iptrunk ...@@ -18,7 +18,7 @@ from gso.products.product_types.iptrunk import Iptrunk
from gso.products.product_types.router import Router from gso.products.product_types.router import Router
from gso.services import provisioning_proxy from gso.services import provisioning_proxy
from gso.services.provisioning_proxy import pp_interaction from gso.services.provisioning_proxy import pp_interaction
from gso.workflows.iptrunk import restore_isis_metric, set_isis_to_9000 from gso.workflows.iptrunk.utils import set_isis_to_90000
logger = getLogger(__name__) logger = getLogger(__name__)
...@@ -38,10 +38,12 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -38,10 +38,12 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
class Config: class Config:
title = ( title = (
f"Subscription {subscription.iptrunk.geant_s_sid} from " f"Subscription {subscription.iptrunk.geant_s_sid} from "
f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn} to " f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}"
f" to "
f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}" f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}"
) )
tt_number: str
replace_side: ReplacedSide # type: ignore replace_side: ReplacedSide # type: ignore
warning_label: Label = "Are we moving to a different Site?" # type: ignore warning_label: Label = "Are we moving to a different Site?" # type: ignore
migrate_to_different_site: Optional[bool] = False migrate_to_different_site: Optional[bool] = False
...@@ -114,21 +116,6 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -114,21 +116,6 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
return old_side_input.dict() | new_side_input.dict() | {"replace_index": replace_index} return old_side_input.dict() | new_side_input.dict() | {"replace_index": replace_index}
@inputstep("Wait for confirmation", assignee=Assignee.SYSTEM)
def confirm_continue() -> FormGenerator:
class ProvisioningResultPage(FormPage):
class Config:
title = "Please confirm before continuing"
info_label: Label = (
"ISIS metric has been set to 9000, please confirm to continue the workflow when ready." # type: ignore
)
yield ProvisioningResultPage
return {}
@step("[DRY RUN] Disable configuration on old router") @step("[DRY RUN] Disable configuration on old router")
def disable_old_config_dry( def disable_old_config_dry(
subscription: Iptrunk, subscription: Iptrunk,
...@@ -137,6 +124,7 @@ def disable_old_config_dry( ...@@ -137,6 +124,7 @@ def disable_old_config_dry(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
) -> State: ) -> State:
provisioning_proxy.migrate_ip_trunk( provisioning_proxy.migrate_ip_trunk(
subscription, subscription,
...@@ -145,12 +133,14 @@ def disable_old_config_dry( ...@@ -145,12 +133,14 @@ def disable_old_config_dry(
new_lag_member_interfaces, new_lag_member_interfaces,
replace_index, replace_index,
process_id, process_id,
"VERB NEEDS TO BE UPDATED", tt_number,
"deactivate",
"deactivate",
) )
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "[DRY RUN] Migrating old trunk interface, please refresh to get the results of the playbook.", "label_text": "[DRY RUN] Disable config on old node, please refresh to get the results of the playbook.",
} }
...@@ -162,6 +152,7 @@ def disable_old_config_real( ...@@ -162,6 +152,7 @@ def disable_old_config_real(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
) -> State: ) -> State:
provisioning_proxy.migrate_ip_trunk( provisioning_proxy.migrate_ip_trunk(
subscription, subscription,
...@@ -170,15 +161,15 @@ def disable_old_config_real( ...@@ -170,15 +161,15 @@ def disable_old_config_real(
new_lag_member_interfaces, new_lag_member_interfaces,
replace_index, replace_index,
process_id, process_id,
"VERB NEEDS TO BE UPDATED", tt_number,
"deactivate",
"deactivate",
False, False,
) )
logger.warning("Playbook verb is not yet properly set.")
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Migrating old trunk interface, please refresh to get the results of the playbook.", "label_text": "Disable config on the old node, please refresh to get the results of the playbook.",
} }
...@@ -190,6 +181,7 @@ def deploy_new_config_dry( ...@@ -190,6 +181,7 @@ def deploy_new_config_dry(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
) -> State: ) -> State:
provisioning_proxy.migrate_ip_trunk( provisioning_proxy.migrate_ip_trunk(
subscription, subscription,
...@@ -198,7 +190,9 @@ def deploy_new_config_dry( ...@@ -198,7 +190,9 @@ def deploy_new_config_dry(
new_lag_member_interfaces, new_lag_member_interfaces,
replace_index, replace_index,
process_id, process_id,
"VERB NEEDS TO BE UPDATED", tt_number,
"deploy",
"trunk_interface",
) )
logger.warning("Playbook verb is not yet properly set.") logger.warning("Playbook verb is not yet properly set.")
...@@ -217,6 +211,7 @@ def deploy_new_config_real( ...@@ -217,6 +211,7 @@ def deploy_new_config_real(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
) -> State: ) -> State:
provisioning_proxy.migrate_ip_trunk( provisioning_proxy.migrate_ip_trunk(
subscription, subscription,
...@@ -225,7 +220,9 @@ def deploy_new_config_real( ...@@ -225,7 +220,9 @@ def deploy_new_config_real(
new_lag_member_interfaces, new_lag_member_interfaces,
replace_index, replace_index,
process_id, process_id,
"VERB NEEDS TO BE UPDATED", tt_number,
"deploy",
"trunk_interface",
False, False,
) )
...@@ -233,38 +230,29 @@ def deploy_new_config_real( ...@@ -233,38 +230,29 @@ def deploy_new_config_real(
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Deploying new trunk interface, please refresh to get the results of the playbook.", "label_text": "[COMMIT] Deploying new trunk interface, please refresh to get the results of the playbook.",
} }
@step("Run interface checks") @inputstep("Wait for confirmation", assignee=Assignee.SYSTEM)
def run_interface_checks( def confirm_continue_move_fiber() -> FormGenerator:
subscription: Iptrunk, class ProvisioningResultPage(FormPage):
new_node: Router, class Config:
new_lag_interface: str, title = "Please confirm before continuing"
new_lag_member_interfaces: list[str],
replace_index: int,
process_id: UUIDstr,
) -> State:
provisioning_proxy.migrate_ip_trunk(
subscription,
new_node,
new_lag_interface,
new_lag_member_interfaces,
replace_index,
process_id,
"MIGRATION_INTERFACE_CHECK",
)
logger.warning("Playbook verb is not yet properly set.") info_label: Label = (
"New Trunk interface has been deployed, wait for the physical connection to be moved" # type: ignore
)
return { yield ProvisioningResultPage
"subscription": subscription,
"label_text": "Running checks on the new trunk interface, please refresh to get the results of the playbook.",
}
return {}
@step("Deploy configuration on new router")
# Interface checks go here
@step("Deploy ISIS configuration on new router")
def deploy_new_isis( def deploy_new_isis(
subscription: Iptrunk, subscription: Iptrunk,
new_node: Router, new_node: Router,
...@@ -272,6 +260,7 @@ def deploy_new_isis( ...@@ -272,6 +260,7 @@ def deploy_new_isis(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
) -> State: ) -> State:
provisioning_proxy.migrate_ip_trunk( provisioning_proxy.migrate_ip_trunk(
subscription, subscription,
...@@ -280,7 +269,9 @@ def deploy_new_isis( ...@@ -280,7 +269,9 @@ def deploy_new_isis(
new_lag_member_interfaces, new_lag_member_interfaces,
replace_index, replace_index,
process_id, process_id,
"VERB NEEDS TO BE UPDATED", tt_number,
"deploy",
"isis_interface",
False, False,
) )
...@@ -288,20 +279,44 @@ def deploy_new_isis( ...@@ -288,20 +279,44 @@ def deploy_new_isis(
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Updating new ISIS metric, please refresh to get the results of the playbook.", "label_text": "Deploy ISIS config on the new router, please refresh to get the results of the playbook.",
} }
@step("Check ISIS metric") # Leaving it like this as a placeholder
def check_isis(subscription: Iptrunk, process_id: UUIDstr) -> State: # @step("Check ISIS metric")
provisioning_proxy.check_ip_trunk(subscription, process_id, "VERB NEEDS TO BE UPDATED") # def check_isis(subscription: Iptrunk, process_id: UUIDstr) -> State:
# provisioning_proxy.check_ip_trunk(subscription, process_id, "VERB NEEDS TO BE UPDATED")
#
# logger.warning("Playbook verb is not yet properly set.")
#
# return {
# "subscription": subscription,
# "label_text": "Checking ISIS functionality, please refresh to get the results of the playbook.",
# }
logger.warning("Playbook verb is not yet properly set.")
return { @inputstep("Wait for confirmation", assignee=Assignee.SYSTEM)
"subscription": subscription, def confirm_continue_restore_isis() -> FormGenerator:
"label_text": "Checking ISIS functionality, please refresh to get the results of the playbook.", class ProvisioningResultPage(FormPage):
} class Config:
title = "Please confirm before continuing"
info_label: Label = (
"ISIS config has been deployed, confirm if you want to restore the old metric" # type: ignore
)
yield ProvisioningResultPage
return {}
@step("Restore ISIS metric to original value")
def restore_isis_metric(subscription: Iptrunk, process_id: UUIDstr, tt_number: str, old_isis_metric: int) -> State:
subscription.iptrunk.iptrunk_isis_metric = old_isis_metric
provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False)
return {"subscription": subscription}
@step("[DRY RUN] Delete configuration on old router") @step("[DRY RUN] Delete configuration on old router")
...@@ -312,6 +327,7 @@ def delete_old_config_dry( ...@@ -312,6 +327,7 @@ def delete_old_config_dry(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
) -> State: ) -> State:
provisioning_proxy.migrate_ip_trunk( provisioning_proxy.migrate_ip_trunk(
subscription, subscription,
...@@ -320,7 +336,9 @@ def delete_old_config_dry( ...@@ -320,7 +336,9 @@ def delete_old_config_dry(
new_lag_member_interfaces, new_lag_member_interfaces,
replace_index, replace_index,
process_id, process_id,
"VERB NEEDS TO BE UPDATED", tt_number,
"delete",
"delete",
) )
logger.warning("Playbook verb is not yet properly set.") logger.warning("Playbook verb is not yet properly set.")
...@@ -340,6 +358,7 @@ def delete_old_config_real( ...@@ -340,6 +358,7 @@ def delete_old_config_real(
new_lag_member_interfaces: list[str], new_lag_member_interfaces: list[str],
replace_index: int, replace_index: int,
process_id: UUIDstr, process_id: UUIDstr,
tt_number: str,
) -> State: ) -> State:
provisioning_proxy.migrate_ip_trunk( provisioning_proxy.migrate_ip_trunk(
subscription, subscription,
...@@ -348,7 +367,9 @@ def delete_old_config_real( ...@@ -348,7 +367,9 @@ def delete_old_config_real(
new_lag_member_interfaces, new_lag_member_interfaces,
replace_index, replace_index,
process_id, process_id,
"VERB NEEDS TO BE UPDATED", tt_number,
"delete",
"delete",
False, False,
) )
...@@ -392,18 +413,15 @@ def migrate_iptrunk() -> StepList: ...@@ -392,18 +413,15 @@ def migrate_iptrunk() -> StepList:
init init
>> store_process_subscription(Target.MODIFY) >> store_process_subscription(Target.MODIFY)
>> unsync >> unsync
>> set_isis_to_9000 >> pp_interaction(set_isis_to_90000, 3)
>> confirm_continue
>> pp_interaction(disable_old_config_dry, 3) >> pp_interaction(disable_old_config_dry, 3)
>> pp_interaction(disable_old_config_real, 3) >> pp_interaction(disable_old_config_real, 3)
>> pp_interaction(deploy_new_config_dry, 3) >> pp_interaction(deploy_new_config_dry, 3)
>> pp_interaction(deploy_new_config_real, 3) >> pp_interaction(deploy_new_config_real, 3)
>> confirm_continue >> confirm_continue_move_fiber
>> pp_interaction(run_interface_checks, 3, False)
>> pp_interaction(deploy_new_isis, 3) >> pp_interaction(deploy_new_isis, 3)
>> pp_interaction(check_isis, 3, False) >> confirm_continue_restore_isis
>> confirm_continue >> pp_interaction(restore_isis_metric, 3)
>> restore_isis_metric
>> pp_interaction(delete_old_config_dry, 3) >> pp_interaction(delete_old_config_dry, 3)
>> pp_interaction(delete_old_config_real, 3) >> pp_interaction(delete_old_config_real, 3)
>> update_ipam >> update_ipam
......
...@@ -14,6 +14,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -14,6 +14,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
subscription = Iptrunk.from_subscription(subscription_id) subscription = Iptrunk.from_subscription(subscription_id)
class ModifyIptrunkForm(FormPage): class ModifyIptrunkForm(FormPage):
tt_number: str
isis_metric: int = subscription.iptrunk.iptrunk_isis_metric isis_metric: int = subscription.iptrunk.iptrunk_isis_metric
user_input = yield ModifyIptrunkForm user_input = yield ModifyIptrunkForm
...@@ -29,8 +30,8 @@ def modify_iptrunk_subscription(subscription: Iptrunk, isis_metric: int) -> Stat ...@@ -29,8 +30,8 @@ def modify_iptrunk_subscription(subscription: Iptrunk, isis_metric: int) -> Stat
@step("Provision IP trunk ISIS interface [DRY RUN]") @step("Provision IP trunk ISIS interface [DRY RUN]")
def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> State: def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface") provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface")
return { return {
"subscription": subscription, "subscription": subscription,
...@@ -40,8 +41,8 @@ def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr ...@@ -40,8 +41,8 @@ def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr
@step("Provision IP trunk ISIS interface [FOR REAL]") @step("Provision IP trunk ISIS interface [FOR REAL]")
def provision_ip_trunk_isis_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> State: def provision_ip_trunk_isis_iface_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface", False) provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False)
return { return {
"subscription": subscription, "subscription": subscription,
......
...@@ -19,6 +19,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -19,6 +19,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
subscription = Iptrunk.from_subscription(subscription_id) subscription = Iptrunk.from_subscription(subscription_id)
class ModifyIptrunkForm(FormPage): class ModifyIptrunkForm(FormPage):
tt_number: str
geant_s_sid: str = subscription.iptrunk.geant_s_sid geant_s_sid: str = subscription.iptrunk.geant_s_sid
iptrunk_description: str = subscription.iptrunk.iptrunk_description iptrunk_description: str = subscription.iptrunk.iptrunk_description
iptrunk_type: IptrunkType = subscription.iptrunk.iptrunk_type iptrunk_type: IptrunkType = subscription.iptrunk.iptrunk_type
...@@ -38,9 +39,9 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -38,9 +39,9 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
title = "Provide subscription details for side A of the trunk." title = "Provide subscription details for side A of the trunk."
iptrunk_sideA_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn) iptrunk_sideA_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn)
iptrunk_sideA_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_ae_iface) iptrunk_sideA_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface)
iptrunk_sideA_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid iptrunk_sideA_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_geant_a_sid
iptrunk_sideA_ae_members: AeMembersListA = subscription.iptrunk.iptrunk_sideA_ae_members # type: ignore iptrunk_sideA_ae_members: AeMembersListA = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members
iptrunk_sideA_ae_members_descriptions: AeMembersListA = subscription.iptrunk.iptrunk_sides[ iptrunk_sideA_ae_members_descriptions: AeMembersListA = subscription.iptrunk.iptrunk_sides[
0 0
].iptrunk_side_ae_members_description ].iptrunk_side_ae_members_description
...@@ -58,7 +59,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -58,7 +59,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
iptrunk_sideB_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn) iptrunk_sideB_node: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn)
iptrunk_sideB_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface) iptrunk_sideB_ae_iface: str = ReadOnlyField(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface)
iptrunk_sideB_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_geant_a_sid iptrunk_sideB_ae_geant_a_sid: str = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_geant_a_sid
iptrunk_sideB_ae_members: AeMembersListB = subscription.iptrunk.iptrunk_sideB_ae_members # type: ignore iptrunk_sideB_ae_members: AeMembersListB = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members
iptrunk_sideB_ae_members_descriptions: AeMembersListB = subscription.iptrunk.iptrunk_sides[ iptrunk_sideB_ae_members_descriptions: AeMembersListB = subscription.iptrunk.iptrunk_sides[
1 1
].iptrunk_side_ae_members_description ].iptrunk_side_ae_members_description
...@@ -103,8 +104,8 @@ def modify_iptrunk_subscription( ...@@ -103,8 +104,8 @@ def modify_iptrunk_subscription(
@step("Provision IP trunk interface [DRY RUN]") @step("Provision IP trunk interface [DRY RUN]")
def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> State: def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface") provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface")
return { return {
"subscription": subscription, "subscription": subscription,
...@@ -113,8 +114,8 @@ def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> ...@@ -113,8 +114,8 @@ def provision_ip_trunk_iface_dry(subscription: Iptrunk, process_id: UUIDstr) ->
@step("Provision IP trunk interface [FOR REAL]") @step("Provision IP trunk interface [FOR REAL]")
def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> State: def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "trunk_interface", False) provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "trunk_interface", False)
return { return {
"subscription": subscription, "subscription": subscription,
...@@ -122,26 +123,6 @@ def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> ...@@ -122,26 +123,6 @@ def provision_ip_trunk_iface_real(subscription: Iptrunk, process_id: UUIDstr) ->
} }
@step("Provision IP trunk LLDP interface [DRY RUN]")
def provision_ip_trunk_lldp_iface_dry(subscription: Iptrunk, process_id: UUIDstr) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "lldp_interface")
return {
"subscription": subscription,
"label_text": "[DRY RUN] Provisioning LLDP interface, please refresh to get the results of the playbook.",
}
@step("Provision IP trunk LLDP interface [FOR REAL]")
def provision_ip_trunk_lldp_iface_real(subscription: Iptrunk, process_id: UUIDstr) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "lldp_interface", False)
return {
"subscription": subscription,
"label_text": "Provisioning LLDP interface, please refresh to get the results of the playbook.",
}
@workflow( @workflow(
"Modify IP Trunk interface", "Modify IP Trunk interface",
initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
...@@ -155,8 +136,6 @@ def modify_trunk_interface() -> StepList: ...@@ -155,8 +136,6 @@ def modify_trunk_interface() -> StepList:
>> modify_iptrunk_subscription >> modify_iptrunk_subscription
>> pp_interaction(provision_ip_trunk_iface_dry, 3) >> pp_interaction(provision_ip_trunk_iface_dry, 3)
>> pp_interaction(provision_ip_trunk_iface_real, 3) >> pp_interaction(provision_ip_trunk_iface_real, 3)
>> pp_interaction(provision_ip_trunk_lldp_iface_dry, 3)
>> pp_interaction(provision_ip_trunk_lldp_iface_real, 3)
>> resync >> resync
>> done >> done
) )
...@@ -7,11 +7,11 @@ from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUID ...@@ -7,11 +7,11 @@ from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUID
from orchestrator.workflow import StepList, conditional, done, init, step, workflow from orchestrator.workflow import StepList, conditional, done, init, step, workflow
from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync from orchestrator.workflows.steps import resync, set_status, 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 workflows.iptrunk import set_isis_to_9000
from gso.products.product_types.iptrunk import Iptrunk from gso.products.product_types.iptrunk import Iptrunk
from gso.services import infoblox, provisioning_proxy from gso.services import infoblox, provisioning_proxy
from gso.services.provisioning_proxy import pp_interaction from gso.services.provisioning_proxy import pp_interaction
from gso.workflows.iptrunk.utils import set_isis_to_90000
def initial_input_form_generator() -> FormGenerator: def initial_input_form_generator() -> FormGenerator:
...@@ -20,6 +20,7 @@ def initial_input_form_generator() -> FormGenerator: ...@@ -20,6 +20,7 @@ def initial_input_form_generator() -> FormGenerator:
"Please confirm whether configuration should get removed from the A and B sides of the trunk, and whether " "Please confirm whether configuration should get removed from the A and B sides of the trunk, and whether "
"IPAM resources should be released." # type: ignore "IPAM resources should be released." # type: ignore
) )
tt_number: str
remove_configuration: bool = True remove_configuration: bool = True
clean_up_ipam: bool = True clean_up_ipam: bool = True
...@@ -28,8 +29,8 @@ def initial_input_form_generator() -> FormGenerator: ...@@ -28,8 +29,8 @@ def initial_input_form_generator() -> FormGenerator:
@step("Drain traffic from trunk") @step("Drain traffic from trunk")
def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr) -> State: def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, "isis_interface", False) provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False)
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "This is setting the ISIS metric of the trunk to 9000. Press refresh to get the results." "label_text": "This is setting the ISIS metric of the trunk to 9000. Press refresh to get the results."
...@@ -38,8 +39,8 @@ def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr) -> S ...@@ -38,8 +39,8 @@ def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr) -> S
@step("Deprovision IP trunk [DRY RUN]") @step("Deprovision IP trunk [DRY RUN]")
def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr) -> State: def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.deprovision_ip_trunk(subscription, process_id, True) provisioning_proxy.deprovision_ip_trunk(subscription, process_id, tt_number, True)
return { return {
"subscription": subscription, "subscription": subscription,
...@@ -48,12 +49,12 @@ def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr) -> Stat ...@@ -48,12 +49,12 @@ def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr) -> Stat
@step("Deprovision IP trunk [FOR REAL]") @step("Deprovision IP trunk [FOR REAL]")
def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr) -> State: def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.deprovision_ip_trunk(subscription, process_id, False) provisioning_proxy.deprovision_ip_trunk(subscription, process_id, tt_number, False)
return { return {
"subscription": subscription, "subscription": subscription,
"label_text": "Terminating IP trunk, please refresh to get the results of the playbook.", "label_text": "[COMMIT] Terminating IP trunk, please refresh to get the results of the playbook.",
} }
...@@ -81,12 +82,12 @@ def terminate_iptrunk() -> StepList: ...@@ -81,12 +82,12 @@ def terminate_iptrunk() -> StepList:
run_ipam_steps = conditional(lambda state: state["clean_up_ipam"]) run_ipam_steps = conditional(lambda state: state["clean_up_ipam"])
config_steps = ( config_steps = (
StepList([set_isis_to_9000]) init
>> pp_interaction(drain_traffic_from_ip_trunk, 3) >> pp_interaction(set_isis_to_90000, 3)
>> pp_interaction(deprovision_ip_trunk_dry, 3) >> pp_interaction(deprovision_ip_trunk_dry, 3)
>> pp_interaction(deprovision_ip_trunk_real, 3) >> pp_interaction(deprovision_ip_trunk_real, 3)
) )
ipam_steps = StepList([deprovision_ip_trunk_ipv4, deprovision_ip_trunk_ipv6]) ipam_steps = init >> deprovision_ip_trunk_ipv4 >> deprovision_ip_trunk_ipv6
return ( return (
init init
......
from orchestrator import step
from orchestrator.types import State, UUIDstr
from gso.products.product_types.iptrunk import Iptrunk
from gso.services import provisioning_proxy
@step("[COMMIT] Set ISIS metric to 90000")
def set_isis_to_90000(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
old_isis_metric = subscription.iptrunk.iptrunk_isis_metric
subscription.iptrunk.iptrunk_isis_metric = 90000
provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False)
return {
"subscription": subscription,
"old_isis_metric": old_isis_metric,
"label_text": "ISIS is being set to 90K by the provisioning proxy, please wait for the results",
}
...@@ -36,13 +36,14 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -36,13 +36,14 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
class Config: class Config:
title = product_name title = product_name
tt_number: str
customer: customer_selector() # type: ignore customer: customer_selector() # type: ignore
router_site: _site_selector() # type: ignore router_site: _site_selector() # type: ignore
hostname: str hostname: str
ts_port: PortNumber ts_port: PortNumber
router_vendor: RouterVendor router_vendor: RouterVendor
router_role: RouterRole router_role: RouterRole
is_ias_connected: bool | None is_ias_connected: bool | None = False
@validator("hostname", allow_reuse=True) @validator("hostname", allow_reuse=True)
def hostname_must_be_available(cls, hostname: str, **kwargs: dict[str, Any]) -> str: def hostname_must_be_available(cls, hostname: str, **kwargs: dict[str, Any]) -> str:
...@@ -128,8 +129,8 @@ def ipam_allocate_ias_networks(subscription: RouterProvisioning) -> State: ...@@ -128,8 +129,8 @@ def ipam_allocate_ias_networks(subscription: RouterProvisioning) -> State:
@step("Provision router [DRY RUN]") @step("Provision router [DRY RUN]")
def provision_router_dry(subscription: RouterProvisioning, process_id: UUIDstr) -> State: def provision_router_dry(subscription: RouterProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_router(subscription, process_id) provisioning_proxy.provision_router(subscription, process_id, tt_number)
return { return {
"subscription": subscription, "subscription": subscription,
...@@ -141,8 +142,8 @@ def provision_router_dry(subscription: RouterProvisioning, process_id: UUIDstr) ...@@ -141,8 +142,8 @@ def provision_router_dry(subscription: RouterProvisioning, process_id: UUIDstr)
@step("Provision router [FOR REAL]") @step("Provision router [FOR REAL]")
def provision_router_real(subscription: RouterProvisioning, process_id: UUIDstr) -> State: def provision_router_real(subscription: RouterProvisioning, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_router(subscription, process_id, False) provisioning_proxy.provision_router(subscription, process_id, tt_number, False)
return { return {
"subscription": subscription, "subscription": subscription,
......
...@@ -23,6 +23,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ...@@ -23,6 +23,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
"Please confirm whether configuration should get removed from the router, and whether IPAM resources should" "Please confirm whether configuration should get removed from the router, and whether IPAM resources should"
" be released." # type: ignore " be released." # type: ignore
) )
tt_number: str
remove_configuration: bool = True remove_configuration: bool = True
clean_up_ipam: bool = True clean_up_ipam: bool = True
...@@ -68,9 +69,7 @@ def terminate_router() -> StepList: ...@@ -68,9 +69,7 @@ def terminate_router() -> StepList:
run_ias_removal = conditional(lambda state: state["subscription"]["router"]["router_is_ias_connected"]) run_ias_removal = conditional(lambda state: state["subscription"]["router"]["router_is_ias_connected"])
ipam_steps = ( ipam_steps = (
StepList([deprovision_loopback_ips]) init >> deprovision_loopback_ips >> run_ias_removal(deprovision_si_ips) >> run_ias_removal(deprovision_lt_ips)
>> run_ias_removal(deprovision_si_ips)
>> run_ias_removal(deprovision_lt_ips)
) )
return ( return (
......