ANTA Test API
AntaTest
¶
AntaTest(
device: AntaDevice,
inputs: dict[str, Any] | Input | None = None,
eos_data: list[dict[Any, 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[Any, 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
¶
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_data
is provided to thetest()
method - Collect the commands from the device
- Run the
test()
method - Catches any exception in
test()
user code and set theresult
instance attribute
Source code in anta/models.py
602 603 604 605 606 607 608 609 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 |
|
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
589 590 591 592 593 594 595 596 597 598 599 600 |
|
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
563 564 565 566 567 568 569 570 571 |
|
save_commands_data
¶
Populate output of all AntaCommand instances in instance_commands
.
Source code in anta/models.py
522 523 524 525 526 527 528 529 530 531 |
|
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
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 |
|
update_progress
classmethod
¶
update_progress() -> None
Update progress bar for all AntaTest objects if it exists.
Source code in anta/models.py
695 696 697 698 699 |
|