{"library":"pyats-aereport","title":"pyATS AEreport","description":"pyATS AEreport is a sub-component of the Cisco pyATS (Python Automated Test System) ecosystem, specializing in result collection and reporting for network test automation. It integrates seamlessly with pyATS test runs to generate comprehensive HTML reports and other artifacts. pyATS, including AEreport, maintains a rapid release cadence, with updates often occurring monthly to introduce new features, parsers, and bug fixes.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install pyats.aereport","pip install 'pyats[full]'"],"cli":null},"imports":["import pyats.aereport","from pyats import aetest"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport logging\nfrom pyats import aetest\nfrom genie.testbed import load\n\n# Configure logging for better visibility\nlogger = logging.getLogger(__name__)\nlogger.setLevel(logging.INFO)\n\n# Define a simple pyATS AEtest script\nclass CommonSetup(aetest.CommonSetup):\n    @aetest.subsection\n    def connect_to_devices(self, testbed):\n        try:\n            testbed.connect()\n            logger.info(\"Successfully connected to devices.\")\n        except Exception as e:\n            logger.error(f\"Failed to connect to one or more devices: {e}\")\n\nclass MyTestcase(aetest.Testcase):\n    @aetest.test\n    def verify_connectivity(self, testbed):\n        for device in testbed.devices:\n            if device.is_connected():\n                self.passed(f\"Device {device.name} is connected.\")\n            else:\n                self.failed(f\"Device {device.name} is NOT connected.\")\n\nclass CommonCleanup(aetest.CommonCleanup):\n    @aetest.subsection\n    def disconnect_from_devices(self, testbed):\n        for device in testbed.devices:\n            if device.is_connected():\n                device.disconnect()\n                logger.info(f\"Disconnected from device {device.name}.\")\n\nif __name__ == '__main__':\n    # Example Testbed file content (save as 'testbed.yaml')\n    # devices:\n    #   router1:\n    #     connections:\n    #       cli:\n    #         class: unicon.Unicon\n    #         protocol: ssh\n    #         ip: 10.0.0.1 # Replace with your device IP\n    #     credentials:\n    #       default:\n    #         username: cisco\n    #         password: cisco # Use environment variable or pyats secret for production\n\n    # Create a dummy testbed.yaml for demonstration if it doesn't exist\n    testbed_content = \"\"\"\ndevices:\n  loopback_device:\n    type: linux\n    connections:\n      defaults:\n        class: unicon.Unicon\n        protocol: ssh\n        # For a truly runnable example without a real device, mock or avoid connection.\n        # This example assumes a simple mock or a non-connect test for quick demo.\n        # In a real scenario, you'd point to a reachable device or a mocked one.\n    credentials:\n      default:\n        username: {}\n        password: {}\n\"\"\".format(os.environ.get('TEST_USERNAME', 'mockuser'), os.environ.get('TEST_PASSWORD', 'mockpass'))\n\n    with open('testbed.yaml', 'w') as f:\n        f.write(testbed_content)\n\n    # Load the testbed (dummy for this example)\n    testbed = load('testbed.yaml')\n\n    # Run the AEtest job. AEreport automatically collects results.\n    aetest.main(testbed=testbed, ) # You would typically use pyats run job <script.py> for reporting\n    \n    # To view the generated report, run in your terminal:\n    # pyats logs view --latest\n","lang":"python","description":"This quickstart demonstrates a basic pyATS AEtest script that, when executed, implicitly uses pyATS AEreport to collect and format test results. The `pyats logs view --latest` command can then be used in the terminal to open the generated HTML report in a web browser, showcasing AEreport's output.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"25.9","pypi_latest":"26.4","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":70,"avg_install_s":28.7,"avg_import_s":0,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":0.1,"import_time_s":0,"mem_mb":0,"disk_size":"1.2G"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyats.aereport","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0,"mem_mb":0,"disk_size":"100.4M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":58.5,"import_time_s":0,"mem_mb":0,"disk_size":"993M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyats.aereport","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":7.4,"import_time_s":0,"mem_mb":0,"disk_size":"65M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"full","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyats.aereport","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":56.1,"import_time_s":0,"mem_mb":0,"disk_size":"1.1G"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyats.aereport","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":6.1,"import_time_s":0,"mem_mb":0,"disk_size":"69M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"full","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyats.aereport","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":59.2,"import_time_s":0,"mem_mb":0,"disk_size":"1.1G"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyats.aereport","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":5,"import_time_s":0,"mem_mb":0,"disk_size":"61M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"full","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyats.aereport","exit_code":1,"wheel_type":null,"failure_reason":"build_error","import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":56.9,"import_time_s":0,"mem_mb":0,"disk_size":"1.1G"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyats.aereport","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":5.1,"import_time_s":0,"mem_mb":0,"disk_size":"60M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":0.1,"import_time_s":0,"mem_mb":0,"disk_size":"972.1M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyats.aereport","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0,"mem_mb":0,"disk_size":"63.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"full","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":76.8,"import_time_s":0,"mem_mb":0,"disk_size":"1.3G"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyats.aereport","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":12.9,"import_time_s":0,"mem_mb":0,"disk_size":"119M"}]}}