AntaTest
AntaTest
¶
AntaTest(device: AntaDevice, inputs: dict[str, Any] | Input | None = None, eos_data: list[dict[str, Any] | str] | None = None)
Bases: ABC
Abstract class defining a test in ANTA.
The goal of this class is to handle the heavy lifting and make writing a test as simple as possible.
Examples
The following is an example of an AntaTest subclass implementation:
class VerifyReachability(AntaTest):
'''Test the network reachability to one or many destination IP(s).'''
categories = ["connectivity"]
commands = [AntaTemplate(template="ping vrf {vrf} {dst} source {src} repeat 2")]
class Input(AntaTest.Input):
hosts: list[Host]
class Host(BaseModel):
dst: IPv4Address
src: IPv4Address
vrf: str = "default"
def render(self, template: AntaTemplate) -> list[AntaCommand]:
return [template.render(dst=host.dst, src=host.src, vrf=host.vrf) for host in self.inputs.hosts]
@AntaTest.anta_test
def test(self) -> None:
failures = []
for command in self.instance_commands:
src, dst = command.params.src, command.params.dst
if "2 received" not in command.json_output["messages"][0]:
failures.append((str(src), str(dst)))
if not failures:
self.result.is_success()
else:
self.result.is_failure(f"Connectivity test failed for the following source-destination pairs: {failures}")
Attributes:
| Name | Type | Description |
|---|---|---|
device |
AntaDevice
|
AntaDevice instance on which this test is run. |
inputs |
Input
|
AntaTest.Input instance carrying the test inputs. |
instance_commands |
list[AntaCommand]
|
List of AntaCommand instances of this test. |
result |
TestResult
|
TestResult instance representing the result of this test. |
logger |
Logger
|
Python logger for this test instance. |
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
device
|
AntaDevice
|
AntaDevice instance on which the test will be run. |
required |
inputs
|
dict[str, Any] | Input | None
|
Dictionary of attributes used to instantiate the AntaTest.Input instance. |
None
|
eos_data
|
list[dict[str, Any] | str] | None
|
Populate outputs of the test commands instead of collecting from devices.
This list must have the same length and order than the |
None
|
failed_commands
property
¶
failed_commands: list[AntaCommand]
Return a list of all the commands that have failed.
Input
¶
Bases: BaseModel
Class defining inputs for a test in ANTA.
Examples
A valid test catalog will look like the following:
<Python module>:
- <AntaTest subclass>:
result_overwrite:
categories:
- "Overwritten category 1"
description: "Test with overwritten description"
custom_field: "Test run by John Doe"
Attributes:
| Name | Type | Description |
|---|---|---|
result_overwrite |
ResultOverwrite | None
|
Define fields to overwrite in the TestResult object. An empty override is treated as omitted. |
Filters
¶
Bases: BaseModel
Runtime filters to map tests with list of tags or devices.
Attributes:
| Name | Type | Description |
|---|---|---|
tags |
set[str] | None
|
Tag of devices on which to run the test. |
serialize_tags
¶
Make sure the tags are always dumped in the same order.
Source code in anta/models.py
457 458 459 460 | |
ResultOverwrite
¶
Bases: BaseModel
Test inputs model to overwrite result fields.
Attributes:
| Name | Type | Description |
|---|---|---|
description |
str | None
|
Overwrite |
categories |
list[str] | None
|
Overwrite |
custom_field |
str | None
|
A free string that will be included in the TestResult object. |
anta_test
staticmethod
¶
Decorate the test() method in child classes.
This decorator implements (in this order):
- Instantiate the command outputs if
eos_datais provided to thetest()method - Collect the commands from the device
- Run the
test()method - Catches any exception in
test()user code and set theresultinstance attribute
Source code in anta/models.py
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 | |
collect
async
¶
collect() -> None
Collect outputs of all commands of this test class from the device of this test instance.
Source code in anta/models.py
628 629 630 631 632 633 634 635 636 637 638 639 | |
render
¶
render(template: AntaTemplate) -> list[AntaCommand]
Render an AntaTemplate instance of this AntaTest using the provided AntaTest.Input instance at self.inputs.
This is not an abstract method because it does not need to be implemented if there is no AntaTemplate for this test.
Source code in anta/models.py
602 603 604 605 606 607 608 609 610 | |
save_commands_data
¶
Populate output of all AntaCommand instances in instance_commands.
Source code in anta/models.py
565 566 567 568 569 570 571 572 573 574 | |
test
abstractmethod
¶
test() -> Coroutine[Any, Any, TestResult]
Core of the test logic.
This is an abstractmethod that must be implemented by child classes.
It must set the correct status of the result instance attribute with the appropriate outcome of the test.
Examples
It must be implemented using the AntaTest.anta_test decorator:
@AntaTest.anta_test
def test(self) -> None:
self.result.is_success()
for command in self.instance_commands:
if not self._test_command(command): # _test_command() is an arbitrary test logic
self.result.is_failure("Failure reason")
Source code in anta/models.py
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 | |
update_progress
classmethod
¶
update_progress() -> None
Update progress bar for all AntaTest objects if it exists.
Source code in anta/models.py
728 729 730 731 732 | |