anta/tests/units/anta_tests/test_evpn.py
Daniel Baumann 7996c81031
Adding upstream version 1.4.0.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-15 09:34:27 +02:00

449 lines
21 KiB
Python

# Copyright (c) 2023-2025 Arista Networks, Inc.
# Use of this source code is governed by the Apache License 2.0
# that can be found in the LICENSE file.
"""Tests for anta.tests.evpn.py."""
from __future__ import annotations
import sys
from typing import TYPE_CHECKING, Any
from anta.models import AntaTest
from anta.result_manager.models import AntaTestStatus
from anta.tests.evpn import VerifyEVPNType5Routes
from tests.units.anta_tests import test
if TYPE_CHECKING:
from tests.units.anta_tests import AntaUnitTestDataDict
DATA: AntaUnitTestDataDict = {
(VerifyEVPNType5Routes, "success-all"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [{"nextHop": "10.100.2.3", "routeType": {"active": True, "valid": True}}],
}
},
},
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [{"nextHop": "10.100.2.3", "routeType": {"active": True, "valid": True}}],
}
},
},
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.3",
"routeType": {"active": True, "valid": True},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
}
],
}
},
},
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.3",
"routeType": {"active": True, "valid": True},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
}
],
}
},
},
],
"inputs": {
"prefixes": [
{"address": "10.100.0.128/31", "vni": 10},
{"address": "10.100.0.128/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "local"}]},
{"address": "10.100.4.0/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3"}]}]},
{
"address": "10.100.4.1/31",
"vni": 10,
"routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3", "route_targets": ["10:10"]}]}],
},
]
},
"expected": {"result": AntaTestStatus.SUCCESS},
},
(VerifyEVPNType5Routes, "success-ipv6"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.1.0.21",
"asn": 65120,
"evpnRoutes": {
"RD: 10.1.0.21:500 ip-prefix fd00:dc:5::1/128": {
"totalPaths": 1,
"routeKeyDetail": {"ipGenPrefix": "fd00:dc:5::1/128", "domain": "local", "rd": "10.1.0.21:500", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "",
"asPathEntry": {"asPathType": "Local", "asPath": "i"},
"reasonNotBestpath": "noReason",
"routeType": {"active": True, "valid": True},
}
],
},
"RD: 10.1.0.21:500 ip-prefix fd00:dc:5::1/128 remote": {
"totalPaths": 1,
"routeKeyDetail": {"ipGenPrefix": "fd00:dc:5::1/128", "domain": "remote", "rd": "10.1.0.21:500", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "",
"asPathEntry": {"asPathType": "Local", "asPath": "i"},
"reasonNotBestpath": "noReason",
"routeType": {"active": True, "valid": True},
}
],
},
},
}
],
"inputs": {"prefixes": [{"address": "fd00:dc:5::1/128", "vni": 500}]},
"expected": {"result": AntaTestStatus.SUCCESS},
},
(VerifyEVPNType5Routes, "success-across-all-rds"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [{"nextHop": "10.100.2.3", "routeType": {"active": True, "valid": True}}],
},
"RD: 10.100.1.4:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "local", "rd": "10.100.1.4:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [{"nextHop": "10.100.2.3", "routeType": {"active": False, "valid": False}}],
},
},
}
],
"inputs": {"prefixes": [{"address": "10.100.0.128/31", "vni": 10}]},
"expected": {"result": AntaTestStatus.SUCCESS},
},
(VerifyEVPNType5Routes, "success-specific-rd"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{"nextHop": "10.100.2.3", "routeType": {"active": False, "valid": False}},
{"nextHop": "10.100.2.4", "routeType": {"active": True, "valid": True}},
],
}
},
}
],
"inputs": {"prefixes": [{"address": "10.100.0.128/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "local"}]}]},
"expected": {"result": AntaTestStatus.SUCCESS},
},
(VerifyEVPNType5Routes, "success-specific-nexthop"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.3",
"routeType": {"active": True, "valid": True},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
},
{
"nextHop": "10.100.2.3",
"routeType": {"active": False, "valid": False},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
},
],
}
},
}
],
"inputs": {
"prefixes": [{"address": "10.100.4.0/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3"}]}]}]
},
"expected": {"result": AntaTestStatus.SUCCESS},
},
(VerifyEVPNType5Routes, "success-RTs"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.3",
"routeType": {"active": True, "valid": True},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
}
],
}
},
}
],
"inputs": {
"prefixes": [
{
"address": "10.100.4.1/31",
"vni": 10,
"routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3", "route_targets": ["10:10"]}]}],
}
]
},
"expected": {"result": AntaTestStatus.SUCCESS},
},
(VerifyEVPNType5Routes, "failure-all"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [{"nextHop": "10.100.2.3", "routeType": {"active": False, "valid": True}}],
}
},
},
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [{"nextHop": "10.100.2.3", "routeType": {"active": False, "valid": True}}],
}
},
},
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.3",
"routeType": {"active": True, "valid": False},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
}
],
}
},
},
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.3",
"routeType": {"active": False, "valid": True},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
}
],
}
},
},
],
"inputs": {
"prefixes": [
{"address": "10.100.0.128/31", "vni": 10},
{"address": "10.100.0.128/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "local"}]},
{"address": "10.100.4.0/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3"}]}]},
{
"address": "10.100.4.1/31",
"vni": 10,
"routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3", "route_targets": ["10:10"]}]}],
},
]
},
"expected": {
"result": AntaTestStatus.FAILURE,
"messages": [
"Prefix: 10.100.0.128/31 VNI: 10 - No active and valid path found across all RDs",
"Prefix: 10.100.0.128/31 VNI: 10 RD: 10.100.1.3:10 - No active and valid path found",
"Prefix: 10.100.4.0/31 VNI: 10 RD: 10.100.1.3:10 Nexthop: 10.100.2.3 - No active and valid path found",
"Prefix: 10.100.4.1/31 VNI: 10 RD: 10.100.1.3:10 Nexthop: 10.100.2.3 RTs: 10:10 - No active and valid path found",
],
},
},
(VerifyEVPNType5Routes, "failure-not-configured"): {
"eos_data": [
{"vrf": "default", "routerId": "10.100.1.5", "asn": 65102, "evpnRoutes": {}},
{"vrf": "default", "routerId": "10.100.1.5", "asn": 65102, "evpnRoutes": {}},
],
"inputs": {
"prefixes": [
{"address": "10.100.0.128/31", "vni": 10},
{
"address": "10.100.4.1/31",
"vni": 10,
"routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3", "route_targets": ["10:10"]}]}],
},
]
},
"expected": {
"result": AntaTestStatus.FAILURE,
"messages": ["Prefix: 10.100.0.128/31 VNI: 10 - No EVPN Type-5 routes found", "Prefix: 10.100.4.1/31 VNI: 10 - No EVPN Type-5 routes found"],
},
},
(VerifyEVPNType5Routes, "failure-route-not-found-with-specified-rd-domain"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.0.128/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.0.128/31", "domain": "remote", "rd": "10.100.1.4:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{"nextHop": "10.100.2.3", "routeType": {"active": False, "valid": False}},
{"nextHop": "10.100.2.4", "routeType": {"active": True, "valid": True}},
],
}
},
}
],
"inputs": {"prefixes": [{"address": "10.100.0.128/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "remote"}]}]},
"expected": {"result": AntaTestStatus.FAILURE, "messages": ["Prefix: 10.100.0.128/31 VNI: 10 RD: 10.100.1.3:10 Domain: remote - Route not found"]},
},
(VerifyEVPNType5Routes, "failiure-specific-nexthop-path-not-found"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.4",
"routeType": {"active": True, "valid": True},
"routeDetail": {"extCommunities": ["Route-Target-AS:10:10", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
}
],
}
},
}
],
"inputs": {
"prefixes": [{"address": "10.100.4.0/31", "vni": 10, "routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3"}]}]}]
},
"expected": {"result": AntaTestStatus.FAILURE, "messages": ["Prefix: 10.100.4.0/31 VNI: 10 RD: 10.100.1.3:10 Nexthop: 10.100.2.3 - Path not found"]},
},
(VerifyEVPNType5Routes, "failiure-specific-nexthop-RTs-path-not-found"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.100.1.5",
"asn": 65102,
"evpnRoutes": {
"RD: 10.100.1.3:10 ip-prefix 10.100.4.0/31": {
"routeKeyDetail": {"ipGenPrefix": "10.100.4.0/31", "domain": "local", "rd": "10.100.1.3:10", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "10.100.2.3",
"routeType": {"active": True, "valid": True},
"routeDetail": {"extCommunities": ["Route-Target-AS:20:20", "TunnelEncap:tunnelTypeVxlan", "EvpnRouterMac:02:1c:73:71:73:45"]},
}
],
}
},
}
],
"inputs": {
"prefixes": [
{
"address": "10.100.4.1/31",
"vni": 10,
"routes": [{"rd": "10.100.1.3:10", "domain": "local", "paths": [{"nexthop": "10.100.2.3", "route_targets": ["10:10"]}]}],
}
]
},
"expected": {
"result": AntaTestStatus.FAILURE,
"messages": ["Prefix: 10.100.4.1/31 VNI: 10 RD: 10.100.1.3:10 Nexthop: 10.100.2.3 RTs: 10:10 - Path not found"],
},
},
(VerifyEVPNType5Routes, "failure-ipv6"): {
"eos_data": [
{
"vrf": "default",
"routerId": "10.1.0.21",
"asn": 65120,
"evpnRoutes": {
"RD: 10.1.0.21:500 ip-prefix fd00:dc:5::1/128": {
"totalPaths": 1,
"routeKeyDetail": {"ipGenPrefix": "fd00:dc:5::1/128", "domain": "local", "rd": "10.1.0.21:500", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "",
"asPathEntry": {"asPathType": "Local", "asPath": "i"},
"reasonNotBestpath": "noReason",
"routeType": {"active": True, "valid": False},
}
],
},
"RD: 10.1.0.21:500 ip-prefix fd00:dc:5::1/128 remote": {
"totalPaths": 1,
"routeKeyDetail": {"ipGenPrefix": "fd00:dc:5::1/128", "domain": "remote", "rd": "10.1.0.21:500", "nlriType": "ip-prefix"},
"evpnRoutePaths": [
{
"nextHop": "",
"asPathEntry": {"asPathType": "Local", "asPath": "i"},
"reasonNotBestpath": "noReason",
"routeType": {"active": False, "valid": True},
}
],
},
},
}
],
"inputs": {"prefixes": [{"address": "fd00:dc:5::1/128", "vni": 500}]},
"expected": {"result": AntaTestStatus.FAILURE, "messages": ["Prefix: fd00:dc:5::1/128 VNI: 500 - No active and valid path found across all RDs"]},
},
}