diff --git a/anta/tests/vlan.py b/anta/tests/vlan.py new file mode 100644 index 000000000..58c28b6b7 --- /dev/null +++ b/anta/tests/vlan.py @@ -0,0 +1,59 @@ +# Copyright (c) 2023-2024 Arista Networks, Inc. +# Use of this source code is governed by the Apache License 2.0 +# that can be found in the LICENSE file. +""" +Test functions related to VLAN +""" +# Mypy does not understand AntaTest.Input typing +# mypy: disable-error-code=attr-defined + +from typing import Literal + +from anta.custom_types import Vlan +from anta.models import AntaCommand, AntaTest +from anta.tools.get_value import get_value +from anta.tools.utils import get_failed_logs + + +class VerifyVlanInternalPolicy(AntaTest): + """ + This class checks if the VLAN internal allocation policy is ascending or descending and + if the VLANs are within the specified range. + + Expected Results: + * Success: The test will pass if the VLAN internal allocation policy is either ascending or descending + and the VLANs are within the specified range. + * Failure: The test will fail if the VLAN internal allocation policy is neither ascending nor descending + or the VLANs are outside the specified range. + """ + + name = "VerifyVlanInternalPolicy" + description = "This test checks the VLAN internal allocation policy and the range of VLANs." + categories = ["vlan"] + commands = [AntaCommand(command="show vlan internal allocation policy")] + + class Input(AntaTest.Input): + """Inputs for the VerifyVlanInternalPolicy test.""" + + policy: Literal["ascending", "descending"] + """The VLAN internal allocation policy.""" + start_vlan_id: Vlan + """The starting VLAN ID in the range.""" + end_vlan_id: Vlan + """The ending VLAN ID in the range.""" + + @AntaTest.anta_test + def test(self) -> None: + command_output = self.instance_commands[0].json_output + + keys_to_verify = ["policy", "startVlanId", "endVlanId"] + actual_policy_output = {key: get_value(command_output, key) for key in keys_to_verify} + expected_policy_output = {"policy": self.inputs.policy, "startVlanId": self.inputs.start_vlan_id, "endVlanId": self.inputs.end_vlan_id} + + # Check if the actual output matches the expected output + if actual_policy_output != expected_policy_output: + failed_log = "The VLAN internal allocation policy is not configured properly:" + failed_log += get_failed_logs(expected_policy_output, actual_policy_output) + self.result.is_failure(failed_log) + else: + self.result.is_success() diff --git a/docs/api/tests.md b/docs/api/tests.md index b3920633b..78c6b1395 100644 --- a/docs/api/tests.md +++ b/docs/api/tests.md @@ -28,6 +28,7 @@ This section describes all the available tests provided by ANTA package. - [Software](tests.software.md) - [STP](tests.stp.md) - [System](tests.system.md) +- [VLAN](tests.vlan.md) - [VXLAN](tests.vxlan.md) diff --git a/docs/api/tests.vlan.md b/docs/api/tests.vlan.md new file mode 100644 index 000000000..0e1aa1517 --- /dev/null +++ b/docs/api/tests.vlan.md @@ -0,0 +1,13 @@ + + +# ANTA catalog for vlan tests + +::: anta.tests.vlan + options: + show_root_heading: false + show_root_toc_entry: false + merge_init_into_class: false diff --git a/examples/tests.yaml b/examples/tests.yaml index a9ffcd831..a55bb93e7 100644 --- a/examples/tests.yaml +++ b/examples/tests.yaml @@ -296,6 +296,12 @@ anta.tests.system: - VerifyFileSystemUtilization: - VerifyNTP: +anta.tests.vlan: + - VerifyVlanInternalPolicy: + policy: ascending + start_vlan_id: 1006 + end_vlan_id: 4094 + anta.tests.vxlan: - VerifyVxlan1Interface: - VerifyVxlanConfigSanity: diff --git a/mkdocs.yml b/mkdocs.yml index d8d3afdc5..79c21cc06 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -193,6 +193,7 @@ nav: - Software: api/tests.software.md - System: api/tests.system.md - VXLAN: api/tests.vxlan.md + - VLAN: api/tests.vlan.md - API Documentation: - Inventory: - Inventory module: api/inventory.md diff --git a/tests/units/anta_tests/test_vlan.py b/tests/units/anta_tests/test_vlan.py new file mode 100644 index 000000000..93398f664 --- /dev/null +++ b/tests/units/anta_tests/test_vlan.py @@ -0,0 +1,37 @@ +# Copyright (c) 2023-2024 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.vlan.py +""" +from __future__ import annotations + +from typing import Any + +from anta.tests.vlan import VerifyVlanInternalPolicy +from tests.lib.anta import test # noqa: F401; pylint: disable=W0611 + +DATA: list[dict[str, Any]] = [ + { + "name": "success", + "test": VerifyVlanInternalPolicy, + "eos_data": [{"policy": "ascending", "startVlanId": 1006, "endVlanId": 4094}], + "inputs": {"policy": "ascending", "start_vlan_id": 1006, "end_vlan_id": 4094}, + "expected": {"result": "success"}, + }, + { + "name": "failure-incorrect-policy", + "test": VerifyVlanInternalPolicy, + "eos_data": [{"policy": "descending", "startVlanId": 4094, "endVlanId": 1006}], + "inputs": {"policy": "ascending", "start_vlan_id": 1006, "end_vlan_id": 4094}, + "expected": { + "result": "failure", + "messages": [ + "The VLAN internal allocation policy is not configured properly:\n" + "Expected `ascending` as the policy, but found `descending` instead.\n" + "Expected `1006` as the startVlanId, but found `4094` instead.\n" + "Expected `4094` as the endVlanId, but found `1006` instead." + ], + }, + }, +]