Skip to content
Snippets Groups Projects
validate_router.py 2.29 KiB
"""Router validation workflow. Used in a nightly schedule."""

import json

from orchestrator.targets import Target
from orchestrator.utils.errors import ProcessFailureError
from orchestrator.utils.json import json_dumps
from orchestrator.workflow import StepList, done, init, step, workflow
from orchestrator.workflows.steps import resync, store_process_subscription, unsync
from orchestrator.workflows.utils import wrap_modify_initial_input_form

from gso.products.product_types.router import Router
from gso.services import infoblox
from gso.services.provisioning_proxy import execute_playbook, pp_interaction


@step("Validate router configuration")
def validate_router_config(subscription: Router, callback_route: str) -> None:
    """Run an Ansible playbook that validates the configuration that is present on an active Router."""
    extra_vars = {"wfo_router": json.loads(json_dumps(subscription)), "verb": "validate"}

    execute_playbook(
        playbook_name="base_config.yaml",
        callback_route=callback_route,
        inventory=subscription.router.router_fqdn,
        extra_vars=extra_vars,
    )


@step("Verify IPAM resources for loopback interface")
def verify_ipam_loopback(subscription: Router) -> None:
    """Validate the :term:`IPAM` resources for the loopback interface.

    Raises an :class:`orchestrator.utils.errors.ProcessFailureError` if :term:`IPAM` is configured incorrectly.
    """
    host_record = infoblox.find_host_by_fqdn(f"lo0.{subscription.router.router_fqdn}")
    if not host_record or str(subscription.subscription_id) not in host_record.comment:
        msg = "Loopback record is incorrectly configured in IPAM, please investigate this manually!"
        raise ProcessFailureError(msg)


@workflow(
    "Validate router configuration",
    target=Target.SYSTEM,
    initial_input_form=wrap_modify_initial_input_form(None),
)
def validate_router() -> StepList:
    """Validate an existing, active Router subscription.

    * Run an Ansible playbook to verify the configuration is intact.
    * Verify that the loopback interface is correctly configured in :term:`IPAM`.
    """
    return (
        init
        >> store_process_subscription(Target.SYSTEM)
        >> unsync
        >> pp_interaction(validate_router_config)
        >> verify_ipam_loopback
        >> resync
        >> done
    )