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 (21)
Showing
with 240 additions and 91 deletions
# Changelog
All notable changes to this project will be documented in this file.
## [0.9] - 2024-03-20
- `migrate_iptrunk` workflow includes Ansible trunk checks.
- `create_iptrunk` and `migrate_iptrunk` now update IPAM / DNS.
- lso result step title is now always the name of the provisioning step
## [0.8] - 2024-02-28
- Add two new workflows for "activating" `Router` and `Iptrunk` products.
......
......@@ -15,6 +15,6 @@ Submodules
crm
infoblox
librenms_client
lso_client
netbox_client
provisioning_proxy
subscriptions
``gso.services.lso_client``
===========================
.. automodule:: gso.services.lso_client
:members:
:show-inheritance:
``gso.services.provisioning_proxy``
===================================
.. automodule:: gso.services.provisioning_proxy
:members:
:show-inheritance:
``gso.workflows.router.modify_connection_strategy``
=========================================
.. automodule:: gso.workflows.router.modify_connection_strategy
:members:
:show-inheritance:
......@@ -33,18 +33,19 @@ class PartnerTable(BaseModel):
__tablename__ = "partners"
partner_id = mapped_column(String, server_default=text("uuid_generate_v4"), primary_key=True)
name = mapped_column(String, unique=True)
email = mapped_column(String, unique=True, nullable=True)
name = mapped_column(String, unique=True, nullable=True)
email = mapped_column(String, unique=True, nullable=False)
partner_type = mapped_column(Enum(PartnerType), nullable=False)
as_number = mapped_column(
String, unique=True
String, unique=True, nullable=True
) # the as_number and as_set are mutually exclusive. if you give me one I don't need the other
as_set = mapped_column(String)
as_set = mapped_column(String, nullable=True)
route_set = mapped_column(String, nullable=True)
black_listed_as_sets = mapped_column(ARRAY(String), nullable=True)
additional_routers = mapped_column(ARRAY(String), nullable=True)
additional_bgp_speakers = mapped_column(ARRAY(String), nullable=True)
partner_type = mapped_column(Enum(PartnerType), nullable=False)
created_at = mapped_column(UtcTimestamp, server_default=text("current_timestamp"), nullable=False)
updated_at = mapped_column(
UtcTimestamp, server_default=text("current_timestamp"), nullable=False, onupdate=text("current_timestamp")
......
......@@ -11,7 +11,7 @@ from alembic import op
# revision identifiers, used by Alembic.
revision = 'e8378fbcfbf3'
down_revision = 'da5c9f4cce1c'
branch_labels = ('data',)
branch_labels = None
depends_on = None
......
"""Edit Partner table, Making some fields required.
Revision ID: d61c0f92da1e
Revises: eaed66b04913
Create Date: 2024-03-20 12:29:24.145489
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = 'd61c0f92da1e'
down_revision = 'eaed66b04913'
branch_labels = None
depends_on = None
def upgrade() -> None:
conn = op.get_bind()
conn.execute(
sa.text(
"""UPDATE partners SET email = 'goat@geant.org' WHERE name='GEANT'"""))
op.alter_column('partners', 'email', existing_type=sa.String(), nullable=False)
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('partners', 'email', existing_type=sa.String(), nullable=True)
# ### end Alembic commands ###
"""Modify connection streategy workflow..
Revision ID: a2cd3f2e6d7a
Revises:
Create Date: 2024-03-21 16:05:59.043106
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = 'a2cd3f2e6d7a'
down_revision = None
branch_labels = None
depends_on = 'd61c0f92da1e'
from orchestrator.migrations.helpers import create_workflow, delete_workflow
new_workflows = [
{
"name": "modify_connection_strategy",
"target": "MODIFY",
"description": "Modify connection strategy",
"product_type": "Router"
}
]
def upgrade() -> None:
conn = op.get_bind()
for workflow in new_workflows:
create_workflow(conn, workflow)
def downgrade() -> None:
conn = op.get_bind()
for workflow in new_workflows:
delete_workflow(conn, workflow["name"])
"""The Provisioning Proxy service, which interacts with :term:`LSO` running externally.
"""The :term:`LSO` client, which interacts with :term:`LSO` running externally.
:term:`LSO` is responsible for executing Ansible playbooks, that deploy subscriptions.
"""
......@@ -15,7 +15,7 @@ from orchestrator.utils.errors import ProcessFailureError
from orchestrator.workflow import Step, StepList, begin, callback_step, inputstep
from pydantic_forms.core import FormPage, ReadOnlyField
from pydantic_forms.types import FormGenerator
from pydantic_forms.validators import LongText
from pydantic_forms.validators import Label, LongText
from gso import settings
......@@ -33,7 +33,7 @@ def _send_request(parameters: dict, callback_route: str) -> None:
:rtype: None
"""
oss = settings.load_oss_params()
pp_params = oss.PROVISIONING_PROXY
params = oss.PROVISIONING_PROXY
# Build up a callback URL of the Provisioning Proxy to return its results to.
callback_url = f"{oss.GENERAL.public_hostname}{callback_route}"
......@@ -41,7 +41,7 @@ def _send_request(parameters: dict, callback_route: str) -> None:
logger.debug(debug_msg)
parameters.update({"callback": callback_url})
url = f"{pp_params.scheme}://{pp_params.api_base}/api/playbook"
url = f"{params.scheme}://{params.api_base}/api/playbook"
request = requests.post(url, json=parameters, timeout=10)
request.raise_for_status()
......@@ -107,7 +107,7 @@ def execute_playbook(
@step("Evaluate provisioning proxy result")
def _evaluate_pp_results(callback_result: dict) -> State:
def _evaluate_results(callback_result: dict) -> State:
if callback_result["return_code"] != 0:
raise ProcessFailureError(message="Provisioning proxy failure", details=callback_result)
......@@ -115,34 +115,40 @@ def _evaluate_pp_results(callback_result: dict) -> State:
@step("Ignore provisioning proxy result")
def _ignore_pp_results(callback_result: dict) -> State:
def _ignore_results(callback_result: dict) -> State:
return {"callback_result": callback_result}
@inputstep("Confirm provisioning proxy results", assignee=Assignee("SYSTEM"))
def _show_pp_results(state: State) -> FormGenerator:
def _show_results(state: State) -> FormGenerator:
if "callback_result" not in state:
return state
class ConfirmRunPage(FormPage):
class Config:
title: str = f"Execution for {state['subscription']['product']['name']} completed."
title: str = state["lso_result_title"]
if "lso_result_extra_label" in state:
extra_label: Label = state["lso_result_extra_label"]
run_status: str = ReadOnlyField(state["callback_result"]["status"])
run_results: LongText = ReadOnlyField(json.dumps(state["callback_result"], indent=4))
yield ConfirmRunPage
state.pop("run_results")
[state.pop(key, None) for key in ["run_results", "lso_result_title", "lso_result_extra_label"]]
return state
def pp_interaction(provisioning_step: Step) -> StepList:
def lso_interaction(provisioning_step: Step) -> StepList:
"""Interact with the provisioning proxy :term:`LSO` using a callback step.
An asynchronous interaction with the provisioning proxy. This is an external system that executes Ansible playbooks
to provision service subscriptions. If the playbook fails, this step will also fail, allowing for the user to retry
provisioning from the UI.
Optionally, the keys ``lso_result_title`` and ``lso_result_extra_label`` can be added to the state before running
this interaction. They will be used to customise the input step that shows the outcome of the :term:`LSO`
interaction.
:param provisioning_step: A workflow step that performs an operation remotely using the provisioning proxy.
:type provisioning_step: :class:`Step`
:return: A list of steps that is executed as part of the workflow.
......@@ -150,20 +156,17 @@ def pp_interaction(provisioning_step: Step) -> StepList:
"""
return (
begin
>> callback_step(
name=provisioning_step.name,
action_step=provisioning_step,
validate_step=_evaluate_pp_results,
)
>> _show_pp_results
>> callback_step(name=provisioning_step.name, action_step=provisioning_step, validate_step=_evaluate_results)
>> step("Inject result title")(lambda: {"lso_result_title": provisioning_step.name})
>> _show_results
)
def indifferent_pp_interaction(provisioning_step: Step) -> StepList:
def indifferent_lso_interaction(provisioning_step: Step) -> StepList:
"""Interact with the provisioning proxy :term:`LSO` using a callback step.
This interaction is identical from the one described in ``pp_interaction()``, with one functional difference.
Whereas the ``pp_interaction()`` will make the workflow step fail on unsuccessful interaction, this step will not.
This interaction is identical from the one described in ``lso_interaction()``, with one functional difference.
Whereas the ``lso_interaction()`` will make the workflow step fail on unsuccessful interaction, this step will not.
It is therefore indifferent about the outcome of the Ansible playbook that is executed.
.. warning::
......@@ -177,10 +180,7 @@ def indifferent_pp_interaction(provisioning_step: Step) -> StepList:
"""
return (
begin
>> callback_step(
name=provisioning_step.name,
action_step=provisioning_step,
validate_step=_ignore_pp_results,
)
>> _show_pp_results
>> callback_step(name=provisioning_step.name, action_step=provisioning_step, validate_step=_ignore_results)
>> step("Inject result title")(lambda: {"lso_result_title": provisioning_step.name})
>> _show_results
)
......@@ -19,3 +19,10 @@ class PortNumber(ConstrainedInt):
gt = 0
le = 49151
class ConnectionStrategy(strEnum):
"""An enumerator for the connection Strategies."""
IN_BAND = "IN BAND"
OUT_OF_BAND = "OUT OF BAND"
......@@ -8,7 +8,7 @@ from orchestrator.types import State, UUIDstr
from orchestrator.utils.json import json_dumps
from gso.products.product_types.iptrunk import Iptrunk
from gso.services.provisioning_proxy import execute_playbook
from gso.services.lso_client import execute_playbook
from gso.settings import load_oss_params
......@@ -63,7 +63,7 @@ def deploy_base_config_real(
return {"subscription": subscription}
@step("[COMMIT] Set ISIS metric to very high value")
@step("[FOR REAL] Set ISIS metric to very high value")
def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route: str, tt_number: str) -> State:
"""Workflow step for setting the :term:`ISIS` metric to an arbitrarily high value to drain a link."""
old_isis_metric = subscription.iptrunk.iptrunk_isis_metric
......@@ -92,7 +92,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route:
}
@step("[CHECK] Run show commands after base config install")
@step("Run show commands after base config install")
def run_checks_after_base_config(subscription: dict[str, Any], callback_route: str) -> None:
"""Workflow step for running show commands after installing base config."""
execute_playbook(
......
......@@ -26,6 +26,7 @@ LazyWorkflowInstance("gso.workflows.router.create_router", "create_router")
LazyWorkflowInstance("gso.workflows.router.redeploy_base_config", "redeploy_base_config")
LazyWorkflowInstance("gso.workflows.router.terminate_router", "terminate_router")
LazyWorkflowInstance("gso.workflows.router.update_ibgp_mesh", "update_ibgp_mesh")
LazyWorkflowInstance("gso.workflows.router.modify_connection_strategy", "modify_connection_strategy")
LazyWorkflowInstance("gso.workflows.site.create_site", "create_site")
LazyWorkflowInstance("gso.workflows.site.modify_site", "modify_site")
LazyWorkflowInstance("gso.workflows.site.terminate_site", "terminate_site")
......
......@@ -25,9 +25,9 @@ from gso.products.product_blocks.iptrunk import (
from gso.products.product_types.iptrunk import IptrunkInactive, IptrunkProvisioning
from gso.products.product_types.router import Router
from gso.services import infoblox, subscriptions
from gso.services.lso_client import execute_playbook, lso_interaction
from gso.services.netbox_client import NetboxClient
from gso.services.partners import get_partner_by_name
from gso.services.provisioning_proxy import execute_playbook, pp_interaction
from gso.settings import load_oss_params
from gso.utils.helpers import (
LAGMember,
......@@ -253,7 +253,7 @@ def initialize_subscription(
return {"subscription": subscription}
@step("Provision IP trunk interface [DRY RUN]")
@step("[DRY RUN] Provision IP trunk interface")
def provision_ip_trunk_iface_dry(
subscription: IptrunkInactive,
callback_route: str,
......@@ -281,7 +281,7 @@ def provision_ip_trunk_iface_dry(
return {"subscription": subscription}
@step("Provision IP trunk interface [FOR REAL]")
@step("[FOR REAL] Provision IP trunk interface")
def provision_ip_trunk_iface_real(
subscription: IptrunkInactive,
callback_route: str,
......@@ -327,7 +327,7 @@ def check_ip_trunk_connectivity(
return {"subscription": subscription}
@step("Provision IP trunk ISIS interface [DRY RUN]")
@step("[DRY RUN] Provision IP trunk ISIS interface")
def provision_ip_trunk_isis_iface_dry(
subscription: IptrunkInactive,
callback_route: str,
......@@ -355,7 +355,7 @@ def provision_ip_trunk_isis_iface_dry(
return {"subscription": subscription}
@step("Provision IP trunk ISIS interface [FOR REAL]")
@step("[FOR REAL] Provision IP trunk ISIS interface")
def provision_ip_trunk_isis_iface_real(
subscription: IptrunkInactive,
callback_route: str,
......@@ -403,7 +403,7 @@ def check_ip_trunk_isis(
@step("Register DNS records for both sides of the trunk")
def register_dns_records(subscription: IptrunkInactive) -> State:
"""Register :term: `DNS` records for both sides of the newly created IPtrunk."""
"""Register :term:`DNS` records for both sides of the newly created IPtrunk."""
for index, side in enumerate(subscription.iptrunk.iptrunk_sides):
fqdn = f"{side.iptrunk_side_ae_iface}-0.{side.iptrunk_side_node.router_fqdn}"
if not (subscription.iptrunk.iptrunk_ipv4_network and subscription.iptrunk.iptrunk_ipv6_network):
......@@ -522,12 +522,12 @@ def create_iptrunk() -> StepList:
>> initialize_subscription
>> get_info_from_ipam
>> reserve_interfaces_in_netbox
>> pp_interaction(provision_ip_trunk_iface_dry)
>> pp_interaction(provision_ip_trunk_iface_real)
>> pp_interaction(check_ip_trunk_connectivity)
>> pp_interaction(provision_ip_trunk_isis_iface_dry)
>> pp_interaction(provision_ip_trunk_isis_iface_real)
>> pp_interaction(check_ip_trunk_isis)
>> lso_interaction(provision_ip_trunk_iface_dry)
>> lso_interaction(provision_ip_trunk_iface_real)
>> lso_interaction(check_ip_trunk_connectivity)
>> lso_interaction(provision_ip_trunk_isis_iface_dry)
>> lso_interaction(provision_ip_trunk_isis_iface_real)
>> lso_interaction(check_ip_trunk_isis)
>> register_dns_records
>> side_a_is_nokia(netbox_allocate_side_a_interfaces)
>> side_b_is_nokia(netbox_allocate_side_b_interfaces)
......
......@@ -10,7 +10,7 @@ from orchestrator.workflows.utils import wrap_modify_initial_input_form
from pydantic import validator
from gso.products.product_types.iptrunk import Iptrunk
from gso.services.provisioning_proxy import execute_playbook, pp_interaction
from gso.services.lso_client import execute_playbook, lso_interaction
from gso.utils.helpers import validate_tt_number
......@@ -88,8 +88,8 @@ def deploy_twamp() -> StepList:
init
>> store_process_subscription(Target.MODIFY)
>> unsync
>> pp_interaction(deploy_twamp_dry)
>> pp_interaction(deploy_twamp_real)
>> lso_interaction(deploy_twamp_dry)
>> lso_interaction(deploy_twamp_real)
>> resync
>> done
)
......@@ -29,8 +29,8 @@ from gso.products.product_types.iptrunk import Iptrunk
from gso.products.product_types.router import Router
from gso.services import infoblox
from gso.services.infoblox import DeletionError
from gso.services.lso_client import execute_playbook, lso_interaction
from gso.services.netbox_client import NetboxClient
from gso.services.provisioning_proxy import execute_playbook, pp_interaction
from gso.services.subscriptions import get_active_router_subscriptions
from gso.utils.helpers import (
LAGMember,
......@@ -220,6 +220,25 @@ def calculate_old_side_data(subscription: Iptrunk, replace_index: int) -> State:
return {"old_side_data": old_side_data}
@step("Check Optical levels on the trunk endpoint")
def check_ip_trunk_optical_levels(
subscription: Iptrunk,
callback_route: str,
replace_index: int,
) -> State:
"""Check Optical levels on the trunk."""
extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "optical"}
execute_playbook(
playbook_name="iptrunks_checks.yaml",
callback_route=callback_route,
inventory=subscription.iptrunk.iptrunk_sides[1 - replace_index].iptrunk_side_node.router_fqdn,
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("[DRY RUN] Disable configuration on old router")
def disable_old_config_dry(
subscription: Iptrunk,
......@@ -257,7 +276,7 @@ def disable_old_config_dry(
return {"subscription": subscription}
@step("[REAL] Disable configuration on old router")
@step("[FOR REAL] Disable configuration on old router")
def disable_old_config_real(
subscription: Iptrunk,
callback_route: str,
......@@ -333,7 +352,7 @@ def deploy_new_config_dry(
return {"subscription": subscription}
@step("Deploy configuration on new router")
@step("[FOR REAL] Deploy configuration on new router")
def deploy_new_config_real(
subscription: Iptrunk,
callback_route: str,
......@@ -385,7 +404,26 @@ def confirm_continue_move_fiber() -> FormGenerator:
return {}
@step("Deploy ISIS configuration on new router")
@step("Check IP connectivity of the trunk")
def check_ip_trunk_connectivity(
subscription: Iptrunk,
callback_route: str,
replace_index: int,
) -> State:
"""Check successful connectivity across the new trunk."""
extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "ping"}
execute_playbook(
playbook_name="iptrunks_checks.yaml",
callback_route=callback_route,
inventory=subscription.iptrunk.iptrunk_sides[1 - replace_index].iptrunk_side_node.router_fqdn,
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("[FOR REAL] Deploy ISIS configuration on new router")
def deploy_new_isis(
subscription: Iptrunk,
callback_route: str,
......@@ -422,6 +460,25 @@ def deploy_new_isis(
return {"subscription": subscription}
@step("Check ISIS adjacency")
def check_ip_trunk_isis(
subscription: Iptrunk,
callback_route: str,
replace_index: int,
) -> State:
"""Run an Ansible playbook to confirm :term:`ISIS` adjacency."""
extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "isis"}
execute_playbook(
playbook_name="iptrunks_checks.yaml",
callback_route=callback_route,
inventory=subscription.iptrunk.iptrunk_sides[1 - replace_index].iptrunk_side_node.router_fqdn,
extra_vars=extra_vars,
)
return {"subscription": subscription}
@inputstep("Wait for confirmation", assignee=Assignee.SYSTEM)
def confirm_continue_restore_isis() -> FormGenerator:
"""Wait for an operator to confirm that the old :term:`ISIS` metric should be restored."""
......@@ -437,7 +494,7 @@ def confirm_continue_restore_isis() -> FormGenerator:
return {}
@step("Restore ISIS metric to original value")
@step("[FOR REAL] Restore ISIS metric to original value")
def restore_isis_metric(
subscription: Iptrunk,
process_id: UUIDstr,
......@@ -504,7 +561,7 @@ def delete_old_config_dry(
return {"subscription": subscription}
@step("Delete configuration on old router")
@step("[FOR REAL] Delete configuration on old router")
def delete_old_config_real(
subscription: Iptrunk,
callback_route: str,
......@@ -656,17 +713,21 @@ def migrate_iptrunk() -> StepList:
>> unsync
>> new_side_is_nokia(netbox_reserve_interfaces)
>> calculate_old_side_data
>> pp_interaction(set_isis_to_max)
>> pp_interaction(disable_old_config_dry)
>> pp_interaction(disable_old_config_real)
>> pp_interaction(deploy_new_config_dry)
>> pp_interaction(deploy_new_config_real)
>> lso_interaction(set_isis_to_max)
>> lso_interaction(check_ip_trunk_optical_levels)
>> lso_interaction(disable_old_config_dry)
>> lso_interaction(disable_old_config_real)
>> lso_interaction(deploy_new_config_dry)
>> lso_interaction(deploy_new_config_real)
>> confirm_continue_move_fiber
>> pp_interaction(deploy_new_isis)
>> lso_interaction(check_ip_trunk_optical_levels)
>> lso_interaction(check_ip_trunk_connectivity)
>> lso_interaction(deploy_new_isis)
>> lso_interaction(check_ip_trunk_isis)
>> should_restore_isis_metric(confirm_continue_restore_isis)
>> should_restore_isis_metric(pp_interaction(restore_isis_metric))
>> pp_interaction(delete_old_config_dry)
>> pp_interaction(delete_old_config_real)
>> should_restore_isis_metric(lso_interaction(restore_isis_metric))
>> lso_interaction(delete_old_config_dry)
>> lso_interaction(delete_old_config_real)
>> update_ipam
>> update_subscription_model
>> old_side_is_nokia(netbox_remove_old_interfaces)
......
......@@ -11,7 +11,7 @@ from orchestrator.workflows.steps import resync, store_process_subscription, uns
from orchestrator.workflows.utils import wrap_modify_initial_input_form
from gso.products.product_types.iptrunk import Iptrunk
from gso.services.provisioning_proxy import execute_playbook, pp_interaction
from gso.services.lso_client import execute_playbook, lso_interaction
def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
......@@ -35,7 +35,7 @@ def modify_iptrunk_subscription(subscription: Iptrunk, isis_metric: int) -> Stat
return {"subscription": subscription}
@step("Provision IP trunk ISIS interface [DRY RUN]")
@step("[DRY RUN] Provision IP trunk ISIS interface")
def provision_ip_trunk_isis_iface_dry(
subscription: Iptrunk,
process_id: UUIDstr,
......@@ -63,7 +63,7 @@ def provision_ip_trunk_isis_iface_dry(
return {"subscription": subscription}
@step("Provision IP trunk ISIS interface [FOR REAL]")
@step("[FOR REAL] Provision IP trunk ISIS interface")
def provision_ip_trunk_isis_iface_real(
subscription: Iptrunk,
process_id: UUIDstr,
......@@ -108,8 +108,8 @@ def modify_isis_metric() -> StepList:
>> store_process_subscription(Target.MODIFY)
>> unsync
>> modify_iptrunk_subscription
>> pp_interaction(provision_ip_trunk_isis_iface_dry)
>> pp_interaction(provision_ip_trunk_isis_iface_real)
>> lso_interaction(provision_ip_trunk_isis_iface_dry)
>> lso_interaction(provision_ip_trunk_isis_iface_real)
>> resync
>> done
)
......@@ -22,8 +22,8 @@ from gso.products.product_blocks.iptrunk import (
PhyPortCapacity,
)
from gso.products.product_types.iptrunk import Iptrunk
from gso.services.lso_client import execute_playbook, lso_interaction
from gso.services.netbox_client import NetboxClient
from gso.services.provisioning_proxy import execute_playbook, pp_interaction
from gso.utils.helpers import (
LAGMember,
available_interfaces_choices,
......@@ -214,7 +214,7 @@ def modify_iptrunk_subscription(
}
@step("Provision IP trunk interface [DRY RUN]")
@step("[DRY RUN] Provision IP trunk interface")
def provision_ip_trunk_iface_dry(
subscription: Iptrunk,
process_id: UUIDstr,
......@@ -244,7 +244,7 @@ def provision_ip_trunk_iface_dry(
return {"subscription": subscription}
@step("Provision IP trunk interface [FOR REAL]")
@step("[FOR REAL] Provision IP trunk interface")
def provision_ip_trunk_iface_real(
subscription: Iptrunk,
process_id: UUIDstr,
......@@ -401,8 +401,8 @@ def modify_trunk_interface() -> StepList:
>> modify_iptrunk_subscription
>> side_a_is_nokia(netbox_update_interfaces_side_a)
>> side_b_is_nokia(netbox_update_interfaces_side_b)
>> pp_interaction(provision_ip_trunk_iface_dry)
>> pp_interaction(provision_ip_trunk_iface_real)
>> lso_interaction(provision_ip_trunk_iface_dry)
>> lso_interaction(provision_ip_trunk_iface_real)
>> side_a_is_nokia(allocate_interfaces_in_netbox_side_a)
>> side_b_is_nokia(allocate_interfaces_in_netbox_side_b)
>> resync
......
......@@ -21,8 +21,8 @@ from pydantic import validator
from gso.products.product_blocks.iptrunk import IptrunkSideBlock
from gso.products.product_types.iptrunk import Iptrunk
from gso.services import infoblox
from gso.services.lso_client import execute_playbook, lso_interaction
from gso.services.netbox_client import NetboxClient
from gso.services.provisioning_proxy import execute_playbook, pp_interaction
from gso.utils.helpers import get_router_vendor, validate_tt_number
from gso.utils.shared_enums import Vendor
from gso.utils.workflow_steps import set_isis_to_max
......@@ -49,7 +49,7 @@ def initial_input_form_generator() -> FormGenerator:
return user_input.dict()
@step("Deprovision IP trunk [DRY RUN]")
@step("[DRY RUN] Deprovision IP trunk")
def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr, callback_route: str, tt_number: str) -> State:
"""Perform a dry run of deleting configuration from the routers."""
extra_vars = {
......@@ -72,7 +72,7 @@ def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr, callbac
return {"subscription": subscription}
@step("Deprovision IP trunk [FOR REAL]")
@step("[FOR REAL] Deprovision IP trunk")
def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr, callback_route: str, tt_number: str) -> State:
"""Delete configuration from the routers."""
extra_vars = {
......@@ -171,9 +171,9 @@ def terminate_iptrunk() -> StepList:
config_steps = (
init
>> pp_interaction(set_isis_to_max)
>> pp_interaction(deprovision_ip_trunk_dry)
>> pp_interaction(deprovision_ip_trunk_real)
>> lso_interaction(set_isis_to_max)
>> lso_interaction(deprovision_ip_trunk_dry)
>> lso_interaction(deprovision_ip_trunk_real)
)
ipam_steps = init >> deprovision_ip_trunk_ipv4 >> deprovision_ip_trunk_ipv6
......
......@@ -17,9 +17,9 @@ from gso.products.product_blocks.router import RouterRole
from gso.products.product_types.router import RouterInactive, RouterProvisioning
from gso.products.product_types.site import Site
from gso.services import infoblox, subscriptions
from gso.services.lso_client import lso_interaction
from gso.services.netbox_client import NetboxClient
from gso.services.partners import get_partner_by_name
from gso.services.provisioning_proxy import pp_interaction
from gso.settings import load_oss_params
from gso.utils.helpers import generate_fqdn, iso_from_ipv4
from gso.utils.shared_enums import PortNumber, Vendor
......@@ -265,15 +265,15 @@ def create_router() -> StepList:
>> store_process_subscription(Target.CREATE)
>> initialize_subscription
>> ipam_allocate_loopback
>> pp_interaction(deploy_base_config_dry)
>> pp_interaction(deploy_base_config_real)
>> lso_interaction(deploy_base_config_dry)
>> lso_interaction(deploy_base_config_real)
>> verify_ipam_loopback
>> prompt_reboot_router
>> prompt_console_login
>> prompt_insert_in_ims
>> prompt_insert_in_radius
>> router_is_nokia(create_netbox_device)
>> pp_interaction(run_checks_after_base_config)
>> lso_interaction(run_checks_after_base_config)
>> set_status(SubscriptionLifecycle.PROVISIONING)
>> prompt_start_new_checklist
>> resync
......