Skip to content
Snippets Groups Projects
Commit cd23a1ee 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 576908d6
No related branches found
No related tags found
No related merge requests found
"""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.
Please register or to comment