8000 feat(anta.tests): Added a test to check if routing is enabled by geetanjalimanegslab · Pull Request #1175 · aristanetworks/anta · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

feat(anta.tests): Added a test to check if routing is enabled #1175

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
57 changes: 56 additions & 1 deletion anta/tests/routing/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from functools import cache
from ipaddress import IPv4Address, IPv4Interface
from typing import TYPE_CHECKING, ClassVar, Literal
from typing import TYPE_CHECKING, Any, ClassVar, Literal

from pydantic import field_validator, model_validator

Expand Down Expand Up @@ -349,3 +349,58 @@ def test(self) -> None:
for nexthop in entry.nexthops:
if not get_item(route_data["vias"], "nexthopAddr", str(nexthop)):
self.result.is_failure(f"{entry} Nexthop: {nexthop} - Route not found")


class VerifyRoutingStatus(AntaTest):
"""Verifies the routing status for IPv4/IPv6 unicast, multicast, and IPv6 interfaces (RFC5549).

Expected Results
----------------
* Success: The test will pass if the routing status is correct.
* Failure: The test will fail if the routing status doesn't match the expected configuration.

Examples
--------
```yaml
anta.tests.routing:
generic:
- VerifyRoutingStatus:
ipv4_unicast: True
ipv6_unicast: True
```
"""

categories: ClassVar[list[str]] = ["routing"]
commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show ip", revision=1)]

class Input(AntaTest.Input):
"""Input model for the VerifyRoutingStatus test."""

ipv4_unicast: bool = False
"""IPv4 unicast routing status."""
ipv6_unicast: bool = False
"""IPv6 unicast routing status."""
ipv4_multicast: bool = False
"""IPv4 multicast routing status."""
ipv6_multicast: bool = False
"""IPv6 multicast routing status."""
ipv6_interfaces: bool = False
"""IPv6 interface forwarding status."""

@AntaTest.anta_test
def test(self) -> None:
"""Main test function for VerifyRoutingStatus."""
self.result.is_success()
command_output = self.instance_commands[0].json_output
actual_routing_status: dict[str, Any] = {
"ipv4_unicast": command_output["v4RoutingEnabled"],
"ipv6_unicast": command_output["v6RoutingEnabled"],
"ipv4_multicast": command_output["multicastRouting"]["ipMulticastEnabled"],
"ipv6_multicast": command_output["multicastRouting"]["ip6MulticastEnabled"],
"ipv6_interfaces": command_output.get("v6IntfForwarding", False),
}

for input_key, value in self.inputs:
if input_key in actual_routing_status and value != actual_routing_status[input_key]:
route_type = " ".join([{"ipv4": "IPv4", "ipv6": "IPv6"}.get(part, part) for part in input_key.split("_")])
self.result.is_failure(f"{route_type} routing enabled status mismatch - Expected: {value} Actual: {actual_routing_status[input_key]}")
4 changes: 4 additions & 0 deletions examples/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,10 @@ anta.tests.routing.generic:
- VerifyRoutingProtocolModel:
# Verifies the configured routing protocol model.
model: multi-agent
- VerifyRoutingStatus:
# Verifies the routing status for IPv4/IPv6 unicast, multicast, and IPv6 interfaces (RFC5549).
ipv4_unicast: True
ipv6_unicast: True
- VerifyRoutingTableEntry:
# Verifies that the provided routes are present in the routing table of a specified VRF.
vrf: default
Expand Down
106 changes: 105 additions & 1 deletion tests/units/anta_tests/routing/test_generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,14 @@
import pytest
from pydantic import ValidationError

from anta.tests.routing.generic import VerifyIPv4RouteNextHops, VerifyIPv4RouteType, VerifyRoutingProtocolModel, VerifyRoutingTableEntry, VerifyRoutingTableSize
from anta.tests.routing.generic import (
VerifyIPv4RouteNextHops,
VerifyIPv4RouteType,
VerifyRoutingProtocolModel,
VerifyRoutingStatus,
VerifyRoutingTableEntry,
VerifyRoutingTableSize,
)
from tests.units.anta_tests import test

DATA: list[dict[str, Any]] = [
Expand Down Expand Up @@ -517,6 +524,103 @@
],
},
},
{
"name": "success-routing-enablement",
"test": VerifyRoutingStatus,
"eos_data": [
{
"v4RoutingEnabled": True,
"v6RoutingEnabled": True,
"vrrpIntfs": 0,
"v6IntfForwarding": True,
"multicastRouting": {"ipMulticastEnabled": False, "ip6MulticastEnabled": False},
"v6EcmpInfo": {"v6EcmpRouteSupport": True},
}
],
"inputs": {"ipv4_unicast": True, "ipv6_unicast": True, "ipv6_interfaces": True},
"expected": {
"result": "success",
},
},
{
"name": "success-routing-disable-all",
"test": VerifyRoutingStatus,
"eos_data": [
{
"v4RoutingEnabled": False,
"v6RoutingEnabled": False,
"vrrpIntfs": 0,
"multicastRouting": {"ipMulticastEnabled": False, "ip6MulticastEnabled": False},
"v6EcmpInfo": {"v6EcmpRouteSupport": False},
}
],
"inputs": None,
"expected": {
"result": "success",
},
},
{
"name": "failure-ip-multicastrouting-enablement",
"test": VerifyRoutingStatus,
"eos_data": [
{
"v4RoutingEnabled": False,
"v6RoutingEnabled": False,
"vrrpIntfs": 0,
"multicastRouting": {"ipMulticastEnabled": False, "ip6MulticastEnabled": False},
"v6EcmpInfo": {"v6EcmpRouteSupport": True},
}
],
"inputs": {"ipv4_multicast": True, "ipv6_multicast": True},
"expected": {
"result": "failure",
"messages": [
"IPv4 multicast routing enabled status mismatch - Expected: True Actual: False",
"IPv6 multicast routing enabled status mismatch - Expected: True Actual: False",
],
},
},
{
"name": "failure-ip-routing-enablement",
"test": VerifyRoutingStatus,
"eos_data": [
{
"v4RoutingEnabled": False,
"v6RoutingEnabled": False,
"vrrpIntfs": 0,
"multicastRouting": {"ipMulticastEnabled": True, "ip6MulticastEnabled": True},
"v6EcmpInfo": {"v6EcmpRouteSupport": True},
}
],
"inputs": {"ipv4_unicast": True, "ipv6_unicast": True},
"expected": {
"result": "failure",
"messages": [
"IPv4 unicast routing enabled status mismatch - Expected: True Actual: False",
"IPv6 unicast routing enabled status mismatch - Expected: True Actual: False",
"IPv4 multicast routing enabled status mismatch - Expected: False Actual: True",
"IPv6 multicast routing enabled status mismatch - Expected: False Actual: True",
],
},
},
{
"name": "failure-ipv6-interface-routing-enablement",
"test": VerifyRoutingStatus,
"eos_data": [
{
"v4RoutingEnabled": True,
"v6RoutingEnabled": True,
"vrrpIntfs": 0,
"multicastRouting": {"ipMulticastEnabled": False, "ip6MulticastEnabled": False},
"v6EcmpInfo": {"v6EcmpRouteSupport": True},
}
],
"inputs": {"ipv4_unicast": True, "ipv6_unicast": True, "ipv6_interfaces": True},
"expected": {
"result": "failure",
"messages": ["IPv6 interfaces routing enabled status mismatch - Expected: True Actual: False"],
},
},
]


Expand Down
0