summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-10-15 20:30:47 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-10-15 20:32:01 +0000
commite45744e7c5b9916c398fe41273194ffb671fcdac (patch)
tree620ad07a959cf23c8fef76d2967d31eb9c29e6ec /examples
parentReleasing debian version 1.0.0-1. (diff)
downloadanta-e45744e7c5b9916c398fe41273194ffb671fcdac.tar.xz
anta-e45744e7c5b9916c398fe41273194ffb671fcdac.zip
Merging upstream version 1.1.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'examples')
-rw-r--r--examples/README.md42
-rw-r--r--examples/merge_catalogs.py30
-rw-r--r--examples/parse_anta_inventory_file.py34
-rw-r--r--examples/run_eos_commands.py59
-rw-r--r--examples/tests.yaml116
5 files changed, 279 insertions, 2 deletions
diff --git a/examples/README.md b/examples/README.md
index 0800b79..6fc1f4e 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -1,12 +1,52 @@
+# ANTA Example files
+
+This section provides some examples about how to use ANTA as listed in [the documentation](https://anta.arista.com).
+
## Device Inventory
+- Filename: [`inventory.yaml`](./inventory.yaml)
+
The file [inventory.yaml](inventory.yaml) is an example of [device inventory](https://anta.arista.com/stable/usage-inventory-catalog/#create-an-inventory-file).
## Test Catalog
+- Filename: [`tests.yaml`](./tests.yaml)
+
The file [tests.yaml](tests.yaml) is an example of a [test catalog](https://anta.arista.com/stable/usage-inventory-catalog/#test-catalog).
This file should contain all the tests implemented in [anta.tests](../anta/tests) with arbitrary parameters.
-## eos-commands.yaml file
+## Commands to get from snapshot
+
+- Filename: [`eos-commands.yaml file`](./eos-commands.yaml)
The file [eos-commands.yaml](eos-commands.yaml) is an example of input given with the `--commands-list` option to the [anta exec snapshot](https://anta.arista.com/stable/cli/exec/#collect-a-set-of-commands) command.
+
+## ANTA runner in Python
+
+- Filename: [`anta_runner.py`](./anta_runner.py)
+
+The file is an example demonstrating how to run ANTA using a Python script.
+
+## ANTA template for results rendering
+
+- Filename: [`template.j2`](./template.j2)
+
+This file is a simple Jinja2 file to customize ANTA CLI output as documented in [cli documentation](https://anta.arista.com/stable/cli/nrfu/#performing-nrfu-with-custom-reports).
+
+## Merge multiple catalogs
+
+- Filename: [`merge_catalogs.py`](./merge_catalogs.py)
+
+This file is an example demonstrating how to merge multiple catalogs into a single catalog and save it to a file, as documented in [usage test catalog](https://anta.arista.com/stable/usage-inventory-catalog/#example-script-to-merge-catalogs).
+
+## Run multiple commands
+
+- Filename: [`run_eos_commands.py`](./run_eos_commands.py)
+
+This file is an example demonstrating how to run multiple commands on multiple devices, as documented in [advanced usages](https://anta.arista.com/stable/advanced_usages/as-python-lib/#run-eos-commands).
+
+## Parse ANTA inventory file
+
+- Filename: [`parse_anta_inventory_file.py`](./parse_anta_inventory_file.py)
+
+This file is an example demonstrating how to parse an ANTA inventory file, as documented in [advanced usages](https://anta.arista.com/stable/advanced_usages/as-python-lib/#parse-anta-inventory-file). \ No newline at end of file
diff --git a/examples/merge_catalogs.py b/examples/merge_catalogs.py
new file mode 100644
index 0000000..1d594be
--- /dev/null
+++ b/examples/merge_catalogs.py
@@ -0,0 +1,30 @@
+# Copyright (c) 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.
+"""Script that merge a collection of catalogs into one AntaCatalog."""
+
+from pathlib import Path
+
+from anta.catalog import AntaCatalog
+from anta.models import AntaTest
+
+CATALOG_SUFFIX = "-catalog.yml"
+CATALOG_DIR = "intended/test_catalogs/"
+
+if __name__ == "__main__":
+ catalogs = []
+ for file in Path(CATALOG_DIR).glob("*" + CATALOG_SUFFIX):
+ device = str(file).removesuffix(CATALOG_SUFFIX).removeprefix(CATALOG_DIR)
+ print(f"Loading test catalog for device {device}")
+ catalog = AntaCatalog.parse(file)
+ # Add the device name as a tag to all tests in the catalog
+ for test in catalog.tests:
+ test.inputs.filters = AntaTest.Input.Filters(tags={device})
+ catalogs.append(catalog)
+
+ # Merge all catalogs
+ merged_catalog = AntaCatalog.merge_catalogs(catalogs)
+
+ # Save the merged catalog to a file
+ with Path("anta-catalog.yml").open("w") as f:
+ f.write(merged_catalog.dump().yaml())
diff --git a/examples/parse_anta_inventory_file.py b/examples/parse_anta_inventory_file.py
new file mode 100644
index 0000000..fbbe042
--- /dev/null
+++ b/examples/parse_anta_inventory_file.py
@@ -0,0 +1,34 @@
+# Copyright (c) 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.
+"""Script that parses an ANTA inventory file, connects to devices and print their status."""
+
+import asyncio
+
+from anta.inventory import AntaInventory
+
+
+async def main(inv: AntaInventory) -> None:
+ """Read an AntaInventory and try to connect to every device in the inventory.
+
+ Print a message for every device connection status
+ """
+ await inv.connect_inventory()
+
+ for device in inv.values():
+ if device.established:
+ print(f"Device {device.name} is online")
+ else:
+ print(f"Could not connect to device {device.name}")
+
+
+if __name__ == "__main__":
+ # Create the AntaInventory instance
+ inventory = AntaInventory.parse(
+ filename="inventory.yaml",
+ username="arista",
+ password="@rista123",
+ )
+
+ # Run the main coroutine
+ res = asyncio.run(main(inventory))
diff --git a/examples/run_eos_commands.py b/examples/run_eos_commands.py
new file mode 100644
index 0000000..165220f
--- /dev/null
+++ b/examples/run_eos_commands.py
@@ -0,0 +1,59 @@
+# Copyright (c) 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.
+"""Script that runs a list of EOS commands on reachable devices."""
+
+# This is needed to run the script for python < 3.10 for typing annotations
+from __future__ import annotations
+
+import asyncio
+from pprint import pprint
+
+from anta.inventory import AntaInventory
+from anta.models import AntaCommand
+
+
+async def main(inv: AntaInventory, commands: list[str]) -> dict[str, list[AntaCommand]]:
+ """Run a list of commands against each valid device in the inventory.
+
+ Take an AntaInventory and a list of commands as string
+ 1. try to connect to every device in the inventory
+ 2. collect the results of the commands from each device
+
+ Returns
+ -------
+ dict[str, list[AntaCommand]]
+ a dictionary where key is the device name and the value is the list of AntaCommand ran towards the device
+ """
+ await inv.connect_inventory()
+
+ # Make a list of coroutine to run commands towards each connected device
+ coros = []
+ # dict to keep track of the commands per device
+ result_dict = {}
+ for name, device in inv.get_inventory(established_only=True).items():
+ anta_commands = [AntaCommand(command=command, ofmt="json") for command in commands]
+ result_dict[name] = anta_commands
+ coros.append(device.collect_commands(anta_commands))
+
+ # Run the coroutines
+ await asyncio.gather(*coros)
+
+ return result_dict
+
+
+if __name__ == "__main__":
+ # Create the AntaInventory instance
+ inventory = AntaInventory.parse(
+ filename="inventory.yaml",
+ username="arista",
+ password="@rista123",
+ )
+
+ # Create a list of commands with json output
+ command_list = ["show version", "show ip bgp summary"]
+
+ # Run the main asyncio entry point
+ res = asyncio.run(main(inventory, command_list))
+
+ pprint(res)
diff --git a/examples/tests.yaml b/examples/tests.yaml
index cb3d19b..d8f3332 100644
--- a/examples/tests.yaml
+++ b/examples/tests.yaml
@@ -83,10 +83,21 @@ anta.tests.bfd:
multiplier: 3
- VerifyBFDPeersHealth:
down_threshold: 2
+ - VerifyBFDPeersRegProtocols:
+ bfd_peers:
+ - peer_address: 192.0.255.8
+ vrf: default
+ protocols:
+ - bgp
+ - isis
anta.tests.configuration:
- VerifyZeroTouch:
- VerifyRunningConfigDiffs:
+ - VerifyRunningConfigLines:
+ regex_patterns:
+ - "^enable password.*$"
+ - "bla bla"
anta.tests.connectivity:
- VerifyReachability:
@@ -94,9 +105,13 @@ anta.tests.connectivity:
- source: Management1
destination: 1.1.1.1
vrf: MGMT
+ df_bit: True
+ size: 100
- source: Management1
destination: 8.8.8.8
vrf: MGMT
+ df_bit: True
+ size: 100
- VerifyLLDPNeighbors:
neighbors:
- port: Ethernet1
@@ -110,6 +125,21 @@ anta.tests.field_notices:
- VerifyFieldNotice44Resolution:
- VerifyFieldNotice72Resolution:
+anta.tests.flow_tracking:
+ - VerifyHardwareFlowTrackerStatus:
+ trackers:
+ - name: FLOW-TRACKER
+ record_export:
+ on_inactive_timeout: 700000
+ on_interval: 3000000
+ exporters:
+ - name: CV-TELEMETRY
+ local_interface: Loopback11
+ template_interval: 3600
+ - name: CVP-TELEMETRY
+ local_interface: Loopback01
+ template_interval: 36000000
+
anta.tests.greent:
- VerifyGreenT:
- VerifyGreenTCounters:
@@ -191,6 +221,12 @@ anta.tests.interfaces:
- name: Eth2
auto: False
speed: 2.5
+ - VerifyLACPInterfacesStatus:
+ interfaces:
+ - name: Ethernet5
+ portchannel: Port-Channel5
+ - name: Ethernet6
+ portchannel: Port-Channel5
anta.tests.lanz:
- VerifyLANZ:
@@ -324,6 +360,7 @@ anta.tests.security:
destination_address: 100.64.2.2
- source_address: 172.18.3.2
destination_address: 172.18.2.2
+ - VerifyHardwareEntropy:
anta.tests.services:
- VerifyHostname:
@@ -361,6 +398,13 @@ anta.tests.snmp:
location: New York
- VerifySnmpContact:
contact: Jon@example.com
+ - VerifySnmpPDUCounters:
+ pdus:
+ - outTrapPdus
+ - VerifySnmpErrorCounters:
+ error_counters:
+ - inVersionErrs
+ - inBadCommunityNames
anta.tests.software:
- VerifyEOSVersion:
@@ -390,6 +434,8 @@ anta.tests.stp:
instances:
- 10
- 20
+ - VerifyStpTopologyChanges:
+ threshold: 10
anta.tests.stun:
- VerifyStunClient:
@@ -402,6 +448,7 @@ anta.tests.stun:
public_address: 100.64.3.21
source_port: 4500
public_port: 6006
+ - VerifyStunServer:
anta.tests.system:
- VerifyUptime:
@@ -413,6 +460,15 @@ anta.tests.system:
- VerifyMemoryUtilization:
- VerifyFileSystemUtilization:
- VerifyNTP:
+ - VerifyNTPAssociations:
+ ntp_servers:
+ - server_address: 1.1.1.1
+ preferred: True
+ stratum: 1
+ - server_address: 2.2.2.2
+ stratum: 1
+ - server_address: 3.3.3.3
+ stratum: 1
anta.tests.vlan:
- VerifyVlanInternalPolicy:
@@ -505,6 +561,7 @@ anta.tests.routing:
bgp_peers:
- peer_address: 172.30.11.1
vrf: default
+ strict: False
capabilities:
- ipv4Unicast
- VerifyBGPPeerASNCap:
@@ -543,6 +600,36 @@ anta.tests.routing:
vrf: default
hold_time: 180
keep_alive_time: 60
+ - VerifyBGPPeerDropStats:
+ bgp_peers:
+ - peer_address: 10.101.0.4
+ vrf: default
+ drop_stats:
+ - inDropAsloop
+ - inDropClusterIdLoop
+ - inDropMalformedMpbgp
+ - inDropOrigId
+ - inDropNhLocal
+ - inDropNhAfV6
+ - VerifyBGPPeerUpdateErrors:
+ bgp_peers:
+ - peer_address: 10.100.0.8
+ vrf: default
+ update_errors:
+ - inUpdErrWithdraw
+ - inUpdErrIgnore
+ - VerifyBgpRouteMaps:
+ bgp_peers:
+ - peer_address: 10.100.4.1
+ vrf: default
+ inbound_route_map: RM-MLAG-PEER-IN
+ outbound_route_map: RM-MLAG-PEER-IN
+ - VerifyBGPPeerRouteLimit:
+ bgp_peers:
+ - peer_address: 10.100.0.8
+ vrf: default
+ maximum_routes: 12000
+ warning_limit: 10000
ospf:
- VerifyOSPFNeighborState:
- VerifyOSPFNeighborCount:
@@ -573,4 +660,31 @@ anta.tests.routing:
- name: Ethernet1
mode: point-to-point
vrf: default
- # level is set to 2 by default \ No newline at end of file
+ # level is set to 2 by default
+ - VerifyISISSegmentRoutingAdjacencySegments:
+ instances:
+ - name: CORE-ISIS
+ vrf: default
+ segments:
+ - interface: Ethernet2
+ address: 10.0.1.3
+ sid_origin: dynamic
+ - VerifyISISSegmentRoutingDataplane:
+ instances:
+ - name: CORE-ISIS
+ vrf: default
+ dataplane: MPLS
+ - VerifyISISSegmentRoutingTunnels:
+ entries:
+ # Check only endpoint
+ - endpoint: 1.0.0.122/32
+ # Check endpoint and via TI-LFA
+ - endpoint: 1.0.0.13/32
+ vias:
+ - type: tunnel
+ tunnel_id: ti-lfa
+ # Check endpoint and via IP routers
+ - endpoint: 1.0.0.14/32
+ vias:
+ - type: ip
+ nexthop: 1.1.1.1