ANTA Test API
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. |
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
436 437 438 439 | |
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
¶
anta_test(
function: F,
) -> Callable[..., Coroutine[Any, Any, TestResult]]
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
610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 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 | |
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
597 598 599 600 601 602 603 604 605 606 607 608 | |
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
571 572 573 574 575 576 577 578 579 | |
save_commands_data
¶
Populate output of all AntaCommand instances in instance_commands.
Source code in anta/models.py
530 531 532 533 534 535 536 537 538 539 | |
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
703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 | |
update_progress
classmethod
¶
update_progress() -> None
Update progress bar for all AntaTest objects if it exists.
Source code in anta/models.py
697 698 699 700 701 | |