diff options
Diffstat (limited to 'anta/tests/snmp.py')
-rw-r--r-- | anta/tests/snmp.py | 190 |
1 files changed, 122 insertions, 68 deletions
diff --git a/anta/tests/snmp.py b/anta/tests/snmp.py index 39d9424..ac98bfd 100644 --- a/anta/tests/snmp.py +++ b/anta/tests/snmp.py @@ -1,38 +1,52 @@ # 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 the EOS various SNMP settings -""" +"""Module related to the EOS various SNMP tests.""" + # Mypy does not understand AntaTest.Input typing # mypy: disable-error-code=attr-defined from __future__ import annotations -from pydantic import conint +from typing import TYPE_CHECKING, ClassVar +from anta.custom_types import PositiveInteger from anta.models import AntaCommand, AntaTest +if TYPE_CHECKING: + from anta.models import AntaTemplate -class VerifySnmpStatus(AntaTest): - """ - Verifies whether the SNMP agent is enabled in a specified VRF. - Expected Results: - * success: The test will pass if the SNMP agent is enabled in the specified VRF. - * failure: The test will fail if the SNMP agent is disabled in the specified VRF. +class VerifySnmpStatus(AntaTest): + """Verifies whether the SNMP agent is enabled in a specified VRF. + + Expected Results + ---------------- + * Success: The test will pass if the SNMP agent is enabled in the specified VRF. + * Failure: The test will fail if the SNMP agent is disabled in the specified VRF. + + Examples + -------- + ```yaml + anta.tests.snmp: + - VerifySnmpStatus: + vrf: default + ``` """ name = "VerifySnmpStatus" description = "Verifies if the SNMP agent is enabled." - categories = ["snmp"] - commands = [AntaCommand(command="show snmp")] + categories: ClassVar[list[str]] = ["snmp"] + commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show snmp", revision=1)] + + class Input(AntaTest.Input): + """Input model for the VerifySnmpStatus test.""" - class Input(AntaTest.Input): # pylint: disable=missing-class-docstring vrf: str = "default" - """The name of the VRF in which to check for the SNMP agent""" + """The name of the VRF in which to check for the SNMP agent. Defaults to `default` VRF.""" @AntaTest.anta_test def test(self) -> None: + """Main test function for VerifySnmpStatus.""" command_output = self.instance_commands[0].json_output if command_output["enabled"] and self.inputs.vrf in command_output["vrfs"]["snmpVrfs"]: self.result.is_success() @@ -41,103 +55,134 @@ class VerifySnmpStatus(AntaTest): class VerifySnmpIPv4Acl(AntaTest): - """ - Verifies if the SNMP agent has the right number IPv4 ACL(s) configured for a specified VRF. - - Expected results: - * success: The test will pass if the SNMP agent has the provided number of IPv4 ACL(s) in the specified VRF. - * failure: The test will fail if the SNMP agent has not the right number of IPv4 ACL(s) in the specified VRF. + """Verifies if the SNMP agent has the right number IPv4 ACL(s) configured for a specified VRF. + + Expected Results + ---------------- + * Success: The test will pass if the SNMP agent has the provided number of IPv4 ACL(s) in the specified VRF. + * Failure: The test will fail if the SNMP agent has not the right number of IPv4 ACL(s) in the specified VRF. + + Examples + -------- + ```yaml + anta.tests.snmp: + - VerifySnmpIPv4Acl: + number: 3 + vrf: default + ``` """ name = "VerifySnmpIPv4Acl" description = "Verifies if the SNMP agent has IPv4 ACL(s) configured." - categories = ["snmp"] - commands = [AntaCommand(command="show snmp ipv4 access-list summary")] + categories: ClassVar[list[str]] = ["snmp"] + commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show snmp ipv4 access-list summary", revision=1)] - class Input(AntaTest.Input): # pylint: disable=missing-class-docstring - number: conint(ge=0) # type:ignore - """The number of expected IPv4 ACL(s)""" + class Input(AntaTest.Input): + """Input model for the VerifySnmpIPv4Acl test.""" + + number: PositiveInteger + """The number of expected IPv4 ACL(s).""" vrf: str = "default" - """The name of the VRF in which to check for the SNMP agent""" + """The name of the VRF in which to check for the SNMP agent. Defaults to `default` VRF.""" @AntaTest.anta_test def test(self) -> None: + """Main test function for VerifySnmpIPv4Acl.""" command_output = self.instance_commands[0].json_output ipv4_acl_list = command_output["ipAclList"]["aclList"] ipv4_acl_number = len(ipv4_acl_list) - not_configured_acl_list = [] if ipv4_acl_number != self.inputs.number: self.result.is_failure(f"Expected {self.inputs.number} SNMP IPv4 ACL(s) in vrf {self.inputs.vrf} but got {ipv4_acl_number}") return - for ipv4_acl in ipv4_acl_list: - if self.inputs.vrf not in ipv4_acl["configuredVrfs"] or self.inputs.vrf not in ipv4_acl["activeVrfs"]: - not_configured_acl_list.append(ipv4_acl["name"]) - if not_configured_acl_list: - self.result.is_failure(f"SNMP IPv4 ACL(s) not configured or active in vrf {self.inputs.vrf}: {not_configured_acl_list}") + + not_configured_acl = [acl["name"] for acl in ipv4_acl_list if self.inputs.vrf not in acl["configuredVrfs"] or self.inputs.vrf not in acl["activeVrfs"]] + + if not_configured_acl: + self.result.is_failure(f"SNMP IPv4 ACL(s) not configured or active in vrf {self.inputs.vrf}: {not_configured_acl}") else: self.result.is_success() class VerifySnmpIPv6Acl(AntaTest): - """ - Verifies if the SNMP agent has the right number IPv6 ACL(s) configured for a specified VRF. - - Expected results: - * success: The test will pass if the SNMP agent has the provided number of IPv6 ACL(s) in the specified VRF. - * failure: The test will fail if the SNMP agent has not the right number of IPv6 ACL(s) in the specified VRF. + """Verifies if the SNMP agent has the right number IPv6 ACL(s) configured for a specified VRF. + + Expected Results + ---------------- + * Success: The test will pass if the SNMP agent has the provided number of IPv6 ACL(s) in the specified VRF. + * Failure: The test will fail if the SNMP agent has not the right number of IPv6 ACL(s) in the specified VRF. + + Examples + -------- + ```yaml + anta.tests.snmp: + - VerifySnmpIPv6Acl: + number: 3 + vrf: default + ``` """ name = "VerifySnmpIPv6Acl" description = "Verifies if the SNMP agent has IPv6 ACL(s) configured." - categories = ["snmp"] - commands = [AntaCommand(command="show snmp ipv6 access-list summary")] + categories: ClassVar[list[str]] = ["snmp"] + commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show snmp ipv6 access-list summary", revision=1)] - class Input(AntaTest.Input): # pylint: disable=missing-class-docstring - number: conint(ge=0) # type:ignore - """The number of expected IPv6 ACL(s)""" + class Input(AntaTest.Input): + """Input model for the VerifySnmpIPv6Acl test.""" + + number: PositiveInteger + """The number of expected IPv6 ACL(s).""" vrf: str = "default" - """The name of the VRF in which to check for the SNMP agent""" + """The name of the VRF in which to check for the SNMP agent. Defaults to `default` VRF.""" @AntaTest.anta_test def test(self) -> None: + """Main test function for VerifySnmpIPv6Acl.""" command_output = self.instance_commands[0].json_output ipv6_acl_list = command_output["ipv6AclList"]["aclList"] ipv6_acl_number = len(ipv6_acl_list) - not_configured_acl_list = [] if ipv6_acl_number != self.inputs.number: self.result.is_failure(f"Expected {self.inputs.number} SNMP IPv6 ACL(s) in vrf {self.inputs.vrf} but got {ipv6_acl_number}") return - for ipv6_acl in ipv6_acl_list: - if self.inputs.vrf not in ipv6_acl["configuredVrfs"] or self.inputs.vrf not in ipv6_acl["activeVrfs"]: - not_configured_acl_list.append(ipv6_acl["name"]) - if not_configured_acl_list: - self.result.is_failure(f"SNMP IPv6 ACL(s) not configured or active in vrf {self.inputs.vrf}: {not_configured_acl_list}") + + acl_not_configured = [acl["name"] for acl in ipv6_acl_list if self.inputs.vrf not in acl["configuredVrfs"] or self.inputs.vrf not in acl["activeVrfs"]] + + if acl_not_configured: + self.result.is_failure(f"SNMP IPv6 ACL(s) not configured or active in vrf {self.inputs.vrf}: {acl_not_configured}") else: self.result.is_success() class VerifySnmpLocation(AntaTest): - """ - This class verifies the SNMP location of a device. - - Expected results: - * success: The test will pass if the SNMP location matches the provided input. - * failure: The test will fail if the SNMP location does not match the provided input. + """Verifies the SNMP location of a device. + + Expected Results + ---------------- + * Success: The test will pass if the SNMP location matches the provided input. + * Failure: The test will fail if the SNMP location does not match the provided input. + + Examples + -------- + ```yaml + anta.tests.snmp: + - VerifySnmpLocation: + location: New York + ``` """ name = "VerifySnmpLocation" description = "Verifies the SNMP location of a device." - categories = ["snmp"] - commands = [AntaCommand(command="show snmp")] + categories: ClassVar[list[str]] = ["snmp"] + commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show snmp", revision=1)] class Input(AntaTest.Input): - """Defines the input parameters for this test case.""" + """Input model for the VerifySnmpLocation test.""" location: str """Expected SNMP location of the device.""" @AntaTest.anta_test def test(self) -> None: + """Main test function for VerifySnmpLocation.""" location = self.instance_commands[0].json_output["location"]["location"] if location != self.inputs.location: @@ -147,27 +192,36 @@ class VerifySnmpLocation(AntaTest): class VerifySnmpContact(AntaTest): - """ - This class verifies the SNMP contact of a device. - - Expected results: - * success: The test will pass if the SNMP contact matches the provided input. - * failure: The test will fail if the SNMP contact does not match the provided input. + """Verifies the SNMP contact of a device. + + Expected Results + ---------------- + * Success: The test will pass if the SNMP contact matches the provided input. + * Failure: The test will fail if the SNMP contact does not match the provided input. + + Examples + -------- + ```yaml + anta.tests.snmp: + - VerifySnmpContact: + contact: Jon@example.com + ``` """ name = "VerifySnmpContact" description = "Verifies the SNMP contact of a device." - categories = ["snmp"] - commands = [AntaCommand(command="show snmp")] + categories: ClassVar[list[str]] = ["snmp"] + commands: ClassVar[list[AntaCommand | AntaTemplate]] = [AntaCommand(command="show snmp", revision=1)] class Input(AntaTest.Input): - """Defines the input parameters for this test case.""" + """Input model for the VerifySnmpContact test.""" contact: str """Expected SNMP contact details of the device.""" @AntaTest.anta_test def test(self) -> None: + """Main test function for VerifySnmpContact.""" contact = self.instance_commands[0].json_output["contact"]["contact"] if contact != self.inputs.contact: |