From 2ee1694d09d47bd0550de17da71dc900052139ae Mon Sep 17 00:00:00 2001 From: "Geetanjali.mane" Date: Tue, 18 Mar 2025 09:12:56 +0000 Subject: [PATCH 1/5] doc(anta.tests): Updated docstrings for VerifyInterfaceUtilization test --- anta/tests/interfaces.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/anta/tests/interfaces.py b/anta/tests/interfaces.py index e291bd688..d636989fc 100644 --- a/anta/tests/interfaces.py +++ b/anta/tests/interfaces.py @@ -34,8 +34,9 @@ class VerifyInterfaceUtilization(AntaTest): Expected Results ---------------- * Success: The test will pass if all interfaces have a usage below the threshold. - * Failure: The test will fail if one or more interfaces have a usage above the threshold. - * Error: The test will error out if the device has at least one non full-duplex interface. + * Failure: If any of the following occur: + - One or more interfaces have a usage above the threshold. + - The device has at least one non full-duplex interface. Examples -------- From a70e7cbcc59234723bb94a0fd0cdcb70f1e36dae Mon Sep 17 00:00:00 2001 From: "Geetanjali.mane" Date: Wed, 19 Mar 2025 11:02:44 +0000 Subject: [PATCH 2/5] Updated testcase with splitting the complex check --- anta/tests/interfaces.py | 18 ++++++++++++------ tests/units/anta_tests/test_interfaces.py | 7 +++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/anta/tests/interfaces.py b/anta/tests/interfaces.py index d636989fc..31360ba3f 100644 --- a/anta/tests/interfaces.py +++ b/anta/tests/interfaces.py @@ -57,7 +57,7 @@ class Input(AntaTest.Input): """Input model for the VerifyInterfaceUtilization test.""" threshold: Percent = 75.0 - """Interface utilization threshold above which the test will fail. Defaults to 75%.""" + """Interface utilization threshold above which the test will fail.""" @AntaTest.anta_test def test(self) -> None: @@ -68,12 +68,18 @@ def test(self) -> None: interfaces = self.instance_commands[1].json_output for intf, rate in rates["interfaces"].items(): + interface_data = [] # The utilization logic has been implemented for full-duplex interfaces only - if ((duplex := (interface := interfaces["interfaces"][intf]).get("duplex", None)) is not None and duplex != duplex_full) or ( - (members := interface.get("memberInterfaces", None)) is not None and any(stats["duplex"] != duplex_full for stats in members.values()) - ): - self.result.is_failure(f"Interface {intf} or one of its member interfaces is not Full-Duplex. VerifyInterfaceUtilization has not been implemented.") - return + if not all([duplex := (interface := interfaces["interfaces"][intf]).get("duplex", None), duplex == duplex_full]): + if (members := interface.get("memberInterfaces", None)) is None: + self.result.is_failure(f"Interface: {intf} - Not full duplex - Expected: {duplex_full} Actual: {duplex}") + continue + interface_data = [(member_interface, state) for member_interface, stats in members.items() if (state := stats["duplex"]) != duplex_full] + + for member_interface in interface_data: + self.result.is_failure( + f"Interface: {intf} MemberInterface: {member_interface[0]} - Not Full-Duplex - Expected: {duplex_full} Actual: {member_interface[1]}" + ) if (bandwidth := interfaces["interfaces"][intf]["bandwidth"]) == 0: self.logger.debug("Interface %s has been ignored due to null bandwidth value", intf) diff --git a/tests/units/anta_tests/test_interfaces.py b/tests/units/anta_tests/test_interfaces.py index 9f4ab1160..b2793cade 100644 --- a/tests/units/anta_tests/test_interfaces.py +++ b/tests/units/anta_tests/test_interfaces.py @@ -656,7 +656,7 @@ "inputs": {"threshold": 70.0}, "expected": { "result": "failure", - "messages": ["Interface Ethernet1/1 or one of its member interfaces is not Full-Duplex. VerifyInterfaceUtilization has not been implemented"], + "messages": ["Interface: Ethernet1/1 - Not full duplex - Expected: duplexFull Actual: duplexHalf"], }, }, { @@ -801,7 +801,10 @@ "inputs": {"threshold": 70.0}, "expected": { "result": "failure", - "messages": ["Interface Port-Channel31 or one of its member interfaces is not Full-Duplex. VerifyInterfaceUtilization has not been implemented"], + "messages": [ + "Interface: Port-Channel31 MemberInterface: Ethernet3/1 - Not Full-Duplex - Expected: duplexFull Actual: duplexHalf", + "Interface: Port-Channel31 MemberInterface: Ethernet4/1 - Not Full-Duplex - Expected: duplexFull Actual: duplexHalf", + ], }, }, { From da5f47104b058e56a0e0b1a3fff3e6a6e9c9096d Mon Sep 17 00:00:00 2001 From: "Geetanjali.mane" Date: Thu, 20 Mar 2025 14:10:48 +0000 Subject: [PATCH 3/5] Added warning in doc and updated test failure message, fxed pylint version --- .pre-commit-config.yaml | 2 +- anta/tests/interfaces.py | 7 +++++-- tests/units/anta_tests/test_interfaces.py | 8 +++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4b734f4b1..499528ffb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,7 +56,7 @@ repos: name: Run Ruff formatter - repo: https://github.com/pycqa/pylint - rev: "v3.3.5" + rev: "v3.3.6" hooks: - id: pylint name: Check code style with pylint diff --git a/anta/tests/interfaces.py b/anta/tests/interfaces.py index 31360ba3f..847abc840 100644 --- a/anta/tests/interfaces.py +++ b/anta/tests/interfaces.py @@ -29,6 +29,8 @@ class VerifyInterfaceUtilization(AntaTest): """Verifies that the utilization of interfaces is below a certain threshold. Load interval (default to 5 minutes) is defined in device configuration. + + !!! warning This test has been implemented for full-duplex interfaces only. Expected Results @@ -72,13 +74,14 @@ def test(self) -> None: # The utilization logic has been implemented for full-duplex interfaces only if not all([duplex := (interface := interfaces["interfaces"][intf]).get("duplex", None), duplex == duplex_full]): if (members := interface.get("memberInterfaces", None)) is None: - self.result.is_failure(f"Interface: {intf} - Not full duplex - Expected: {duplex_full} Actual: {duplex}") + self.result.is_failure(f"Interface: {intf} - Test not implemented for non-full-duplex interfaces - Expected: {duplex_full} Actual: {duplex}") continue interface_data = [(member_interface, state) for member_interface, stats in members.items() if (state := stats["duplex"]) != duplex_full] for member_interface in interface_data: self.result.is_failure( - f"Interface: {intf} MemberInterface: {member_interface[0]} - Not Full-Duplex - Expected: {duplex_full} Actual: {member_interface[1]}" + f"Interface: {intf} Member Interface: {member_interface[0]} - Test not implemented for non-full-duplex interfaces - Expected: {duplex_full}" + " Actual: {member_interface[1]}" ) if (bandwidth := interfaces["interfaces"][intf]["bandwidth"]) == 0: diff --git a/tests/units/anta_tests/test_interfaces.py b/tests/units/anta_tests/test_interfaces.py index b2793cade..778133b24 100644 --- a/tests/units/anta_tests/test_interfaces.py +++ b/tests/units/anta_tests/test_interfaces.py @@ -656,7 +656,7 @@ "inputs": {"threshold": 70.0}, "expected": { "result": "failure", - "messages": ["Interface: Ethernet1/1 - Not full duplex - Expected: duplexFull Actual: duplexHalf"], + "messages": ["Interface: Ethernet1/1 - Test not implemented for non-full-duplex interfaces - Expected: duplexFull Actual: duplexHalf"], }, }, { @@ -802,8 +802,10 @@ "expected": { "result": "failure", "messages": [ - "Interface: Port-Channel31 MemberInterface: Ethernet3/1 - Not Full-Duplex - Expected: duplexFull Actual: duplexHalf", - "Interface: Port-Channel31 MemberInterface: Ethernet4/1 - Not Full-Duplex - Expected: duplexFull Actual: duplexHalf", + "Interface: Port-Channel31 Member Interface: Ethernet3/1 - Test not implemented for non-full-duplex interfaces - Expected: duplexFull " + "Actual: duplexHalf", + "Interface: Port-Channel31 Member Interface: Ethernet4/1 - Test not implemented for non-full-duplex interfaces - Expected: duplexFull " + "Actual: duplexHalf", ], }, }, From 29d39c5044406e0dcf4e085609d455848e2850d3 Mon Sep 17 00:00:00 2001 From: "Geetanjali.mane" Date: Thu, 20 Mar 2025 14:18:02 +0000 Subject: [PATCH 4/5] fixed testcase --- anta/tests/interfaces.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anta/tests/interfaces.py b/anta/tests/interfaces.py index 847abc840..87fc319da 100644 --- a/anta/tests/interfaces.py +++ b/anta/tests/interfaces.py @@ -81,7 +81,7 @@ def test(self) -> None: for member_interface in interface_data: self.result.is_failure( f"Interface: {intf} Member Interface: {member_interface[0]} - Test not implemented for non-full-duplex interfaces - Expected: {duplex_full}" - " Actual: {member_interface[1]}" + f" Actual: {member_interface[1]}" ) if (bandwidth := interfaces["interfaces"][intf]["bandwidth"]) == 0: From 7173cb575c8d231078ff46ae4e60b5996a985a01 Mon Sep 17 00:00:00 2001 From: gmuloc Date: Thu, 20 Mar 2025 15:48:59 +0100 Subject: [PATCH 5/5] Doc: Fix indentation in docstring --- anta/tests/interfaces.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anta/tests/interfaces.py b/anta/tests/interfaces.py index 87fc319da..3ee836e42 100644 --- a/anta/tests/interfaces.py +++ b/anta/tests/interfaces.py @@ -31,7 +31,7 @@ class VerifyInterfaceUtilization(AntaTest): Load interval (default to 5 minutes) is defined in device configuration. !!! warning - This test has been implemented for full-duplex interfaces only. + This test has been implemented for full-duplex interfaces only. Expected Results ----------------