Skip to content
Snippets Groups Projects
Commit cf4ad0c6 authored by Karel van Klink's avatar Karel van Klink :smiley_cat: Committed by Neda Moeini
Browse files

update unit test for validate iptrunk

parent ed6003e6
No related branches found
No related tags found
1 merge request!139Feature/add validation workflows
"""Tasks that are scheduled to run periodically in :term:`GSO`."""
TT_NUMBER_ZERO = "TT#0000000000000000"
......@@ -15,7 +15,6 @@ from gso.services.lso_client import anonymous_lso_interaction, execute_playbook
from gso.services.netbox_client import NetboxClient
from gso.utils.helpers import get_router_vendor
from gso.utils.shared_enums import Vendor
from gso.workflows.iptrunk.migrate_iptrunk import check_ip_trunk_isis
@step("Validate IP trunk configuration")
......@@ -70,7 +69,7 @@ def verify_ipam_records(subscription: Iptrunk) -> None:
]
# Allocated host record needs to be set correctly
if record.comment != subscription.subscription_id:
if record.comment != str(subscription.subscription_id):
ipam_errors += [
(
f"Incorrect host record found for '{lag_fqdn}' at '{side_v4}'. Comment should have been equal "
......@@ -93,7 +92,7 @@ def verify_ipam_records(subscription: Iptrunk) -> None:
]
# Allocated host record needs to be set correctly
if record.comment != subscription.subscription_id:
if record.comment != str(subscription.subscription_id):
ipam_errors += [
(
f"Incorrect host record found for '{lag_fqdn}' at '{side_v6}'. Comment should have been equal "
......@@ -157,6 +156,20 @@ def verify_iptrunk_config(subscription: Iptrunk, callback_route: str) -> None:
)
@step("Check ISIS adjacency")
def check_ip_trunk_isis(subscription: Iptrunk, callback_route: str) -> None:
"""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=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n"
f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n",
extra_vars=extra_vars,
)
@step("Verify TWAMP configuration")
def verify_twamp_config(subscription: Iptrunk, callback_route: str) -> None:
"""Check for configuration drift of TWAMP."""
......@@ -172,9 +185,7 @@ def verify_twamp_config(subscription: Iptrunk, callback_route: str) -> None:
@workflow(
"Validate IP trunk configuration",
target=Target.SYSTEM,
initial_input_form=wrap_modify_initial_input_form(None),
"Validate IP trunk configuration", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None)
)
def validate_iptrunk() -> StepList:
"""Validate an existing, active IP Trunk subscription.
......
......@@ -8,7 +8,6 @@ from orchestrator.workflows.utils import wrap_modify_initial_input_form
from pydantic_forms.types import State, UUIDstr
from gso.products.product_types.router import Router
from gso.schedules import TT_NUMBER_ZERO
from gso.services import infoblox
from gso.services.librenms_client import LibreNMSClient
from gso.services.lso_client import anonymous_lso_interaction, execute_playbook
......@@ -18,13 +17,10 @@ from gso.utils.shared_enums import Vendor
@step("Prepare required keys in state")
def prepare_state(subscription_id: UUIDstr) -> State:
"""Add required keys to the state for the workflow to run successfully.
This includes the router product itself and a fake TT number for running playbooks.
"""
"""Add required keys to the state for the workflow to run successfully."""
router = Router.from_subscription(subscription_id)
return {"subscription": router, "tt_number": TT_NUMBER_ZERO}
return {"subscription": router}
@step("Verify IPAM resources for loopback interface")
......
......@@ -4,20 +4,46 @@ import pytest
from infoblox_client import objects
from gso.products.product_types.iptrunk import Iptrunk
from test.services.conftest import MockedNetboxClient
from test.workflows import (
assert_complete,
assert_lso_interaction_success,
assert_lso_success,
extract_state,
run_workflow,
)
@pytest.fixture()
def _mocked_netbox_client():
with (
patch("gso.services.netbox_client.NetboxClient.get_device_by_name") as mock_get_device_by_name,
patch("gso.services.netbox_client.NetboxClient.get_available_interfaces") as mock_get_available_interfaces,
patch("gso.services.netbox_client.NetboxClient.get_available_lags") as mock_get_available_lags,
patch("gso.services.netbox_client.NetboxClient.create_interface") as mock_create_interface,
patch("gso.services.netbox_client.NetboxClient.attach_interface_to_lag") as mock_attach_interface_to_lag,
patch("gso.services.netbox_client.NetboxClient.reserve_interface") as mock_reserve_interface,
patch("gso.services.netbox_client.NetboxClient.allocate_interface") as mock_allocate_interface,
):
mock_get_device_by_name.return_value = MockedNetboxClient().get_device_by_name()
mock_get_available_interfaces.return_value = MockedNetboxClient().get_available_interfaces()
mock_get_available_lags.return_value = MockedNetboxClient().get_available_lags()
mock_create_interface.return_value = MockedNetboxClient().create_interface()
mock_attach_interface_to_lag.return_value = MockedNetboxClient().attach_interface_to_lag()
mock_reserve_interface.return_value = MockedNetboxClient().reserve_interface()
mock_allocate_interface.return_value = MockedNetboxClient().allocate_interface()
yield
@pytest.mark.workflow()
@pytest.mark.usefixtures("_mocked_netbox_client")
@patch("gso.services.infoblox.find_network_by_cidr")
@patch("gso.services.infoblox.find_v6_host_by_fqdn")
@patch("gso.services.infoblox.find_host_by_fqdn")
@patch("gso.workflows.iptrunk.validate_iptrunk.execute_playbook")
def test_validate_router_success(
@patch("gso.services.netbox_client.NetboxClient.get_interface_by_name_and_device")
def test_validate_iptrunk_success(
mock_get_interface_by_name,
mock_validate_iptrunk,
mock_find_host_by_fqdn,
mock_find_v6_host_by_fqdn,
......@@ -71,12 +97,12 @@ def test_validate_router_success(
connector=None,
aliases=[trunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn],
comment=subscription_id,
ipv4addrs=[
ipv6addrs=[
objects.IPv6(
ipv6addr=str(trunk.iptrunk_ipv6_network[0]),
ipv6addr=str(trunk.iptrunk_ipv6_network[1]),
configure_for_dhcp=False,
mac="00:00:00:00:00:00",
ip=str(trunk.iptrunk_ipv6_network[0]),
ip=str(trunk.iptrunk_ipv6_network[1]),
host=f"{trunk.iptrunk_sides[0].iptrunk_side_ae_iface}.{trunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}",
),
],
......@@ -86,12 +112,12 @@ def test_validate_router_success(
connector=None,
aliases=[trunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn],
comment=subscription_id,
ipv4addrs=[
ipv6addrs=[
objects.IPv6(
ipv4addr=str(trunk.iptrunk_ipv6_network[1]),
ipv6addr=str(trunk.iptrunk_ipv6_network[2]),
configure_for_dhcp=False,
mac="00:00:00:00:00:00",
ip=str(trunk.iptrunk_ipv6_network[1]),
ip=str(trunk.iptrunk_ipv6_network[2]),
host=f"{trunk.iptrunk_sides[1].iptrunk_side_ae_iface}.{trunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}",
),
],
......@@ -99,21 +125,61 @@ def test_validate_router_success(
),
]
mock_get_interface_by_name.side_effect = [
MockedNetboxClient.BaseMockObject(
name="Boeiee",
module=MockedNetboxClient.BaseMockObject(display="display1"),
description=subscription_id,
enabled=True,
),
MockedNetboxClient.BaseMockObject(
name="2222222",
module=MockedNetboxClient.BaseMockObject(display="display2"),
description=subscription_id,
enabled=True,
),
MockedNetboxClient.BaseMockObject(
name="3333",
module=MockedNetboxClient.BaseMockObject(display="display 333"),
description=subscription_id,
enabled=True,
),
MockedNetboxClient.BaseMockObject(
name="44",
module=MockedNetboxClient.BaseMockObject(display="display 444"),
description=subscription_id,
enabled=True,
),
MockedNetboxClient.BaseMockObject(
name="55",
module=MockedNetboxClient.BaseMockObject(display="display25555"),
description=subscription_id,
enabled=True,
),
MockedNetboxClient.BaseMockObject(
name="666",
module=MockedNetboxClient.BaseMockObject(display="display666"),
description=subscription_id,
enabled=True,
),
]
# Run workflow
initial_router_data = [{"subscription_id": subscription_id}]
result, process_stat, step_log = run_workflow("validate_iptrunk", initial_router_data)
state = extract_state(result)
subscription_id = state["subscription_id"]
result, step_log = assert_lso_interaction_success(result, process_stat, step_log)
for _ in range(3):
result, step_log = assert_lso_success(result, process_stat, step_log)
assert_complete(result)
subscription_id = state["subscription_id"]
subscription = Iptrunk.from_subscription(subscription_id)
assert subscription.status == "active"
assert mock_validate_iptrunk.call_count == 1
assert mock_validate_iptrunk.call_count == 3
assert mock_find_host_by_fqdn.call_count == 2
assert mock_find_v6_host_by_fqdn.call_count == 2
assert mock_find_network_by_cidr.call_count == 2
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment