From e054d41a52b516d36d6da0e3e7fac41f230ea452 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Thu, 6 Jun 2024 14:06:43 -0600 Subject: [PATCH 01/81] Onboarding 4.0 contributions --- docs/admin/compatibility_matrix.md | 1 + docs/admin/install.md | 18 +- docs/admin/release_notes/version_4.0.md | 18 + docs/dev/arch_decision.md | 3 + docs/dev/contributing.md | 30 +- docs/dev/dev_environment.md | 20 +- docs/dev/extending.md | 15 +- docs/dev/onboarding_extensions.md | 5 +- docs/user/app_detailed_design.md | 58 + docs/user/app_getting_started.md | 11 +- docs/user/app_overview.md | 57 +- docs/user/app_use_cases.md | 129 +- docs/user/app_use_cases_original.md | 145 + docs/user/app_yaml_overrides.md | 69 + docs/user/external_interactions.md | 3 +- docs/user/faq.md | 13 +- mkdocs.yml | 10 +- nautobot_device_onboarding/choices.py | 7 + nautobot_device_onboarding/datasources.py | 25 + nautobot_device_onboarding/helpers.py | 40 - nautobot_device_onboarding/jinja_filters.py | 148 + .../nornir_plays/empty_inventory.py | 22 + .../nornir_plays/inventory_creator.py | 59 + .../nornir_plays/logger.py | 47 + .../arista_eos/command_getter_result_1.json | 669 + .../sync_devices/expected_result_1.json | 7 + .../expected_result_1.json | 1 + .../expected_result_1.json | 70 + .../expected_result_1.json | 104 + .../expected_result_1.json | 81 + .../cisco_ios/command_getter_result_1.json | 1250 + .../sync_devices/expected_result_1.json | 7 + .../expected_result_1.json | 1 + .../expected_result_1.json | 275 + .../expected_result_1.json | 416 + .../expected_result_1.json | 293 + .../cisco_nxos/command_getter_result_1.json | 6863 ++++ .../sync_devices/expected_result_1.json | 7 + .../expected_result_1.json | 1 + .../expected_result_1.json | 1220 + .../expected_result_1.json | 2549 ++ .../expected_result_1.json | 1405 + .../cisco_wlc/command_getter_result_1.json | 45 + .../sync_devices/expected_result_1.json | 5 + .../cisco_xe/command_getter_result_1.json | 2830 ++ .../sync_devices/expected_result_1.json | 7 + .../expected_result_1.json | 1 + .../expected_result_1.json | 770 + .../expected_result_1.json | 904 + .../expected_result_1.json | 821 + .../tmp_stack_command_getter_result_1.json | 4826 +++ .../mock/command_mappers/mock_cisco_ios.yml | 118 + .../command_getter_result_1.json | 25971 ++++++++++++++++ .../sync_devices/expected_result_1.json | 7 + .../expected_result_1.json | 1 + .../expected_result_1.json | 1120 + .../expected_result_1.json | 1120 + .../expected_result_1.json | 1224 + .../tests/test_command_getter.py | 172 + .../tests/test_empty_inventory.py | 21 + .../tests/test_formatter.py | 678 + .../tests/test_inventory_creator.py | 47 + .../tests/test_jinja_filters.py | 255 + .../tests/test_transform.py | 109 + 64 files changed, 57044 insertions(+), 180 deletions(-) create mode 100755 docs/admin/release_notes/version_4.0.md create mode 100755 docs/dev/arch_decision.md create mode 100755 docs/user/app_detailed_design.md mode change 100644 => 100755 docs/user/app_use_cases.md create mode 100644 docs/user/app_use_cases_original.md create mode 100755 docs/user/app_yaml_overrides.md create mode 100755 nautobot_device_onboarding/choices.py create mode 100755 nautobot_device_onboarding/datasources.py delete mode 100644 nautobot_device_onboarding/helpers.py create mode 100755 nautobot_device_onboarding/jinja_filters.py create mode 100755 nautobot_device_onboarding/nornir_plays/empty_inventory.py create mode 100755 nautobot_device_onboarding/nornir_plays/inventory_creator.py create mode 100755 nautobot_device_onboarding/nornir_plays/logger.py create mode 100755 nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/arista_eos/sync_devices/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_all/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_nxos/command_getter_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_devices/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_all/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vrfs/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_wlc/command_getter_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_wlc/sync_devices/expected_result_1.json create mode 100644 nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/tmp_stack_command_getter_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml create mode 100755 nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/juniper_junos/sync_devices/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_all/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/test_command_getter.py create mode 100755 nautobot_device_onboarding/tests/test_empty_inventory.py create mode 100755 nautobot_device_onboarding/tests/test_formatter.py create mode 100755 nautobot_device_onboarding/tests/test_inventory_creator.py create mode 100755 nautobot_device_onboarding/tests/test_jinja_filters.py create mode 100755 nautobot_device_onboarding/tests/test_transform.py diff --git a/docs/admin/compatibility_matrix.md b/docs/admin/compatibility_matrix.md index d7cf5d30..393b9d51 100644 --- a/docs/admin/compatibility_matrix.md +++ b/docs/admin/compatibility_matrix.md @@ -7,3 +7,4 @@ | 1.2.0 | 1.4.0 | 1.99 | | 2.0.0 | 2.0.0 | 2.99 | | 3.0.0 | 2.0.3 | 2.99 | +| 4.0.0 | 2.2.3 | 2.99 | diff --git a/docs/admin/install.md b/docs/admin/install.md index ad076916..100ef010 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -12,23 +12,13 @@ Here you will find detailed instructions on how to **install** and **configure** ### Access Requirements -#### NAPALM Credentials - -The Onboarding App uses NAPALM. You can configure a default NAPALM username and password in `nautobot_config.py`. - -When `NAPALM_USERNAME`, `NAPALM_PASSWORD` and `NAPALM_ARGS` are configured in `nautobot_config.py`, the user does not have to use the Credentials/SecretGroup fields in the Device Onboarding job, unless they wish to override the values in `nautobot_config.py`: - -```python -# Credentials that Nautobot will use to authenticate to devices when connecting via NAPALM. -NAPALM_USERNAME = "" -NAPALM_PASSWORD = "" -NAPALM_ARGS = {"secret": ""} -``` +- The original OnboardingTask Job used NAPALM Credentials. +- The new SSoT based jobs use Nautobot Secrets in a similar method to other apps. This is a more flexible and supportable way for the future. ## Install Guide !!! note - Apps can be installed from the [Python Package Index](https://pypi.org/) or locally. See the [Nautobot documentation](https://docs.nautobot.com/projects/core/en/stable/user-guide/administration/installation/app-install/) for more details. The pip package name for this app is [`nautobot-device-onboarding`](https://pypi.org/project/nautobot-device-onboarding/). + Apps can be installed manually or using Python's `pip`. See the [nautobot documentation](https://nautobot.readthedocs.io/en/latest/plugins/#install-the-package) for more details. The pip package name for this app is [`nautobot-device-onboarding`](https://pypi.org/project/nautobot-device-onboarding/). The app is available as a Python package via PyPI and can be installed with `pip`: @@ -74,7 +64,7 @@ Then restart (if necessary) the Nautobot services which may include: sudo systemctl restart nautobot nautobot-worker nautobot-scheduler ``` -## App Configuration +## App Configuration (Original) Although the app can run without providing any settings, the app behavior can be controlled with the following list of settings defined in `nautobot_config.py`: diff --git a/docs/admin/release_notes/version_4.0.md b/docs/admin/release_notes/version_4.0.md new file mode 100755 index 00000000..42cc0ca3 --- /dev/null +++ b/docs/admin/release_notes/version_4.0.md @@ -0,0 +1,18 @@ +# v4.0 Release Notes + +!!! warning + Nautobot Device Onboarding v4.0.0 completely revamps the applications design and framework. The original `OnboardingTask` job is still packaged with the app to provide a backwards compatible way for users that have used its extensions framework in the past to solve complex problems. However, that job is now hidden by default to avoid confusion with the two new SSoT based onboarding jobs that v4.0.0 exposes. + +## v4.0.0 TBD + +### Added + +- [#TBD](TBD) - Sync Devices from Network job was added which utilizes the SSoT framework to onboard devices. +- [#TBD](TBD) - Sync Data from Network job was added which utilizes the SSoT framework to onboard devices. +- [#TBD](TBD) - Git Datasource object to be able to use a Git Repo to overload new SSoT job YAML file definitions. +- [#TBD](TBD) - Create a Nornir inventory `EmptyInventory` to support ondemand inventory population for `Sync Devices` job. +- [#TBD](TBD) - Add `nautobot-app-nornir` dependency to reuse `NautobotORMInventory` to support inventory creation for `Sync Data` job. + +### Changed + +- [#TBD](tbd) - The `OnboardingTask` job is changed to `hidden` by default. diff --git a/docs/dev/arch_decision.md b/docs/dev/arch_decision.md new file mode 100755 index 00000000..fa61377f --- /dev/null +++ b/docs/dev/arch_decision.md @@ -0,0 +1,3 @@ +# Architecture Decision Records + +The intention is to document deviations from a standard Model View Controller (MVC) design. And other general Application decisions. diff --git a/docs/dev/contributing.md b/docs/dev/contributing.md index ec88bbd4..c12e83ee 100644 --- a/docs/dev/contributing.md +++ b/docs/dev/contributing.md @@ -1,5 +1,7 @@ # Contributing to the App +Pull requests are welcome and automatically built and tested against multiple version of Python and multiple version of Nautobot through GitHub Actions. + The project is packaged with a light [development environment](dev_environment.md) based on `docker-compose` to help with the local development of the project and to run tests. The project is following Network to Code software development guidelines and is leveraging the following: @@ -41,32 +43,8 @@ All pull requests to `next` or `develop` must include a changelog fragment file ## Branching Policy -The branching policy includes the following tenets: - -- The `develop` branch is the branch of the next major and minor paired version planned. -- PRs intended to add new features should be sourced from the `develop` branch. -- PRs intended to fix issues in the Nautobot LTM compatible release should be sourced from the latest `ltm-` branch instead of `develop`. - -Device Onboarding will observe semantic versioning, as of 1.0. This may result in a quick turnaround in minor versions to keep pace with an ever growing feature set. +Please fork the release and add a new branch to your fork. Make changes to your branch in your fork and submit PRs from there. ## Release Policy -Device Onboarding has currently no intended scheduled release schedule, and will release new features in minor versions. - -When a new release, from `develop` to `main`, is created the following should happen. - -- A release PR is created from `develop` with: - - Update the release notes in `docs/admin/release_notes/version_..md` file to reflect the changes. - - Change the version from `..-beta` to `..` in `pyproject.toml`. - - Set the PR to the `main` branch. -- Ensure the tests for the PR pass. -- Merge the PR. -- Create a new tag: - - The tag should be in the form of `v..`. - - The title should be in the form of `v..`. - - The description should be the changes that were added to the `version_..md` document. -- If merged into `main`, then push from `main` to `develop`, in order to retain the merge commit created when the PR was merged -- A post release PR is created with: - - Change the version from `..` to `..-beta` in both `pyproject.toml` and `nautobot.__init__.__version__`. - - Set the PR to the proper branch, `develop`. - - Once tests pass, merge. +New versions are released as bug fixes and features are introduced. We will make sure to release new versions to support the latest Nautobot versions as necessary. diff --git a/docs/dev/dev_environment.md b/docs/dev/dev_environment.md index d38c140c..b1aad192 100644 --- a/docs/dev/dev_environment.md +++ b/docs/dev/dev_environment.md @@ -74,7 +74,7 @@ nautobot-server migrate !!! note If you want to develop on the latest develop branch of Nautobot, run the following command: `poetry add --optional git+https://github.com/nautobot/nautobot@develop`. After the `@` symbol must match either a branch or a tag. -You can now run `nautobot-server` commands as you would from the [Nautobot documentation](https://docs.nautobot.com/projects/core/en/stable/user-guide/administration/tools/nautobot-server/) for example to start the development server: +You can now run `nautobot-server` commands as you would from the [Nautobot documentation](https://nautobot.readthedocs.io/en/latest/) for example to start the development server: ```shell nautobot-server runserver 0.0.0.0:8080 --insecure @@ -473,21 +473,3 @@ To run an individual test, you can run any or all of the following: ➜ invoke ruff ➜ invoke pylint ``` - -### App Configuration Schema - -In the package source, there is the `nautobot_device_onboarding/app-config-schema.json` file, conforming to the [JSON Schema](https://json-schema.org/) format. This file is used to validate the configuration of the app in CI pipelines. - -If you make changes to `PLUGINS_CONFIG` or the configuration schema, you can run the following command to validate the schema: - -```bash -invoke validate-app-config -``` - -To generate the `app-config-schema.json` file based on the current `PLUGINS_CONFIG` configuration, run the following command: - -```bash -invoke generate-app-config-schema -``` - -This command can only guess the schema, so it's up to the developer to manually update the schema as needed. diff --git a/docs/dev/extending.md b/docs/dev/extending.md index d781f0bc..49e78392 100644 --- a/docs/dev/extending.md +++ b/docs/dev/extending.md @@ -2,8 +2,21 @@ Extending the application is welcome, however it is best to open an issue first, to ensure that a PR would be accepted and makes sense in terms of features and design. -## Customizing Onboarding Behavior With Extensions +## Customizing Onboarding Behavior With Extensions (Original) This plugin provides methods to customize onboarding behavior. By creating onboarding extensions, it is possible to onboard switch stacks, HA pairs and perform other customizations. Please see the dedicated FAQ for [device onboarding extensions](onboarding_extensions.md). + +!!! warn + This is the original onboarding extensions. The next section covers how to extend the new framework. + +## Extending SSoT jobs (Sync Devices From Network, and Sync Network Data From Network) + +Extending the platform support for the SSoT specific jobs should be accomplished with adding a yaml file that defines commands, jdiff jmespaths, and post_processors. A PR into this library is welcomed, but this app exposes the Nautobot core datasource capabilities to be able to load in overrides from a Git repository. + +### Adding Platform/OS Support + +New platform support should be simplified in this framework, by providing a YAML file. + +The format of these YAML files are and how to extend this application is covered in [App YAML Overrides](../user/app_yaml_overrides.md). diff --git a/docs/dev/onboarding_extensions.md b/docs/dev/onboarding_extensions.md index 0e1ab603..2f8deba8 100644 --- a/docs/dev/onboarding_extensions.md +++ b/docs/dev/onboarding_extensions.md @@ -1,4 +1,7 @@ -# Onboarding Extensions +# Onboarding Extensions (Original) + +!!! warn + This is the original onboarding extensions. ## What are onboarding extensions? diff --git a/docs/user/app_detailed_design.md b/docs/user/app_detailed_design.md new file mode 100755 index 00000000..c3bf1d5f --- /dev/null +++ b/docs/user/app_detailed_design.md @@ -0,0 +1,58 @@ +# Network SSoT Detailed Design + +This page will describe the newer SSoT jobs that this App exposes and how they work. + +## Frameworks in Use + +- [Nautobot SSoT](https://docs.nautobot.com/projects/ssot/en/latest/) - Utilzing the existing Nautobot SSoT framework allows a common pattern to be re-used and offers a path forward to add additional support and features. +- [Nautobot App Nornir](https://docs.nautobot.com/projects/plugin-nornir/en/latest/) - Utilized for Nornir Inventory plugins for Nautobot (specifically for Sync Network Data Job). +- [Nornir Netmiko](https://github.com/ktbyers/nornir_netmiko) - Used to execute commands and return results. +- [Jdiff](https://jdiff.readthedocs.io/en/latest/usage/#extract_data_from_json) - Used to simplify parsing required data fields out of command outputs returned from command parser libraries like textFSM. Specifically `extract_data_from_json` method. +- Parsers - Initially NTC Templates via textFSM, but future support for PyATS, TTP, etc. is expected in the future. + +## YAML Definition DSL + +To learn how to extend the app, or update its default YAML definitions visit [Extending and Overriding Platform YAML Files](./app_yaml_overrides.md). + +## How the SSoT **Sync Devices From Network** Job Works + +1. The job is executed with inputs selected. + - List of comma seperated IP/DNS names is provided. + - Other required fields are selected in the job inputs form. + +2. The SSoT framework loads the Nautobot adapter information. +3. The SSoT frameworks network adapater `load()` method calls nornir functionality. + - The job inputs data is passed to the InitNornir initializer, because we only have basic information a custom `EmptyInventory` Nornir inventory plugin is packaged with the App. This get initialized in the `InitNornir` function, but actually initialzes a true inventory that is empty. + - Since `Platform` information may need to be auto-detected before adding a Nornir `Host` object to the inventory, a `create_inventory` function is executed that uses the SSH-Autodetect via Netmiko to try to determine the platform so it can be injected into the `Host` object. + - Finally, all the platform specific commands to run, along with all the jpath, `post_processor` information loaded from the platform specific YAML files must be injected into the Nornir data object to be accessible later in the extract, transform functions. +4. Within the context of a Nornir `with_processor` context manager call the `netmiko_send_commands` Nornir task. + - Access the loaded platform specific YAML data and deduplicate commands to avoid running the same command multiple times. E.g. Multiple required data attributes come from the same show command. +5. Utilize native Nornir Processor to overload functionality on `task_instance_completed()` to run command outputs through extract and transformation functions. + - This essentially is our "ET" portion of a "ETL" process. + - Next, the JSON result from the show command after the parser executes (E.g. textfsm), gets run through the jdiff function `extract_data_from_json()` with the data and the `jpath` from the YAML file definition. + - Finally, an optional `post_processor` jinja2 capable execution can further transform the data for that command before passing it to finish the SSoT syncronizaton. + +## How the SSoT **Sync Network Data From Network** Job Works + +1. The job is executed with inputs selected. + - One or multiple device selection. + - Other required fields are selected in the job inputs form. + - Toggle certain metadata booleans to True if you want more data synced. + +2. The SSoT framework loads the Nautobot adapter information. +3. The SSoT frameworks network adapater `load()` method calls Nornir functionality. + - The job inputs data is passed to the InitNornir initializer, because devices now exist in Nautobot we use `NautobotORMInventory` Nornir inventory plugin comes from `nautobot-plugin-nornir`. + - Finally, all the platform specific `commands` to run, along with all the `jpath`, `post_processor` information loaded from the platform specific YAML files must be injected into the Nornir data object to be accessible later in the extract, transform functions. +4. Within the context of a Nornir `with_processor` context manager call the `netmiko_send_commands` Nornir task. + - Access the loaded platform specific YAML data and deduplicate commands to avoid running the same command multiple times. E.g. Multiple required data attributes come from the same show command. +5. Utilize native Nornir Processor to overload functionality on `subtask_instance_completed()` to run command outputs through extract and transformation functions. + - This essentially is our "ET" portion of a "ETL" process. + - Next, the JSON result from the show command after the parser executes (E.g. textfsm), gets run through the jdiff function `extract_data_from_json()` with the data and the `jpath` from the YAML file definition. + - Finally, an optional `post_processor` jinja2 capable execution can further transform the data for that command before passing it to finish the SSoT syncronizaton. + +## Detailed Design Diagram + +Here are two diagrams detailing the SSoT based jobs in deeper detail. + +![Sync Devices](). +![Sync Network Data](). diff --git a/docs/user/app_getting_started.md b/docs/user/app_getting_started.md index 5c3ba20f..e58b1748 100644 --- a/docs/user/app_getting_started.md +++ b/docs/user/app_getting_started.md @@ -8,6 +8,8 @@ To install the App, please follow the instructions detailed in the [Installation ## First steps with the App +This App exposes an original device onboarding job, as well as two new SSoT based jobs that are considered the future of the App. + ### Prerequisites You will need: @@ -21,9 +23,16 @@ The device must be reachable from the Nautobot and Nautobot worker instances (us Locations are the only other Nautobot prerequisite for the plugin to onboard a device. +!!! info + There are a few other requirements for the new SSoT based jobs, but can also support some defaults. + ### Onboarding a Device -Navigate to the Device Onboarding Job: Jobs > Perform Device Onboarding. +Navigate to the Device Onboarding Job: Jobs > Perform Device Onboarding (original). + +or + +Navigate to the SSoT dashboard and run `Sync Devices` to get basic device and information onboarding, followed by `Sync Network Data` to add additonal details from the network to these devices. E.g. Interfaces, IPs, VRFs, VLANs. ## What are the next steps? diff --git a/docs/user/app_overview.md b/docs/user/app_overview.md index d0172aed..b4758f3c 100644 --- a/docs/user/app_overview.md +++ b/docs/user/app_overview.md @@ -1,6 +1,6 @@ # App Overview -This document provides an overview of the App including critical information and important considerations when applying it to your Nautobot environment. +This document provides an overview of the App including critical information and import considerations when applying it to your Nautobot environment. This [Nautobot](https://github.com/nautobot/nautobot) App allows to easily onboard new devices. @@ -9,6 +9,11 @@ This [Nautobot](https://github.com/nautobot/nautobot) App allows to easily onboa ## Description/Overview +### Original Implementation + +!!! info + The original job and extensions pattern will remain a part of this App for the near future, this will allow custom extensions to continue working without causes issues to users that have taken the time and understand the original framework. The newer SSoT implementation will be discussed in the next section. + The `nautobot-device-onboarding` app uses the [netmiko](https://github.com/ktbyers/netmiko) and [NAPALM](https://napalm.readthedocs.io/en/latest/) libraries to simplify the onboarding process of a new device into Nautobot down to, in many cases, an *IP Address* and a *Location*. In some cases, the user may also have to specify a specific *Device Platform* and *Device Port*. Regardless, the Onboarding App greatly simplifies the onboarding process by allowing the user to specify a small amount of info and having the app populate a much larger amount of device data in Nautobot. @@ -38,6 +43,53 @@ For example, getting the Management IP and Platform data into Nautobot allows a One example of a solution that can retrieve that additional device data and import it into Nautobot is the [Network Importer](https://github.com/networktocode/network-importer). Other options would include an Ansible playbook or a Python script. +### New SSoT Implementation + +The new implementation of device onboarding in this app is utilizing the SSoT framework; the main reasons for providing the new mechanisms were to solve the following challenges: + +- Make it easier to extending and add additonal vendor/OS support. +- Collapse this app and the external [Network Importer](https://github.com/networktocode/network-importer) into the same Nautobot app for simplified device onboarding with more object support.' + - Remove the Batfish dependency. +- Re-use backend plugins and libraries such as `nautobot-app-nornir` to provide the a similar feeling to other plugins like `nautobot-app-golden-config`. +- Utilize SSoT framework and the new `contrib` functionality to speed up development of new features. +- By collapsing: + +Expose two new SSoT based Nautobot jobs to perform the syncing of data. + +1. `Sync Devices From Network` - Takes mininum inputs nearly identical to the original job (IP, Locaiton, SecretGroup), and create a device with bare minium information to be able to manage a device. This job syncs data from the network itself and creates a device with the follow attributes. + - Hostname + - Serial Number + - Device Type + - Platform + - Management Interface + - Management IP address (creates a prefix if one doesn't exist for the IP discovered.) + +2. `Sync Network Data From Network` - From a provided list of existing Nautobot device objects, sync in additional metadata from a network device to enhance the available data from the network in Nautobot. + - All interfaces on the device with plus the attributes below: + - Interface Name + - MTU + - Description + - Interface type (limited support. Default: 'Other') + - Mac Address + - Link Status + - Interface Mode + - VLANs + - Vlans + - Untagged and Tagged + - VRFs + - VRF Names + - Route Distinguishers (RD) + - Cabling (Coming soon...) + +!!! info + For more information look at the provided jsonschema definitions for each of the jobs. + +Additional References: + +- For more information see [App Use Cases](./app_use_cases.md). +- To understand the lower level details of how the Network-SSoT framework is designed see [Network-SSoT Design](./app_detailed_design.md) +- To learn how to add additonal platform/OS support visit [Extending](./external_interactions.md). + ## Audience (User Personas) - Who should use this App? The Onboarding App is meant for new Nautobot users who want to start importing their devices directly rather than from another, existing, source. Even with other sources for device information, they may not include everything that is necessary. @@ -48,7 +100,7 @@ Existing Nautobot users may want to incorporate the Onboarding App as part of on ### Authors -@mzb and @dgarros +@mzb and @dgarros and many other great contributors! ### Maintainers @@ -61,3 +113,4 @@ Existing Nautobot users may want to incorporate the Onboarding App as part of on - Secrets & SecretsGroup - Jobs +- Datasources diff --git a/docs/user/app_use_cases.md b/docs/user/app_use_cases.md old mode 100644 new mode 100755 index a918282d..1c7d30d4 --- a/docs/user/app_use_cases.md +++ b/docs/user/app_use_cases.md @@ -1,37 +1,39 @@ # Using the App -This document describes common use-cases and scenarios for this App. +This document describes common use-cases and scenarios for this App utilizing the exposed SSoT jobs. ## General Usage +This App can be used in three general ways. + +1. Onboard a device with basic information. (Name, Serial, Device Type, Management IP + Interface) +2. Take existing devices and enhace the data for each device by syncing in more metadata. (Interface, VLANs, VRFs etc.) +3. Both 1 and 2 in conjunction with each other. + ### Preparation To properly onboard a device, a user needs to provide, at a minimum: 1. The Device's Location 2. The Device's primary IP address or DNS Name +3. Selecting other attributes metadata needed. (Default statuses, roles, etc.) !!! note - For DNS Name Resolution to work, the instance of Nautobot must be able to resolve the name of the device to IP address. - -If other attributes (`Platform`, `Device Type`, `Role`) are provided in the onboarding job, the app will use provided value for the onboarded device. + For DNS Name Resolution to work, the Celery instance of Nautobot must be able to resolve the name of the device to IP address. If `Platform`, `Device Type` and/or `Role` are not provided, the plugin will try to identify this information automatically and, based on the settings, it can create them in Nautobot as needed. !!! note - If the Platform is provided, it must point to an existing Nautobot Platform. NAPALM driver of this platform will be used only if it is defined for the platform in Nautobot. - To use a preferred NAPALM driver, either define it in Nautobot per platform or in the plugins settings under `platform_map`. + The SSoT jobs use nornir-netmiko to run the show commands defined in the command mappers. #### SSH Autodetect -The `nautobot-device-onboarding` app recognizes platform types with a Netmiko SSH Autodetect mechanism. The user may need to specify additional information for platforms where Netmiko's `ssh_autodetect` feature does not work. +The `nautobot-device-onboarding` apps `Sync Devices` job recognizes platform types with a Netmiko SSH Autodetect mechanism. The user may need to specify additional information for platforms where Netmiko's `ssh_autodetect` feature does not work. [Here is the list](https://github.com/ktbyers/netmiko/blob/v3.4.0/netmiko/ssh_autodetect.py#L50) of platforms supported by `ssh_autodetect`. The `nautobot-device-onboarding` app can be used with any devices that are supported by NAPALM. Even custom NAPALM driver plugins can be used with a bit of effort. -Devices that are supported by NAPALM but are not running SSH or don't have support for `ssh_autodetect` will still work with this app, but will require some additional information in the onboarding job. - The table below shows which common platforms will be SSH auto-detected by default. |Platform |Platform Autodetect| @@ -44,8 +46,7 @@ Arista EOS | No| For the platforms where SSH auto-detection does not work, the user will need to: -1. Manually define a Platform in Nautobot (this will be a one-time task in order to support any number of devices using this Platform) -2. During onboarding, a Port and Platform must explicitly be specified (in addition to the IP and Location) +1. Select the platform in the job inputs form. ### IOS and Junos Auto-Created Platforms @@ -55,91 +56,91 @@ The Onboarding App will automatically create Platforms for vendor operating syst ![juniper_junos_platform](../images/platform_juniper_junos.png) -## Use-cases and common workflows +# Use-cases and common workflows + +## Onboarding a Device -### Create a New Platform +### Onboard a New Device -This section demonstrates how to create a new Platform in the Nautobot UI. Specifically, it offers examples for creating platforms for Cisco `nxapi` and Arista `eos` devices, but the concepts are applicable to any Platform that is manually created. +A new device can be onboarded via : -- In the Nautobot dropdown menu, go to `Devices--> Platforms--> Add/+`. -- Define the attributes for the Platform on this screen and click on the 'Create' button. -- 'Manufacturer' and 'NAPALM arguments' are optional. +- A SSoT job execution. + - Via Jobs menu + - Via SSoT Dashboard +- API, via a `POST` to `/api/extras/jobs/TODO/run` or `/api/extras/jobs/{id}/run` !!! note - Slugs have been deprecated in Nautobot 2. The Platform `Network driver` will now be used to determine the driver to use. - -#### Cisco NXOS Platform + The SSoT Job's ID (UUID) will be different per Nautobot instance. -A Platform that will work with NXOS devices running the `nxapi` feature must have specific values for these attributes: +During a successful onboarding process, a new device will be created in Nautobot with its management interface and its primary IP assigned. The management interface will be discovered on the device based on the IP address provided. -- `Network driver` **SHOULD** be `cisco_nxos`. -- `NAPALM driver` **MUST** be `nxos`. +This SSoT job supports a bulk CSV execution option to speed up this process. -#### Arista EOS Platform +### Consult the Status of the Sync Network Devices SSoT Job -A Platform that will work with Arista EOS devices must have specific values for these attributes: +The status of onboarding jobs can be viewed via the UI (Jobs > Job Results) or retrieved via API (`/api/extras/job-results/`) with each process corresponding to an individual Job-Result object. -- `Network driver` **SHOULD** be `arista_eos`. -- `NAPALM driver` **MUST** be `eos`. +### API +To run the SSoT Sync Devices Job via the api: -### Onboard a New Device -A new device can be onboarded via : +Post to `/api/extras/jobs/TODO/run/` with the relevent onboarding data: -- A job execution. -- API, via a `POST` to `/api/extras/jobs/Perform%20Device%20Onboarding/run` or `/api/extras/jobs/{id}/run` - -!!! note - The Device Onboarding Job's ID (UUID) will be different per Nautobot instance. - -During a successful onboarding process, a new device will be created in Nautobot with its management interface and its primary IP assigned. The management interface will be discovered on the device based on the IP address provided. +```bash +curl -X "POST" /api/extras/jobs/TODO/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"location": "", "ip_address": "", "port": 22, "timeout": 30}} +``` -!!! note - By default, the app is using the credentials defined in the main `nautobot_config.py` for Napalm (`NAPALM_USERNAME`/`NAPALM_PASSWORD`/`NAPALM_ARGS`). It's possible to define specific credentials for each onboarding job execution. +Required Fields: + location: Location UUID + ip_address: String of IP or CSV of IPs + port: Integer + timeout: Integer -### Onboard a Cisco NXOS Device Running the `nxapi` Feature +Optional Fields: + credentials: Secret Group UUID + platform: Platform UUID + role: Role UUID + device_type: Device Type UUID + continue_on_failure: Boolean -When onboarding an NXOS device with the `nxapi` feature, there are a few requirements: +## Onboarding Interface, Vlans, IPs Etc. -- The `Port` must be the same value configured for `nxapi https port` on the Cisco Nexus device -- The `Platform` must be explicitly set to be one with the specific parameters in the [Cisco NXOS Platform](#cisco-nxos-platform) section +### Enhance Existing Device -### Onboarding an Arista EOS Device +A existing devices data can be expanded to include additonal objects by: -When onboarding an Arista EOS device, there are a few requirements: +- A SSoT job execution. + - Via Jobs menu + - Via SSoT Dashboard +- API, via a `POST` to `/api/extras/jobs/TODO/run` or `/api/extras/jobs/{id}/run` -- The `Port` must be the same value configured for HTTPS on the Arista device -- The `Platform` must be explicitly set to be the one with the specific parameters in the [Arista EOS Platform](#arista-eos-platform) section +!!! note + The SSoT Job's ID (UUID) will be different per Nautobot instance. +During a successful network data sync process, a devices related objects will be created in Nautobot with all interfaces, their IP addresses, and optionally VLANs, and VRFs. -### Consult the Status of Onboarding Tasks +### Consult the Status of the Sync Network Data SSoT Job The status of onboarding jobs can be viewed via the UI (Jobs > Job Results) or retrieved via API (`/api/extras/job-results/`) with each process corresponding to an individual Job-Result object. -# API - -!!! note - In V3.0, with the move of the app to a job, the dedicated API views have been removed. This also removes API documentation from the built in Swagger API documentation. +### API -To run an onboarding task Job via the api: +To run the SSoT Sync Devices Job via the api: -Post to `/api/extras/jobs/Perform%20Device%20Onboarding/run/` with the relevent onboarding data: +Post to `/api/extras/jobs/TODO/run/` with the relevent onboarding data: ```bash -curl -X "POST" /api/extras/jobs/Perform%20Device%20Onboarding/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"location": "", "ip_address": "", "port": 22, "timeout": 30}} +curl -X "POST" /api/extras/jobs/TODO/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"devices": ""} ``` Required Fields: - location: Location UUID - ip_address: String of IP or CSV of IPs - port: Integer - timeout: Integer + devices: Location UUID -Optional Fields: - credentials: Secret Group UUID - platform: Platform UUID - role: Role UUID - device_type: Device Type UUID - continue_on_failure: Boolean + +## Using Git(Datasources) to Override the Apps Defaults + +By utilizing the Nautobot core feature `Datasource` the command mappers, jpaths, post_processors for each platform can be overriden. This also gives an easy way for a user to add platform support without having to get those fixes directly upstreamed into this application. + +The format of these YAML files are and how to extend this application is covered in [App YAML Overrides](./app_yaml_overrides.md). diff --git a/docs/user/app_use_cases_original.md b/docs/user/app_use_cases_original.md new file mode 100644 index 00000000..a918282d --- /dev/null +++ b/docs/user/app_use_cases_original.md @@ -0,0 +1,145 @@ +# Using the App + +This document describes common use-cases and scenarios for this App. + +## General Usage + +### Preparation + +To properly onboard a device, a user needs to provide, at a minimum: + +1. The Device's Location +2. The Device's primary IP address or DNS Name + +!!! note + For DNS Name Resolution to work, the instance of Nautobot must be able to resolve the name of the device to IP address. + +If other attributes (`Platform`, `Device Type`, `Role`) are provided in the onboarding job, the app will use provided value for the onboarded device. + +If `Platform`, `Device Type` and/or `Role` are not provided, the plugin will try to identify this information automatically and, based on the settings, it can create them in Nautobot as needed. + +!!! note + If the Platform is provided, it must point to an existing Nautobot Platform. NAPALM driver of this platform will be used only if it is defined for the platform in Nautobot. + To use a preferred NAPALM driver, either define it in Nautobot per platform or in the plugins settings under `platform_map`. + +#### SSH Autodetect + +The `nautobot-device-onboarding` app recognizes platform types with a Netmiko SSH Autodetect mechanism. The user may need to specify additional information for platforms where Netmiko's `ssh_autodetect` feature does not work. + +[Here is the list](https://github.com/ktbyers/netmiko/blob/v3.4.0/netmiko/ssh_autodetect.py#L50) of platforms supported by `ssh_autodetect`. + +The `nautobot-device-onboarding` app can be used with any devices that are supported by NAPALM. Even custom NAPALM driver plugins can be used with a bit of effort. + +Devices that are supported by NAPALM but are not running SSH or don't have support for `ssh_autodetect` will still work with this app, but will require some additional information in the onboarding job. + +The table below shows which common platforms will be SSH auto-detected by default. + +|Platform |Platform Autodetect| +--------------|-------------------- +Juniper/Junos | Yes (when running Netconf over SSH)| +Cisco IOS-XE |Yes| +Cisco NXOS (ssh) | Yes| +Cisco NXOS (nxapi)| No| +Arista EOS | No| + +For the platforms where SSH auto-detection does not work, the user will need to: + +1. Manually define a Platform in Nautobot (this will be a one-time task in order to support any number of devices using this Platform) +2. During onboarding, a Port and Platform must explicitly be specified (in addition to the IP and Location) + +### IOS and Junos Auto-Created Platforms + +The Onboarding App will automatically create Platforms for vendor operating systems where platform auto-detection works. The picture below shows the details of auto-created Platforms for `cisco_ios` and `juniper_junos`. + +![cisco_ios_platform](../images/platform_cisco_ios.png) +![juniper_junos_platform](../images/platform_juniper_junos.png) + + +## Use-cases and common workflows + +### Create a New Platform + +This section demonstrates how to create a new Platform in the Nautobot UI. Specifically, it offers examples for creating platforms for Cisco `nxapi` and Arista `eos` devices, but the concepts are applicable to any Platform that is manually created. + +- In the Nautobot dropdown menu, go to `Devices--> Platforms--> Add/+`. +- Define the attributes for the Platform on this screen and click on the 'Create' button. +- 'Manufacturer' and 'NAPALM arguments' are optional. + +!!! note + Slugs have been deprecated in Nautobot 2. The Platform `Network driver` will now be used to determine the driver to use. + +#### Cisco NXOS Platform + +A Platform that will work with NXOS devices running the `nxapi` feature must have specific values for these attributes: + +- `Network driver` **SHOULD** be `cisco_nxos`. +- `NAPALM driver` **MUST** be `nxos`. + +#### Arista EOS Platform + +A Platform that will work with Arista EOS devices must have specific values for these attributes: + +- `Network driver` **SHOULD** be `arista_eos`. +- `NAPALM driver` **MUST** be `eos`. + + +### Onboard a New Device + +A new device can be onboarded via : + +- A job execution. +- API, via a `POST` to `/api/extras/jobs/Perform%20Device%20Onboarding/run` or `/api/extras/jobs/{id}/run` + +!!! note + The Device Onboarding Job's ID (UUID) will be different per Nautobot instance. + +During a successful onboarding process, a new device will be created in Nautobot with its management interface and its primary IP assigned. The management interface will be discovered on the device based on the IP address provided. + +!!! note + By default, the app is using the credentials defined in the main `nautobot_config.py` for Napalm (`NAPALM_USERNAME`/`NAPALM_PASSWORD`/`NAPALM_ARGS`). It's possible to define specific credentials for each onboarding job execution. + +### Onboard a Cisco NXOS Device Running the `nxapi` Feature + +When onboarding an NXOS device with the `nxapi` feature, there are a few requirements: + +- The `Port` must be the same value configured for `nxapi https port` on the Cisco Nexus device +- The `Platform` must be explicitly set to be one with the specific parameters in the [Cisco NXOS Platform](#cisco-nxos-platform) section + +### Onboarding an Arista EOS Device + +When onboarding an Arista EOS device, there are a few requirements: + +- The `Port` must be the same value configured for HTTPS on the Arista device +- The `Platform` must be explicitly set to be the one with the specific parameters in the [Arista EOS Platform](#arista-eos-platform) section + + +### Consult the Status of Onboarding Tasks + +The status of onboarding jobs can be viewed via the UI (Jobs > Job Results) or retrieved via API (`/api/extras/job-results/`) with each process corresponding to an individual Job-Result object. + +# API + +!!! note + In V3.0, with the move of the app to a job, the dedicated API views have been removed. This also removes API documentation from the built in Swagger API documentation. + +To run an onboarding task Job via the api: + + +Post to `/api/extras/jobs/Perform%20Device%20Onboarding/run/` with the relevent onboarding data: + +```bash +curl -X "POST" /api/extras/jobs/Perform%20Device%20Onboarding/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"location": "", "ip_address": "", "port": 22, "timeout": 30}} +``` + +Required Fields: + location: Location UUID + ip_address: String of IP or CSV of IPs + port: Integer + timeout: Integer + +Optional Fields: + credentials: Secret Group UUID + platform: Platform UUID + role: Role UUID + device_type: Device Type UUID + continue_on_failure: Boolean diff --git a/docs/user/app_yaml_overrides.md b/docs/user/app_yaml_overrides.md new file mode 100755 index 00000000..d86fdab6 --- /dev/null +++ b/docs/user/app_yaml_overrides.md @@ -0,0 +1,69 @@ +# Extending and Overriding Platform YAML Files + +One element of the new SSoT based jobs this app exposes; is the attempt to create a framework that allows the definition of each platforms dependencies in a YAML format. + +## File Format +There are only a few components to the file and they're described below: + +- `ssot job name` - Name of the job to define the commands and metadata needed for that job. (choices: `sync_devices` or `sync_network_data`) +- `root key data name` - Is fully defined in the schema definition. +- `commands` - List of commands to execute in order to get the required data. +- `command` - Actual `show` command to execute. +- `parser` - Whether to use a parser (textfsm, pyats, ttp, etc) alternatively `no` can be used if the platform supports some other method to return structured data. E.g. (`| display json`) or an equivalent. +- `jpath` - The jmespath (specifically jdiffs implementation) to extract the data from the parsed json returned from parser. +- `post_processor` - Jinja2 capable code to further transform the returned data post jpath extraction. + +As an example: + +```yaml +--- +sync_devices: + hostname: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hostname" + post_processor: "{{ obj[0] | upper }}" +..omitted.. +``` + +If there is only one command that needs to be run, the code base also accepts that in a dictionary format. + +```yaml +--- +sync_devices: + hostname: + commands: + command: "show version" + parser: "textfsm" + jpath: "[*].hostname" + post_processor: "{{ obj[0] | upper }}" +..omitted.. +``` + +## Using Datasource to Override + +This App provides sane defaults that have been tested, the files are located in the source code under `command_mappers`. There is potential for these sane defaults to not work in a given environment; alternatively you may want to add additional platform support in your deployment. These are the two main use cases to utilize the datasource feature this app exposes. + +!!! info + To avoid overly complicating the merge logic, the App will always prefer the platform specific YAML file loaded in from the git repository. + +!!! warn + Partial YAML file merging is not supported. Meaning you can't only overload `sync_devices` definition and inherit `sync_network_data` definition. + +### Properly Formatting Git Repository + +When loading from a Git Repository this App is expecting a root directory called `onboarding_command_mappers`. Each of the platform YAML files are then located in this directory. The YAML file names must be named `.yml`. Where network_driver must exist in the netutils mapping exposed from Nautobot core. + +To quickly get a list run: + +```python +from nautobot.dcim.utils import get_all_network_driver_mappings + +sorted(list(get_all_network_driver_mappings().keys())) +``` + +### Setting up the Git Repository + +1. Extensibility -> Git Repositories +2. Create a new repository, most importantly selecting the `Provides` of `Network Sync Job Command Mappers` diff --git a/docs/user/external_interactions.md b/docs/user/external_interactions.md index d167706b..891ddcd8 100644 --- a/docs/user/external_interactions.md +++ b/docs/user/external_interactions.md @@ -6,4 +6,5 @@ This document describes external dependencies and prerequisites for this App to ### From the App to Other Systems -The App uses [netmiko](https://github.com/ktbyers/netmiko) and [NAPALM](https://napalm.readthedocs.io/en/latest/) libraries to connect to network devices. +- The App uses [netmiko](https://github.com/ktbyers/netmiko) and [NAPALM](https://napalm.readthedocs.io/en/latest/) libraries to connect to network devices. +- Git integrations(optional) allow a user to override default Command Getter YAML files. diff --git a/docs/user/faq.md b/docs/user/faq.md index 2cf8fe66..6e9af9ba 100644 --- a/docs/user/faq.md +++ b/docs/user/faq.md @@ -16,7 +16,7 @@ You need to disable automatic platform detection, specify the device platform ty ## Is it possible to disable the automatic creation of Device Type, Device Role or Platform? -**Yes**! Using the plugin settings, it's possible to control individually the creation of `device_role`, `device_type`, `manufacturer` & `platform`. +**Yes** (original)! Using the plugin settings, it's possible to control individually the creation of `device_role`, `device_type`, `manufacturer` & `platform`. ```python # configuration.py @@ -32,12 +32,16 @@ PLUGINS_CONFIG = { } ``` +**Yes** (SSoT)! Using the job for input selections, it's possible to control individually the creation of `device_role`, `device_type`, `manufacturer` & `platform`. + ## How can I update the default credentials used to connect to a device? By default, the plugin uses the credentials defined in the main `nautobot_config.py` for NAPALM (`NAPALM_USERNAME`/`NAPALM_PASSWORD`/`DEVICE_ARGS`). You can update the default credentials in `nautobot_config.py ` or you can provide specific one for each onboarding job via a SecretsGroup. If using SecretsGroup the Access Type for the associated Secrets must be `Generic` and at minimum associated Secrets for `Username` & `Password` are required with `Secret` being optional. !!! warning - If an enable secret is required for the remote device it must be set using above patters. + If an enable secret is required for the remote device it must be set using above patterns. + +For the SSoT onboarding based jobs SecretGroups are required. ## How can I update the optional arguments for NAPALM? @@ -45,10 +49,7 @@ Optional arguments are often used to define a `secret` for Cisco devices and oth ## Does this app support the discovery and the creation of all interfaces and IP Addresses? -**No**. The plugin will only discover and create the management interface and the management IP address. Importing all interfaces and IP addresses is a much larger problem that requires more preparation. This is out of scope of this project. - -!!! tip - We recommend Network Importer tool from Network to Code for a post-onboarding network state synchronization. See [its GitHub repository](https://github.com/networktocode/network-importer) for more details. +**Yes**. The original Deivce Onboarding job/SSot Sync Devices will only discover and create the management interface and the management IP address. Importing all interfaces and IP addresses is available from the SSoT job (Sync Network Data). ## Does this app support the discovery of device based on fqdn? diff --git a/mkdocs.yml b/mkdocs.yml index 7f7534c8..68bb3d8b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -81,11 +81,7 @@ markdown_extensions: anchor_linenums: true - "pymdownx.inlinehilite" - "pymdownx.snippets" - - "pymdownx.superfences": - custom_fences: - - name: "mermaid" - class: "mermaid" - format: !!python/name:pymdownx.superfences.fence_code_format + - "pymdownx.superfences" - "footnotes" plugins: - "search" @@ -106,8 +102,10 @@ nav: - App Overview: "user/app_overview.md" - Getting Started: "user/app_getting_started.md" - Using the App: "user/app_use_cases.md" + - Using the App (Original): "user/app_use_cases_original.md" - Frequently Asked Questions: "user/faq.md" - External Interactions: "user/external_interactions.md" + - Detailed Design: "user/app_detailed_design.md" - Administrator Guide: - Install and Configure: "admin/install.md" - Upgrade: "admin/upgrade.md" @@ -122,9 +120,11 @@ nav: - v1.0: "admin/release_notes/version_1.0.md" - Developer Guide: - Extending the App: "dev/extending.md" + - YAML Overrides: "user/app_yaml_overrides.md" - Onboarding Extensions: "dev/onboarding_extensions.md" - Contributing to the App: "dev/contributing.md" - Development Environment: "dev/dev_environment.md" + - Architecture Decision Records: "dev/arch_decision.md" - Code Reference: - "dev/code_reference/index.md" - Package: "dev/code_reference/package.md" diff --git a/nautobot_device_onboarding/choices.py b/nautobot_device_onboarding/choices.py new file mode 100755 index 00000000..24741fe1 --- /dev/null +++ b/nautobot_device_onboarding/choices.py @@ -0,0 +1,7 @@ +"""Choices used througout the app.""" + +SSOT_JOB_TO_COMMAND_CHOICE = ( + ("sync_devices", "Sync Devices"), + ("sync_network_data", "Sync Network Data"), + ("both", "Both"), +) diff --git a/nautobot_device_onboarding/datasources.py b/nautobot_device_onboarding/datasources.py new file mode 100755 index 00000000..2eda1278 --- /dev/null +++ b/nautobot_device_onboarding/datasources.py @@ -0,0 +1,25 @@ +"""Datasources to override command_mapper yaml files.""" + +from nautobot.apps.datasources import DatasourceContent +from nautobot.extras.choices import LogLevelChoices + + +def refresh_git_command_mappers(repository_record, job_result, delete=False): # pylint: disable=unused-argument + """Callback for gitrepository updates on Command Mapper Repo.""" + job_result.log( + "Successfully Pulled Command Mapper Repo", + level_choice=LogLevelChoices.LOG_DEBUG, + ) + + +datasource_contents = [ + ( + "extras.gitrepository", + DatasourceContent( + name="Network Sync Job Command Mappers", + content_identifier="nautobot_device_onboarding.onboarding_command_mappers", + icon="mdi-paw", + callback=refresh_git_command_mappers, + ), + ) +] diff --git a/nautobot_device_onboarding/helpers.py b/nautobot_device_onboarding/helpers.py deleted file mode 100644 index d0d7bd9c..00000000 --- a/nautobot_device_onboarding/helpers.py +++ /dev/null @@ -1,40 +0,0 @@ -"""OnboardingTask Django model.""" - -import socket - -import netaddr -from netaddr.core import AddrFormatError - -from nautobot_device_onboarding.exceptions import OnboardException - - -def onboarding_task_fqdn_to_ip(address): - """Method to assure OT has FQDN resolved to IP address and rewritten into OT. - - If it is a DNS name, attempt to resolve the DNS address and assign the IP address to the - name. - - Returns: - None - - Raises: - OnboardException("fail-general"): - When a prefix was entered for an IP address - OnboardException("fail-dns"): - When a Name lookup via DNS fails to resolve an IP address - """ - try: - # If successful, this is an IP address and can pass - netaddr.IPAddress(address) - return address - # Raise an Exception for Prefix values - except ValueError as err: - raise OnboardException(f"fail-general - ERROR appears a prefix was entered: {address}") from err - # An AddrFormatError exception means that there is not an IP address in the field, and should continue on - except AddrFormatError: - try: - # Perform DNS Lookup - return socket.gethostbyname(address) - except socket.gaierror as err: - # DNS Lookup has failed, Raise an exception for unable to complete DNS lookup - raise OnboardException(f"fail-dns - ERROR failed to complete DNS lookup: {address}") from err diff --git a/nautobot_device_onboarding/jinja_filters.py b/nautobot_device_onboarding/jinja_filters.py new file mode 100755 index 00000000..6d80f878 --- /dev/null +++ b/nautobot_device_onboarding/jinja_filters.py @@ -0,0 +1,148 @@ +"""Filters for Jinja2 PostProcessing.""" + +from itertools import chain + +from django_jinja import library +from netutils.vlan import vlanconfig_to_list + +from nautobot_device_onboarding.constants import INTERFACE_TYPE_MAP_STATIC + +# https://docs.nautobot.com/projects/core/en/stable/development/apps/api/platform-features/jinja2-filters/ + + +@library.filter +def map_interface_type(interface_type): + """Map interface type to a Nautobot type.""" + return INTERFACE_TYPE_MAP_STATIC.get(interface_type, "other") + + +@library.filter +def extract_prefix(network): + """Extract the prefix length from the IP/Prefix. E.g 192.168.1.1/24.""" + return network.split("/")[-1] + + +@library.filter +def interface_status_to_bool(status): + """Take links or admin status and change to boolean.""" + return "up" in status.lower() + + +@library.filter +def port_mode_to_nautobot(current_mode): + """Take links or admin status and change to boolean.""" + mode_mapping = { + "access": "access", + "trunk": "tagged", + "bridged": "tagged", + "routed": "", + } + return mode_mapping.get(current_mode, "") + + +@library.filter +def key_exist_or_default(dict_obj, key): + """Take a dict with a key and if its not truthy return a default.""" + if not dict_obj.get(key): + return {} + return dict_obj + + +@library.filter +def flatten_list_of_dict_from_value(list_of_dicts, value): + """Takes a list of dictionaries with a value and flattens it.""" + flat_data = {list(item.keys())[0]: item[list(item.keys())[0]][value] for item in list_of_dicts} + return flat_data + + +@library.filter +def flatten_dict_from_value(main_dict, wanted_value): + """Takes a dictionary of dictionaries with a value and flattens it.""" + return {k: v[wanted_value] for k, v in main_dict.items()} + + +@library.filter +def get_entry_from_dict(dict_obj, key): + """Take a dict with a key and return its object.""" + return dict_obj.get(key, "") + + +def _interface_mode_logic(dict_item): # pylint: disable=too-many-return-statements + """Helper for interface_mode_logic to make it more DRY.""" + if dict_item.get("admin_mode"): + if "access" in dict_item["admin_mode"].lower(): + return "access" + if dict_item["admin_mode"] == "trunk" and dict_item["trunking_vlans"] in ["ALL", "1-4094", ["ALL"], ["1-4094"]]: + return "tagged-all" + if dict_item["admin_mode"] == "trunk": + return "tagged" + if "dynamic" in dict_item["admin_mode"]: + if "access" in dict_item["mode"]: + return "access" + if dict_item["mode"] == "trunk" and dict_item["trunking_vlans"] in ["ALL", "1-4094", ["ALL"], ["1-4094"]]: + return "tagged-all" + if dict_item["mode"] == "trunk": + return "tagged" + return "" + + +@library.filter +def interface_mode_logic(item): # pylint: disable=too-many-return-statements + """Logic to translate network modes to nautobot mode.""" + if isinstance(item, dict): + return _interface_mode_logic(item) + if len(item) == 1: + return _interface_mode_logic(item[0]) + return "" + + +@library.filter +def get_vlan_data(item, vlan_mapping): + """Get vlan information from an item.""" + int_mode = interface_mode_logic(item) + current_item = item + if isinstance(item, list) and len(item) == 1: + current_item = item[0] + if current_item: + if int_mode: + if int_mode == "tagged-all": + return [] + if int_mode == "access": + if current_item.get("access_vlan"): + return [ + { + "id": current_item["access_vlan"], + "name": vlan_mapping.get( + str(current_item["access_vlan"]), f"VLAN{str(current_item['access_vlan']).zfill(4)}" + ), + } + ] + if not isinstance(current_item["trunking_vlans"], list): + trunk_vlans = [current_item["trunking_vlans"]] + else: + trunk_vlans = current_item["trunking_vlans"] + return [ + {"id": str(vid), "name": vlan_mapping.get(str(vid), f"VLAN{str(vid).zfill(4)}")} + for vid in list(chain.from_iterable([vlanconfig_to_list(vlan_stanza) for vlan_stanza in trunk_vlans])) + ] + return [] + + +@library.filter +def parse_junos_ip_address(item): + """Parse Junos IP and destination prefix. + + Example: + >>> [{'prefix_length': [], 'ip_address': []}] + >>> [{'prefix_length': ['10.65.229.106/31'], 'ip_address': ['10.65.229.106']}] + >>> [{'prefix_length': ['10.65.133.0/29', '10.65.133.0/29'], 'ip_address': ['10.65.133.1', '10.65.133.3']}] + >>> [{'prefix_length': None, 'ip_address': None}] + """ + if isinstance(item, list) and len(item) > 0: + if item[0]["prefix_length"] and item[0]["ip_address"]: + return [ + {"prefix_length": item[0]["prefix_length"][0].split("/")[-1], "ip_address": item[0]["ip_address"][0]} + ] + if not item[0]["prefix_length"] and item[0]["ip_address"]: + return [{"prefix_length": 32, "ip_address": item[0]["ip_address"][0]}] + return [] diff --git a/nautobot_device_onboarding/nornir_plays/empty_inventory.py b/nautobot_device_onboarding/nornir_plays/empty_inventory.py new file mode 100755 index 00000000..701a4afc --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/empty_inventory.py @@ -0,0 +1,22 @@ +"""Empty Nornir Inventory Plugin.""" + +from nornir.core.inventory import Defaults, Groups, Hosts, Inventory + +from nautobot_device_onboarding.constants import SUPPORTED_NETWORK_DRIVERS +from nautobot_device_onboarding.nornir_plays.transform import add_platform_parsing_info + + +class EmptyInventory: # pylint: disable=too-few-public-methods + """Creates an empty Nornir inventory.""" + + def load(self) -> Inventory: + """Create a default empty inventory.""" + hosts = Hosts() + defaults = Defaults( + data={ + "platform_parsing_info": add_platform_parsing_info(), + "network_driver_mappings": SUPPORTED_NETWORK_DRIVERS, + } + ) + groups = Groups() + return Inventory(hosts=hosts, groups=groups, defaults=defaults) diff --git a/nautobot_device_onboarding/nornir_plays/inventory_creator.py b/nautobot_device_onboarding/nornir_plays/inventory_creator.py new file mode 100755 index 00000000..7254cf49 --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/inventory_creator.py @@ -0,0 +1,59 @@ +"""Inventory Creator and Helpers.""" + +from netmiko import SSHDetect +from nornir.core.inventory import ConnectionOptions, Host + + +def guess_netmiko_device_type(hostname, username, password, port): + """Guess the device type of host, based on Netmiko.""" + netmiko_optional_args = {"port": port} + guessed_device_type = None + + remote_device = { + "device_type": "autodetect", + "host": hostname, + "username": username, + "password": password, + **netmiko_optional_args, + } + guessed_exc = None + try: + guesser = SSHDetect(**remote_device) + guessed_device_type = guesser.autodetect() + + except Exception as err: # pylint: disable=broad-exception-caught + guessed_device_type = None + guessed_exc = err + # Additional checking is done later in the process. We shouldn't reraise an error as it causes the job to fail. + return guessed_device_type, guessed_exc + + +def _set_inventory(host_ip, platform, port, username, password): + """Construct Nornir Inventory.""" + inv = {} + if platform: + platform_guess_exc = None + platform = platform.network_driver_mappings.get("netmiko") + else: + platform, platform_guess_exc = guess_netmiko_device_type(host_ip, username, password, port) + host = Host( + name=host_ip, + hostname=host_ip, + port=int(port), + username=username, + password=password, + platform=platform, + connection_options={ + "netmiko": ConnectionOptions( + hostname=host_ip, + port=int(port), + username=username, + password=password, + platform=platform, + ) + }, + ) + if not platform_guess_exc: + inv.update({host_ip: host}) + + return inv, platform_guess_exc diff --git a/nautobot_device_onboarding/nornir_plays/logger.py b/nautobot_device_onboarding/nornir_plays/logger.py new file mode 100755 index 00000000..ffa4b382 --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/logger.py @@ -0,0 +1,47 @@ +"""Custom logger to support writing to console and db.""" + +import logging +from typing import Any + +LOGGER = logging.getLogger("NORNIR_LOGGER") + +handler = logging.StreamHandler() +handler.setLevel(logging.NOTSET) +LOGGER.addHandler(handler) +LOGGER_ADAPTER = logging.LoggerAdapter(LOGGER, extra={}) + + +class NornirLogger: + """Logger that handles same signature as standard Python Library logging but also write to db.""" + + def __init__(self, job_result, log_level: int): + """Initialize the object.""" + self.job_result = job_result + LOGGER.setLevel(log_level) + + def _logging_helper(self, attr: str, message: str, extra: Any = None): + """Logger helper to set both db and console logs at once.""" + if not extra: + extra = {} + getattr(LOGGER_ADAPTER, attr)(message, extra=extra) + self.job_result.log(message, level_choice=attr) + + def debug(self, message: str, extra: Any = None): + """Match standard Python Library debug signature.""" + self._logging_helper("debug", message, extra) + + def info(self, message: str, extra: Any = None): + """Match standard Python Library info signature.""" + self._logging_helper("info", message, extra) + + def warning(self, message: str, extra: Any = None): + """Match standard Python Library warning signature.""" + self._logging_helper("warning", message, extra) + + def error(self, message: str, extra: Any = None): + """Match standard Python Library error signature.""" + self._logging_helper("error", message, extra) + + def critical(self, message: str, extra: Any = None): + """Match standard Python Library critical signature.""" + self._logging_helper("critical", message, extra) diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json new file mode 100755 index 00000000..cc4d26d8 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json @@ -0,0 +1,669 @@ +{ + "show hostname": [ + { + "fqdn": "veos-0", + "hostname": "veos-0" + } + ], + "show ip interface | json": { + "interfaces": { + "Ethernet1": { + "name": "Ethernet1", + "lineProtocolStatus": "down", + "interfaceStatus": "disabled", + "mtu": 1500, + "interfaceAddressBrief": { + "ipAddr": { + "address": "1.1.1.1", + "maskLen": 24 + } + }, + "ipv4Routable240": false, + "ipv4Routable0": false, + "enabled": false, + "description": "", + "interfaceAddress": { + "primaryIp": { + "address": "1.1.1.1", + "maskLen": 24 + }, + "secondaryIps": {}, + "secondaryIpsOrderedList": [], + "virtualIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "virtualSecondaryIps": {}, + "virtualSecondaryIpsOrderedList": [], + "broadcastAddress": "255.255.255.255", + "dhcp": false + }, + "proxyArp": false, + "proxyArpAllowDefault": false, + "localProxyArp": false, + "gratuitousArp": false, + "routedAddr": "52:54:00:91:1e:bf", + "isVrrpBackup": false, + "vrf": "default", + "urpf": "disable", + "addresslessForwarding": "isInvalid", + "directedBroadcastEnabled": false, + "maxMssIngress": 0, + "maxMssEgress": 0 + }, + "Ethernet4": { + "name": "Ethernet4", + "lineProtocolStatus": "up", + "interfaceStatus": "connected", + "mtu": 1500, + "interfaceAddressBrief": { + "ipAddr": { + "address": "0.0.0.0", + "maskLen": 0 + } + }, + "ipv4Routable240": false, + "ipv4Routable0": false, + "enabled": true, + "description": "", + "interfaceAddress": { + "primaryIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "secondaryIps": {}, + "secondaryIpsOrderedList": [], + "virtualIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "virtualSecondaryIps": {}, + "virtualSecondaryIpsOrderedList": [], + "broadcastAddress": "255.255.255.255", + "dhcp": false + }, + "proxyArp": false, + "proxyArpAllowDefault": false, + "localProxyArp": false, + "gratuitousArp": false, + "routedAddr": "52:54:00:91:1e:bf", + "isVrrpBackup": false, + "vrf": "jeff", + "urpf": "disable", + "addresslessForwarding": "isInvalid", + "directedBroadcastEnabled": false, + "maxMssIngress": 0, + "maxMssEgress": 0 + }, + "Management1": { + "name": "Management1", + "lineProtocolStatus": "up", + "interfaceStatus": "connected", + "mtu": 1500, + "interfaceAddressBrief": { + "ipAddr": { + "address": "10.1.1.219", + "maskLen": 24 + } + }, + "ipv4Routable240": false, + "ipv4Routable0": false, + "enabled": true, + "description": "", + "interfaceAddress": { + "primaryIp": { + "address": "10.1.1.219", + "maskLen": 24 + }, + "secondaryIps": {}, + "secondaryIpsOrderedList": [], + "virtualIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "virtualSecondaryIps": {}, + "virtualSecondaryIpsOrderedList": [], + "broadcastAddress": "255.255.255.255", + "dhcp": true + }, + "proxyArp": false, + "proxyArpAllowDefault": false, + "localProxyArp": false, + "gratuitousArp": false, + "routedAddr": "52:54:00:0d:29:5c", + "isVrrpBackup": false, + "vrf": "default", + "urpf": "disable", + "addresslessForwarding": "isInvalid", + "directedBroadcastEnabled": false, + "maxMssIngress": 0, + "maxMssEgress": 0 + } + } + }, + "show interfaces | json": { + "interfaces": { + "Ethernet1": { + "autoNegotiate": "off", + "bandwidth": 1000000000, + "description": "", + "duplex": "duplexFull", + "forwardingModel": "routed", + "hardware": "ethernet", + "interfaceAddress": [ + { + "broadcastAddress": "255.255.255.255", + "dhcp": false, + "primaryIp": { + "address": "1.1.1.1", + "maskLen": 24 + }, + "secondaryIps": {}, + "secondaryIpsOrderedList": [], + "virtualIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "virtualSecondaryIps": {}, + "virtualSecondaryIpsOrderedList": [] + } + ], + "interfaceCounters": { + "counterRefreshTime": 1716995214.3773513, + "inBroadcastPkts": 0, + "inDiscards": 0, + "inMulticastPkts": 0, + "inOctets": 0, + "inTotalPkts": 0, + "inUcastPkts": 0, + "inputErrorsDetail": { + "alignmentErrors": 0, + "fcsErrors": 0, + "giantFrames": 0, + "runtFrames": 0, + "rxPause": 0, + "symbolErrors": 0 + }, + "linkStatusChanges": 1, + "outBroadcastPkts": 0, + "outDiscards": 0, + "outMulticastPkts": 0, + "outOctets": 0, + "outTotalPkts": 0, + "outUcastPkts": 0, + "outputErrorsDetail": { + "collisions": 0, + "deferredTransmissions": 0, + "lateCollisions": 0, + "txPause": 0 + }, + "totalInErrors": 0, + "totalOutErrors": 0 + }, + "interfaceStatistics": { + "inBitsRate": 0.0, + "inPktsRate": 0.0, + "outBitsRate": 0.0, + "outPktsRate": 0.0, + "updateInterval": 300.0 + }, + "interfaceStatus": "disabled", + "l2Mru": 0, + "l3MtuConfigured": false, + "lanes": 0, + "lastStatusChangeTimestamp": 1716994739.7751265, + "lineProtocolStatus": "down", + "loopbackMode": "loopbackNone", + "mtu": 1500, + "name": "Ethernet1", + "physicalAddress": "52:54:00:91:1e:bf" + }, + "Ethernet2": { + "autoNegotiate": "unknown", + "bandwidth": 1000000000, + "burnedInAddress": "52:54:00:15:b8:13", + "description": "", + "duplex": "duplexFull", + "forwardingModel": "bridged", + "hardware": "ethernet", + "interfaceAddress": [], + "interfaceCounters": { + "counterRefreshTime": 1716995214.3757112, + "inBroadcastPkts": 0, + "inDiscards": 0, + "inMulticastPkts": 0, + "inOctets": 0, + "inTotalPkts": 0, + "inUcastPkts": 0, + "inputErrorsDetail": { + "alignmentErrors": 0, + "fcsErrors": 0, + "giantFrames": 0, + "runtFrames": 0, + "rxPause": 0, + "symbolErrors": 0 + }, + "linkStatusChanges": 2, + "outBroadcastPkts": 0, + "outDiscards": 0, + "outMulticastPkts": 253, + "outOctets": 31869, + "outTotalPkts": 253, + "outUcastPkts": 0, + "outputErrorsDetail": { + "collisions": 0, + "deferredTransmissions": 0, + "lateCollisions": 0, + "txPause": 0 + }, + "totalInErrors": 0, + "totalOutErrors": 0 + }, + "interfaceStatistics": { + "inBitsRate": 0.0, + "inPktsRate": 0.0, + "outBitsRate": 423.5559579645169, + "outPktsRate": 0.42083606943385, + "updateInterval": 300.0 + }, + "interfaceStatus": "connected", + "l2Mru": 0, + "l3MtuConfigured": false, + "lanes": 0, + "lastStatusChangeTimestamp": 1716994739.775847, + "lineProtocolStatus": "up", + "loopbackMode": "loopbackNone", + "mtu": 9214, + "name": "Ethernet2", + "physicalAddress": "52:54:00:15:b8:13" + }, + "Ethernet3": { + "autoNegotiate": "unknown", + "bandwidth": 1000000000, + "burnedInAddress": "52:54:00:07:8d:69", + "description": "", + "duplex": "duplexFull", + "forwardingModel": "bridged", + "hardware": "ethernet", + "interfaceAddress": [], + "interfaceCounters": { + "counterRefreshTime": 1716995214.3780155, + "inBroadcastPkts": 0, + "inDiscards": 0, + "inMulticastPkts": 0, + "inOctets": 0, + "inTotalPkts": 0, + "inUcastPkts": 0, + "inputErrorsDetail": { + "alignmentErrors": 0, + "fcsErrors": 0, + "giantFrames": 0, + "runtFrames": 0, + "rxPause": 0, + "symbolErrors": 0 + }, + "linkStatusChanges": 2, + "outBroadcastPkts": 0, + "outDiscards": 0, + "outMulticastPkts": 253, + "outOctets": 31869, + "outTotalPkts": 253, + "outUcastPkts": 0, + "outputErrorsDetail": { + "collisions": 0, + "deferredTransmissions": 0, + "lateCollisions": 0, + "txPause": 0 + }, + "totalInErrors": 0, + "totalOutErrors": 0 + }, + "interfaceStatistics": { + "inBitsRate": 0.0, + "inPktsRate": 0.0, + "outBitsRate": 423.48082583202245, + "outPktsRate": 0.42075971628723047, + "updateInterval": 300.0 + }, + "interfaceStatus": "connected", + "l2Mru": 0, + "l3MtuConfigured": false, + "lanes": 0, + "lastStatusChangeTimestamp": 1716994739.7754223, + "lineProtocolStatus": "up", + "loopbackMode": "loopbackNone", + "mtu": 9214, + "name": "Ethernet3", + "physicalAddress": "52:54:00:07:8d:69" + }, + "Ethernet4": { + "autoNegotiate": "unknown", + "bandwidth": 1000000000, + "description": "", + "duplex": "duplexFull", + "forwardingModel": "routed", + "hardware": "ethernet", + "interfaceAddress": [ + { + "broadcastAddress": "255.255.255.255", + "dhcp": false, + "primaryIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "secondaryIps": {}, + "secondaryIpsOrderedList": [], + "virtualIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "virtualSecondaryIps": {}, + "virtualSecondaryIpsOrderedList": [] + } + ], + "interfaceCounters": { + "counterRefreshTime": 1716995214.376519, + "inBroadcastPkts": 0, + "inDiscards": 0, + "inMulticastPkts": 0, + "inOctets": 0, + "inTotalPkts": 0, + "inUcastPkts": 0, + "inputErrorsDetail": { + "alignmentErrors": 0, + "fcsErrors": 0, + "giantFrames": 0, + "runtFrames": 0, + "rxPause": 0, + "symbolErrors": 0 + }, + "linkStatusChanges": 2, + "outBroadcastPkts": 0, + "outDiscards": 0, + "outMulticastPkts": 20, + "outOctets": 3119, + "outTotalPkts": 20, + "outUcastPkts": 0, + "outputErrorsDetail": { + "collisions": 0, + "deferredTransmissions": 0, + "lateCollisions": 0, + "txPause": 0 + }, + "totalInErrors": 0, + "totalOutErrors": 0 + }, + "interfaceStatistics": { + "inBitsRate": 0.0, + "inPktsRate": 0.0, + "outBitsRate": 37.37829217160852, + "outPktsRate": 0.0288879875526965, + "updateInterval": 300.0 + }, + "interfaceStatus": "connected", + "l2Mru": 0, + "l3MtuConfigured": false, + "lanes": 0, + "lastStatusChangeTimestamp": 1716994739.7757108, + "lineProtocolStatus": "up", + "loopbackMode": "loopbackNone", + "mtu": 1500, + "name": "Ethernet4", + "physicalAddress": "52:54:00:91:1e:bf" + }, + "Management1": { + "autoNegotiate": "success", + "bandwidth": 1000000000, + "burnedInAddress": "52:54:00:0d:29:5c", + "description": "", + "duplex": "duplexFull", + "forwardingModel": "routed", + "hardware": "ethernet", + "interfaceAddress": [ + { + "broadcastAddress": "255.255.255.255", + "dhcp": true, + "primaryIp": { + "address": "198.51.100.1", + "maskLen": 24 + }, + "secondaryIps": {}, + "secondaryIpsOrderedList": [], + "virtualIp": { + "address": "0.0.0.0", + "maskLen": 0 + }, + "virtualSecondaryIps": {}, + "virtualSecondaryIpsOrderedList": [] + } + ], + "interfaceCounters": { + "counterRefreshTime": 1716995214.3750002, + "inBroadcastPkts": 0, + "inDiscards": 0, + "inMulticastPkts": 0, + "inOctets": 25461, + "inTotalPkts": 324, + "inUcastPkts": 324, + "inputErrorsDetail": { + "alignmentErrors": 0, + "fcsErrors": 0, + "giantFrames": 0, + "runtFrames": 0, + "rxPause": 0, + "symbolErrors": 0 + }, + "linkStatusChanges": 3, + "outBroadcastPkts": 0, + "outDiscards": 0, + "outMulticastPkts": 0, + "outOctets": 9254, + "outTotalPkts": 58, + "outUcastPkts": 58, + "outputErrorsDetail": { + "collisions": 0, + "deferredTransmissions": 0, + "lateCollisions": 0, + "txPause": 0 + }, + "totalInErrors": 0, + "totalOutErrors": 0 + }, + "interfaceStatistics": { + "inBitsRate": 384.26192361587044, + "inPktsRate": 0.573833385078406, + "outBitsRate": 181.06973032559827, + "outPktsRate": 0.1379181549989527, + "updateInterval": 300.0 + }, + "interfaceStatus": "connected", + "l2Mru": 0, + "l3MtuConfigured": false, + "lanes": 0, + "lastStatusChangeTimestamp": 1716994731.7559597, + "lineProtocolStatus": "up", + "loopbackMode": "loopbackNone", + "mtu": 1500, + "name": "Management1", + "physicalAddress": "52:54:00:0d:29:5c" + } + } + }, + "show ip interface brief | json": { + "interfaces": { + "Ethernet1": { + "interfaceAddress": { + "ipAddr": { + "address": "1.1.1.1", + "maskLen": 24 + } + }, + "interfaceStatus": "disabled", + "ipv4Routable0": false, + "ipv4Routable240": false, + "lineProtocolStatus": "down", + "mtu": 1500, + "name": "Ethernet1", + "nonRoutableClassEIntf": false + }, + "Ethernet4": { + "interfaceAddress": { + "ipAddr": { + "address": "0.0.0.0", + "maskLen": 0 + } + }, + "interfaceStatus": "connected", + "ipv4Routable0": false, + "ipv4Routable240": false, + "lineProtocolStatus": "up", + "mtu": 1500, + "name": "Ethernet4", + "nonRoutableClassEIntf": false + }, + "Management1": { + "interfaceAddress": { + "ipAddr": { + "address": "198.51.100.1", + "maskLen": 24 + } + }, + "interfaceStatus": "connected", + "ipv4Routable0": false, + "ipv4Routable240": false, + "lineProtocolStatus": "up", + "mtu": 1500, + "name": "Management1", + "nonRoutableClassEIntf": false + } + } + }, + "show version": [ + { + "free_memory": "1030956", + "hw_version": "", + "image": "4.31.0F", + "model": "vEOS-lab", + "serial_number": "17E1C0B9EEFFCE88C2E0703E4A1D4FB0", + "sys_mac": "5254.0091.1ebf", + "total_memory": "1979668" + } + ], + "show interfaces switchport | json": { + "switchports": { + "Ethernet2": { + "enabled": true, + "switchportInfo": { + "mode": "access", + "phoneTrunk": false, + "macLearning": true, + "tpid": "0x8100", + "tpidStatus": true, + "dot1qVlanTagRequired": false, + "dot1qVlanTagRequiredStatus": false, + "dot1qVlanTagDisallowed": false, + "accessVlanId": 1, + "accessVlanName": "default", + "trunkingNativeVlanId": 1, + "trunkingNativeVlanName": "default", + "trunkAllowedVlans": "ALL", + "dynamicAllowedVlans": {}, + "dynamicBlockedVlans": {}, + "staticTrunkGroups": [], + "dynamicTrunkGroups": [], + "sourceportFilterMode": "enabled", + "vlanForwardingMode": "allowedVlansOnly", + "phoneVlan": 0, + "phoneTrunkUntagged": false, + "mbvaEnabled": false + } + }, + "Ethernet3": { + "enabled": true, + "switchportInfo": { + "mode": "access", + "phoneTrunk": false, + "macLearning": true, + "tpid": "0x8100", + "tpidStatus": true, + "dot1qVlanTagRequired": false, + "dot1qVlanTagRequiredStatus": false, + "dot1qVlanTagDisallowed": false, + "accessVlanId": 1, + "accessVlanName": "default", + "trunkingNativeVlanId": 1, + "trunkingNativeVlanName": "default", + "trunkAllowedVlans": "ALL", + "dynamicAllowedVlans": {}, + "dynamicBlockedVlans": {}, + "staticTrunkGroups": [], + "dynamicTrunkGroups": [], + "sourceportFilterMode": "enabled", + "vlanForwardingMode": "allowedVlansOnly", + "phoneVlan": 0, + "phoneTrunkUntagged": false, + "mbvaEnabled": false + } + }, + "Ethernet4": { + "enabled": true, + "switchportInfo": { + "mode": "trunk", + "phoneTrunk": false, + "macLearning": true, + "tpid": "0x8100", + "tpidStatus": true, + "dot1qVlanTagRequired": false, + "dot1qVlanTagRequiredStatus": false, + "dot1qVlanTagDisallowed": false, + "accessVlanId": 1, + "accessVlanName": "default", + "trunkingNativeVlanId": 1, + "trunkingNativeVlanName": "default", + "trunkAllowedVlans": "2", + "dynamicAllowedVlans": {}, + "dynamicBlockedVlans": {}, + "staticTrunkGroups": [], + "dynamicTrunkGroups": [], + "sourceportFilterMode": "enabled", + "vlanForwardingMode": "allowedVlansOnly", + "phoneVlan": 0, + "phoneTrunkUntagged": false, + "mbvaEnabled": false + } + } + } + }, + "show vlan configured-ports | json": { + "vlans": { + "1": { + "name": "default", + "dynamic": false, + "status": "active", + "interfaces": { + "Ethernet2": { + "privatePromoted": false, + "blocked": null + }, + "Ethernet3": { + "privatePromoted": false, + "blocked": null + } + } + }, + "2": { + "name": "VLAN2", + "dynamic": false, + "status": "active", + "interfaces": {} + }, + "10": { + "name": "vid10", + "dynamic": false, + "status": "active", + "interfaces": {} + } + }, + "sourceDetail": "" + } +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_devices/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_devices/expected_result_1.json new file mode 100755 index 00000000..6d488373 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_devices/expected_result_1.json @@ -0,0 +1,7 @@ +{ + "device_type": "vEOS-lab", + "hostname": "veos-0", + "mask_length": 24, + "mgmt_interface": "Management1", + "serial": "17E1C0B9EEFFCE88C2E0703E4A1D4FB0" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_all/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_all/expected_result_1.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_all/expected_result_1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json new file mode 100755 index 00000000..95c5fb0b --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json @@ -0,0 +1,70 @@ +{ + "interfaces": { + "Ethernet1": { + "802.1Q_mode": "", + "description": [], + "ip_addresses": [ + { + "ip_address": "1.1.1.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "False", + "mac_address": "52:54:00:91:1e:bf", + "mtu": 1500, + "type": "1000base-t" + }, + "Ethernet2": { + "802.1Q_mode": "access", + "description": [], + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:15:b8:13", + "mtu": 9214, + "type": "1000base-t" + }, + "Ethernet3": { + "802.1Q_mode": "access", + "description": [], + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:07:8d:69", + "mtu": 9214, + "type": "1000base-t" + }, + "Ethernet4": { + "802.1Q_mode": "trunk", + "description": [], + "ip_addresses": [ + { + "ip_address": "0.0.0.0", + "prefix_length": 0 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:91:1e:bf", + "mtu": 1500, + "type": "1000base-t" + }, + "Management1": { + "802.1Q_mode": "", + "description": [], + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:0d:29:5c", + "mtu": 1500, + "type": "1000base-t" + } + }, + "serial": "17E1C0B9EEFFCE88C2E0703E4A1D4FB0" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json new file mode 100755 index 00000000..f8a1cc64 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json @@ -0,0 +1,104 @@ +{ + "interfaces": { + "Ethernet1": { + "802.1Q_mode": "", + "description": [], + "ip_addresses": [ + { + "ip_address": "1.1.1.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "False", + "mac_address": "52:54:00:91:1e:bf", + "mtu": 1500, + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet2": { + "802.1Q_mode": "access", + "description": [], + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:15:b8:13", + "mtu": 9214, + "tagged_vlans": [ + { + "id": 1, + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": 1, + "name": "default" + } + }, + "Ethernet3": { + "802.1Q_mode": "access", + "description": [], + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:07:8d:69", + "mtu": 9214, + "tagged_vlans": [ + { + "id": 1, + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": 1, + "name": "default" + } + }, + "Ethernet4": { + "802.1Q_mode": "trunk", + "description": [], + "ip_addresses": [ + { + "ip_address": "0.0.0.0", + "prefix_length": 0 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:91:1e:bf", + "mtu": 1500, + "tagged_vlans": [ + { + "id": "2", + "name": "VLAN2" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": 1, + "name": "default" + } + }, + "Management1": { + "802.1Q_mode": "", + "description": [], + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:0d:29:5c", + "mtu": 1500, + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + } + }, + "serial": "17E1C0B9EEFFCE88C2E0703E4A1D4FB0" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json new file mode 100755 index 00000000..b756789d --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json @@ -0,0 +1,81 @@ +{ + "interfaces": { + "Ethernet1": { + "802.1Q_mode": "", + "description": [], + "ip_addresses": [ + { + "ip_address": "1.1.1.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "False", + "mac_address": "52:54:00:91:1e:bf", + "mtu": 1500, + "type": "1000base-t", + "vrf": { + "name": "default" + } + }, + "Ethernet2": { + "802.1Q_mode": "access", + "description": [], + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:15:b8:13", + "mtu": 9214, + "type": "1000base-t", + "vrf": {} + }, + "Ethernet3": { + "802.1Q_mode": "access", + "description": [], + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:07:8d:69", + "mtu": 9214, + "type": "1000base-t", + "vrf": {} + }, + "Ethernet4": { + "802.1Q_mode": "trunk", + "description": [], + "ip_addresses": [ + { + "ip_address": "0.0.0.0", + "prefix_length": 0 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:91:1e:bf", + "mtu": 1500, + "type": "1000base-t", + "vrf": { + "name": "jeff" + } + }, + "Management1": { + "802.1Q_mode": "", + "description": [], + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": 24 + } + ], + "lag": [], + "link_status": "True", + "mac_address": "52:54:00:0d:29:5c", + "mtu": 1500, + "type": "1000base-t", + "vrf": { + "name": "default" + } + } + }, + "serial": "17E1C0B9EEFFCE88C2E0703E4A1D4FB0" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_1.json new file mode 100755 index 00000000..556253c4 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_1.json @@ -0,0 +1,1250 @@ +{ + "show version": [ + { + "software_image": "C3560CX-UNIVERSALK9-M", + "version": "15.2(7)E9", + "release": "fc1", + "rommon": "Bootstrap", + "hostname": "IOS-SW-1", + "uptime": "18 hours, 30 minutes", + "uptime_years": "", + "uptime_weeks": "", + "uptime_days": "", + "uptime_hours": "18", + "uptime_minutes": "30", + "reload_reason": "power-on", + "running_image": "c3560cx-universalk9-mz.152-7.E9.bin", + "hardware": [ + "WS-C3560CX-12PC-S" + ], + "serial": [ + "FOC2341Y2CQ" + ], + "config_register": "0xF", + "mac_address": [ + "6C:71:0D:1D:35:80" + ], + "restarted": "20:40:50 UTC Thu May 30 2024" + } + ], + "show interfaces": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "EtherSVI", + "mac_address": "6c71.0d1d.35c0", + "bia": "6c71.0d1d.35c0", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan10", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "6c71.0d1d.35c1", + "bia": "6c71.0d1d.35c1", + "description": "", + "ip_address": "198.51.100.1", + "prefix_length": "28", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "2000", + "output_rate": "3000", + "input_pps": "2", + "output_pps": "2", + "input_packets": "261269", + "output_packets": "270430", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3581", + "bia": "6c71.0d1d.3581", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:25", + "last_output": "00:00:01", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "2000", + "input_pps": "0", + "output_pps": "3", + "input_packets": "44714", + "output_packets": "271306", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3582", + "bia": "6c71.0d1d.3582", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:27", + "last_output": "00:00:01", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "2000", + "input_pps": "0", + "output_pps": "3", + "input_packets": "43365", + "output_packets": "272016", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/3", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3583", + "bia": "6c71.0d1d.3583", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:01:02", + "last_output": "00:00:01", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "2000", + "input_pps": "0", + "output_pps": "4", + "input_packets": "35248", + "output_packets": "269609", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/4", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3584", + "bia": "6c71.0d1d.3584", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:33", + "last_output": "00:00:01", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "1000", + "output_rate": "4000", + "input_pps": "1", + "output_pps": "4", + "input_packets": "1249401", + "output_packets": "1178608", + "runts": "3", + "giants": "0", + "input_errors": "10", + "crc": "7", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/5", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3585", + "bia": "6c71.0d1d.3585", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3586", + "bia": "6c71.0d1d.3586", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3587", + "bia": "6c71.0d1d.3587", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/8", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3588", + "bia": "6c71.0d1d.3588", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3589", + "bia": "6c71.0d1d.3589", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/10", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.358a", + "bia": "6c71.0d1d.358a", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/11", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.358b", + "bia": "6c71.0d1d.358b", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/12", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.358c", + "bia": "6c71.0d1d.358c", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/13", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.358d", + "bia": "6c71.0d1d.358d", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/14", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.358e", + "bia": "6c71.0d1d.358e", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/15", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.358f", + "bia": "6c71.0d1d.358f", + "description": "***connection to SW1***", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseSX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "20000", + "output_rate": "11000", + "input_pps": "17", + "output_pps": "6", + "input_packets": "2148367", + "output_packets": "1666583", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/16", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "6c71.0d1d.3590", + "bia": "6c71.0d1d.3590", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "Not Present", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + } + ], + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [ + "Gi0/5", + "Gi0/6", + "Gi0/7", + "Gi0/8", + "Gi0/9", + "Gi0/10", + "Gi0/11", + "Gi0/12", + "Gi0/13", + "Gi0/14", + "Gi0/16" + ] + }, + { + "vlan_id": "10", + "vlan_name": "DATA", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "100", + "vlan_name": "VLAN0100", + "status": "active", + "interfaces": [ + "Gi0/1", + "Gi0/2", + "Gi0/3", + "Gi0/4" + ] + }, + { + "vlan_id": "900", + "vlan_name": "VLAN0900", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "1002", + "vlan_name": "fddi-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1003", + "vlan_name": "token-ring-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1004", + "vlan_name": "fddinet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1005", + "vlan_name": "trnet-default", + "status": "act/unsup", + "interfaces": [] + } + ], + "show interfaces switchport": [ + { + "interface": "Gi0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "100", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "100", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "100", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "100", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/15", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "900", + "voice_vlan": "none", + "trunking_vlans": [ + "2,3,5,10,100,170,251,700,900" + ] + }, + { + "interface": "Gi0/16", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + } + ], + "show etherchannel summary": [], + "show ip interface": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan10", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "198.51.100.1" + ], + "prefix_length": [ + "28" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/3", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/4", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/5", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/11", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/12", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/13", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/14", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/15", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_1.json new file mode 100755 index 00000000..e6890a88 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_1.json @@ -0,0 +1,7 @@ +{ + "device_type": "WS-C3560CX-12PC-S", + "hostname": "IOS-SW-1", + "mask_length": 28, + "mgmt_interface": "Vlan10", + "serial": "FOC2341Y2CQ" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_1.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json new file mode 100755 index 00000000..b14ca27c --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json @@ -0,0 +1,275 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3581", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/11": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/12": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/13": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/14": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/15": { + "802.1Q_mode": "tagged", + "description": "***connection to SW1***", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.358f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/16": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3590", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3582", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3583", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3584", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3585", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3586", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3587", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3588", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3589", + "mtu": "1500", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.35c0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.35c1", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FOC2341Y2CQ" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json new file mode 100755 index 00000000..ca790922 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json @@ -0,0 +1,416 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3581", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "100", + "name": "VLAN0100" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/11": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/12": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/13": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/14": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/15": { + "802.1Q_mode": "tagged", + "description": "***connection to SW1***", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.358f", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "10", + "name": "DATA" + }, + { + "id": "100", + "name": "VLAN0100" + }, + { + "id": "170", + "name": "VLAN0170" + }, + { + "id": "251", + "name": "VLAN0251" + }, + { + "id": "700", + "name": "VLAN0700" + }, + { + "id": "900", + "name": "VLAN0900" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "900", + "name": "VLAN0900" + } + }, + "GigabitEthernet0/16": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3590", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3582", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "100", + "name": "VLAN0100" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3583", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "100", + "name": "VLAN0100" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3584", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "100", + "name": "VLAN0100" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3585", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3586", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3587", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3588", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3589", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.35c0", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.35c1", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + } + }, + "serial": "FOC2341Y2CQ" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json new file mode 100755 index 00000000..96962297 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json @@ -0,0 +1,293 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3581", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/11": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/12": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/13": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/14": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/15": { + "802.1Q_mode": "tagged", + "description": "***connection to SW1***", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.358f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/16": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3590", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3582", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3583", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3584", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3585", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3586", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3587", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3588", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3589", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.35c0", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.35c1", + "mtu": "1500", + "type": "virtual", + "vrf": {} + } + }, + "serial": "FOC2341Y2CQ" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/command_getter_result_1.json new file mode 100755 index 00000000..6d09e2a6 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/command_getter_result_1.json @@ -0,0 +1,6863 @@ +{ + "show version": [ + { + "uptime": "1811 day(s), 10 hour(s), 11 minute(s), 53 second(s)", + "last_reboot_reason": "Reset due to upgrade", + "os": "7.0(3)I7(4)", + "boot_image": "bootflash:///nxos.7.0.3.I7.4.bin", + "platform": "C9372PX", + "hostname": "N9k-01", + "serial": "FDO20432435" + } + ], + "show inventory": [ + { + "name": "Chassis", + "descr": "Nexus9000 C9372PX chassis", + "pid": "N9K-C9372PX-E", + "vid": "V01", + "sn": "FDO20432435" + }, + { + "name": "Slot 1", + "descr": "48x1/10G SFP+ 6x40G Ethernet Module", + "pid": "N9K-C9372PX-E", + "vid": "V01", + "sn": "FDO20432435" + }, + { + "name": "Power Supply 1", + "descr": "Nexus9000 C9372PX chassis Power Supply", + "pid": "N9K-PAC-650W-B", + "vid": "V01", + "sn": "LIT20383APQ" + }, + { + "name": "Power Supply 2", + "descr": "Nexus9000 C9372PX chassis Power Supply", + "pid": "N9K-PAC-650W-B", + "vid": "V01", + "sn": "LIT20383APR" + }, + { + "name": "Fan 1", + "descr": "Nexus9000 C9372PX chassis Fan Module", + "pid": "NXA-FAN-30CFM-F", + "vid": "V01", + "sn": "N/A" + }, + { + "name": "Fan 2", + "descr": "Nexus9000 C9372PX chassis Fan Module", + "pid": "NXA-FAN-30CFM-F", + "vid": "V01", + "sn": "N/A" + }, + { + "name": "Fan 3", + "descr": "Nexus9000 C9372PX chassis Fan Module", + "pid": "NXA-FAN-30CFM-F", + "vid": "V01", + "sn": "N/A" + }, + { + "name": "Fan 4", + "descr": "Nexus9000 C9372PX chassis Fan Module", + "pid": "NXA-FAN-30CFM-F", + "vid": "V01", + "sn": "N/A" + } + ], + "show ip interface brief vrf all": [ + { + "vrf": "default", + "interface": "Vlan64", + "ip_address": "10.34.6.126", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan66", + "ip_address": "10.27.66.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan67", + "ip_address": "10.27.67.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan68", + "ip_address": "10.27.68.3", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan70", + "ip_address": "10.27.70.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan71", + "ip_address": "10.27.71.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan72", + "ip_address": "10.27.72.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan110", + "ip_address": "10.34.1.67", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan115", + "ip_address": "10.34.1.83", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan128", + "ip_address": "10.34.6.133", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan135", + "ip_address": "10.27.135.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan136", + "ip_address": "144.5.136.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan160", + "ip_address": "10.34.6.174", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan176", + "ip_address": "10.34.6.190", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan192", + "ip_address": "10.34.6.198", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan200", + "ip_address": "10.27.111.19", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan201", + "ip_address": "10.27.73.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan202", + "ip_address": "10.27.111.42", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan210", + "ip_address": "10.27.111.98", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan215", + "ip_address": "10.27.57.131", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan216", + "ip_address": "10.27.57.195", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan218", + "ip_address": "10.27.218.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan219", + "ip_address": "10.27.219.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan220", + "ip_address": "10.27.59.243", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan345", + "ip_address": "10.34.5.174", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "default", + "interface": "Vlan350", + "ip_address": "139.65.137.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan3130", + "ip_address": "172.22.8.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Vlan3146", + "ip_address": "10.27.197.131", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Lo0", + "ip_address": "10.27.111.247", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Po41", + "ip_address": "10.1.0.2", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Eth1/1.1", + "ip_address": "139.65.22.246", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Eth1/2.1", + "ip_address": "139.65.22.250", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "default", + "interface": "Eth1/28.2", + "ip_address": "172.16.0.2", + "status": "admin-up", + "link": "link-down", + "proto": "protocol-down" + }, + { + "vrf": "management", + "interface": "mgmt0", + "ip_address": "198.51.100.1", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "Servers", + "interface": "Vlan63", + "ip_address": "10.27.63.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "Servers", + "interface": "Vlan214", + "ip_address": "10.27.111.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up" + }, + { + "vrf": "NFS", + "interface": "Vlan3112", + "ip_address": "172.22.32.1", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down" + } + ], + "show ip interface vrf all": [ + { + "vrf": "default", + "interface": "Vlan64", + "ip_address": "10.34.6.126", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.34.6.64/26", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.102", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan66", + "ip_address": "10.27.66.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.66.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.102", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan67", + "ip_address": "10.27.67.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.67.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.2", + "224.0.0.1", + "224.0.0.102" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan68", + "ip_address": "10.27.68.3", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.27.68.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.13", + "224.0.0.1", + "224.0.0.102" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan70", + "ip_address": "10.27.70.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.70.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.2", + "224.0.0.1", + "224.0.0.102" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan71", + "ip_address": "10.27.71.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.71.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan72", + "ip_address": "10.27.72.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.72.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.102", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan110", + "ip_address": "10.34.1.67", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.34.1.64/28", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.2", + "224.0.0.1", + "224.0.0.102" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan115", + "ip_address": "10.34.1.83", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.34.1.80/28", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.1", + "224.0.0.102", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan128", + "ip_address": "10.34.6.133", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.34.6.128/27", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.1", + "224.0.0.102", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan135", + "ip_address": "10.27.135.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.135.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.1", + "224.0.0.102", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan136", + "ip_address": "144.5.136.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "144.5.136.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.2", + "224.0.0.1", + "224.0.0.102" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan160", + "ip_address": "10.34.6.174", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.34.6.160/28", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.1", + "224.0.0.102", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan176", + "ip_address": "10.34.6.190", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.34.6.176/28", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.1", + "224.0.0.102", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan192", + "ip_address": "10.34.6.198", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.34.6.192/29", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.1", + "224.0.0.13", + "224.0.0.102" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan200", + "ip_address": "10.27.111.19", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.111.16/29", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "enabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan201", + "ip_address": "10.27.73.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.73.0/29", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan202", + "ip_address": "10.27.111.42", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.111.40/29", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan210", + "ip_address": "10.27.111.98", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.111.96/29", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan215", + "ip_address": "10.27.57.131", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.57.128/26", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan216", + "ip_address": "10.27.57.195", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.57.192/26", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan218", + "ip_address": "10.27.218.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.218.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.2", + "224.0.0.1", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan219", + "ip_address": "10.27.219.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.219.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.2", + "224.0.0.1", + "224.0.0.102" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan220", + "ip_address": "10.27.59.243", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.59.240/29", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan345", + "ip_address": "10.34.5.174", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "10.34.5.160/28", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.2", + "224.0.0.13", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan350", + "ip_address": "139.65.137.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "139.65.137.0/26", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan3130", + "ip_address": "172.22.8.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "172.22.8.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.2", + "224.0.0.1", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Vlan3146", + "ip_address": "10.27.197.131", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.197.128/25", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "loopback0", + "ip_address": "10.27.111.247", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.111.247/32", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "port-channel41", + "ip_address": "10.1.0.2", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.1.0.0/30", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Ethernet1/1.1", + "ip_address": "139.65.22.246", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "139.65.22.244/30", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Ethernet1/2.1", + "ip_address": "139.65.22.250", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "139.65.22.248/30", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "default", + "interface": "Ethernet1/28.2", + "ip_address": "172.16.0.2", + "status": "admin-up", + "link": "link-down", + "proto": "protocol-down", + "subnet": "172.16.0.2/31", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "management", + "interface": "mgmt0", + "ip_address": "198.51.100.1", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.65.0/24", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "Servers", + "interface": "Vlan63", + "ip_address": "10.27.63.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.63.0/25", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.102", + "224.0.0.13", + "224.0.0.2", + "224.0.0.1" + ], + "mtu": "9216", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "enabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "enabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "Servers", + "interface": "Vlan214", + "ip_address": "10.27.111.3", + "status": "admin-up", + "link": "link-up", + "proto": "protocol-up", + "subnet": "10.27.111.0/29", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "224.0.0.2", + "224.0.0.1", + "224.0.0.13" + ], + "mtu": "1500", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "enabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "enabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + }, + { + "vrf": "NFS", + "interface": "Vlan3112", + "ip_address": "172.22.32.1", + "status": "admin-down", + "link": "link-down", + "proto": "protocol-down", + "subnet": "172.22.32.0/21", + "route_pref": "0", + "route_tag": "0", + "broadcast": "255.255.255.255", + "multicast_groups": [ + "none" + ], + "mtu": "9216", + "proxy_arp": "disabled", + "ip_local_proxy_arp": "disabled", + "multicast_routing": "disabled", + "icmp_redirects": "disabled", + "ip_directed_broadcast": "disabled", + "ip_forwarding": "disabled", + "icmp_unreachables": "disabled", + "icmp_port_unreachables": "enabled", + "ip_unicast_rpf": "none", + "ip_load_sharing": "none", + "wccp_redirect_outbound": "disabled", + "wccp_redirect_inbound": "disabled", + "wccp_redirect_exclude": "disabled", + "secondary_ip_address": [], + "secondary_ip_subnet": [], + "secondary_route_pref": [], + "secondary_route_tag": [], + "acl_out": "", + "unnumbered_parent_intf": "", + "unnumbered_child_intfs": [] + } + ], + "show interface": [ + { + "interface": "mgmt0", + "link_status": "up", + "admin_state": "up", + "hardware_type": "GigabitEthernet", + "mac_address": "286f.7f7e.99e4", + "bia": "286f.7f7e.99e4", + "description": "a description", + "ip_address": "198.51.100.1", + "prefix_length": "24", + "mtu": "1500", + "mode": "", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Ethernet1/1", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.99ec", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "997526772472", + "output_packets": "581400270782", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "100week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/1.1", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.99ec", + "description": "a description", + "ip_address": "139.65.22.246", + "prefix_length": "30", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "802.1Q", + "last_link_flapped": "", + "vlan_id": "903" + }, + { + "interface": "Ethernet1/2", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.99ed", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "2132046802967", + "output_packets": "2556135548245", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "101week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/2.1", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.99ed", + "description": "a description", + "ip_address": "139.65.22.250", + "prefix_length": "30", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "802.1Q", + "last_link_flapped": "", + "vlan_id": "904" + }, + { + "interface": "Ethernet1/3", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99ee", + "bia": "286f.7f7e.99ee", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/4", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99ef", + "bia": "286f.7f7e.99ef", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "2419287017402", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "138week(s) 3day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/5", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f0", + "bia": "286f.7f7e.99f0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "65314238", + "output_packets": "133985219", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "56week(s) 2day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/6", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f1", + "bia": "286f.7f7e.99f1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "70952159970", + "output_packets": "100548427863", + "input_errors": "1", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "10week(s) 0day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/7", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f2", + "bia": "286f.7f7e.99f2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "4490743509", + "output_packets": "28169458376", + "input_errors": "48", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "193week(s) 6day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/8", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f3", + "bia": "286f.7f7e.99f3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "3284639149", + "output_packets": "12391032021", + "input_errors": "61", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "193week(s) 6day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/9", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f4", + "bia": "286f.7f7e.99f4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "22196412858", + "output_packets": "23428521373", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "187week(s) 0day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/10", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f5", + "bia": "286f.7f7e.99f5", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "24858583807", + "output_packets": "16227017943", + "input_errors": "12", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "187week(s) 0day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/11", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f6", + "bia": "286f.7f7e.99f6", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/12", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f7", + "bia": "286f.7f7e.99f7", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/13", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f8", + "bia": "286f.7f7e.99f8", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/14", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99f9", + "bia": "286f.7f7e.99f9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/15", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99fa", + "bia": "286f.7f7e.99fa", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/16", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99fb", + "bia": "286f.7f7e.99fb", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/17", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99fc", + "bia": "286f.7f7e.99fc", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/18", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99fd", + "bia": "286f.7f7e.99fd", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/19", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99fe", + "bia": "286f.7f7e.99fe", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/20", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99ff", + "bia": "286f.7f7e.99ff", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/21", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a00", + "bia": "286f.7f7e.9a00", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/22", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a01", + "bia": "286f.7f7e.9a01", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/23", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a02", + "bia": "286f.7f7e.9a02", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/24", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a03", + "bia": "286f.7f7e.9a03", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "3409513878", + "output_packets": "2086988573", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "10week(s) 3day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/25", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a04", + "bia": "286f.7f7e.9a04", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/26", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a05", + "bia": "286f.7f7e.9a05", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/27", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a06", + "bia": "286f.7f7e.9a06", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/28", + "link_status": "down (Administratively down)", + "admin_state": "down", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.9a07", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "auto-duplex", + "speed": "1000 Mb/s", + "input_packets": "283625545", + "output_packets": "284394564", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "24week(s) 0day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/28.2", + "link_status": "down (Parent Interface Admin down)", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.9a07", + "description": "a description", + "ip_address": "172.16.0.2", + "prefix_length": "31", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "802.1Q", + "last_link_flapped": "", + "vlan_id": "2" + }, + { + "interface": "Ethernet1/29", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a08", + "bia": "286f.7f7e.9a08", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "690958667732", + "output_packets": "733836099859", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/30", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a09", + "bia": "286f.7f7e.9a09", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "877736768668", + "output_packets": "750451049269", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/31", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a0a", + "bia": "286f.7f7e.9a0a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "353292832527", + "output_packets": "749635353509", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/32", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a0b", + "bia": "286f.7f7e.9a0b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "278382231526", + "output_packets": "753122266966", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/33", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a0c", + "bia": "286f.7f7e.9a0c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "186792950699", + "output_packets": "124468230706", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "10week(s) 3day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/34", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a0d", + "bia": "286f.7f7e.9a0d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "158151047346", + "output_packets": "105374085608", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "10week(s) 3day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/35", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a0e", + "bia": "286f.7f7e.9a0e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "339646146272", + "output_packets": "402588117472", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "10week(s) 3day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/36", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a0f", + "bia": "286f.7f7e.9a0f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "341382509315", + "output_packets": "395406400668", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "10week(s) 3day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/37", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a10", + "bia": "286f.7f7e.9a10", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "33237665795", + "output_packets": "15611503920", + "input_errors": "5", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/38", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a11", + "bia": "286f.7f7e.9a11", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "55824245126", + "output_packets": "12127041939", + "input_errors": "7", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/39", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a12", + "bia": "286f.7f7e.9a12", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "39140605507", + "output_packets": "12960548777", + "input_errors": "3", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/40", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a13", + "bia": "286f.7f7e.9a13", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "35611705441", + "output_packets": "12968363542", + "input_errors": "50", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/41", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.9a14", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "169527202", + "output_packets": "169527032", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/42", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.9a15", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "13041749", + "output_packets": "13041583", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/43", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a16", + "bia": "286f.7f7e.9a16", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "147353804507", + "output_packets": "323282303263", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/44", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a17", + "bia": "286f.7f7e.9a17", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "154197058678", + "output_packets": "340886552128", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/45", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a18", + "bia": "286f.7f7e.9a18", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "286909909497", + "output_packets": "432079922683", + "input_errors": "151", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/46", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a19", + "bia": "286f.7f7e.9a19", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "285801842615", + "output_packets": "416715568480", + "input_errors": "96", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "258week(s) 5day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/47", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a1a", + "bia": "286f.7f7e.9a1a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "1087181812070", + "output_packets": "397092136410", + "input_errors": "11468", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "238week(s) 6day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/48", + "link_status": "up", + "admin_state": "up", + "hardware_type": "1000/10000 Ethernet", + "mac_address": "286f.7f7e.9a1b", + "bia": "286f.7f7e.9a1b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "1096934421646", + "output_packets": "405161742267", + "input_errors": "10757", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "238week(s) 6day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/49", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "10000/40000 Ethernet", + "mac_address": "286f.7f7e.9a1c", + "bia": "286f.7f7e.9a1c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/50", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "10000/40000 Ethernet", + "mac_address": "286f.7f7e.9a1d", + "bia": "286f.7f7e.9a1d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/51", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "10000/40000 Ethernet", + "mac_address": "286f.7f7e.9a1e", + "bia": "286f.7f7e.9a1e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/52", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "10000/40000 Ethernet", + "mac_address": "286f.7f7e.9a1f", + "bia": "286f.7f7e.9a1f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "Ethernet1/53", + "link_status": "down (Link not connected)", + "admin_state": "up", + "hardware_type": "10000/40000 Ethernet", + "mac_address": "286f.7f7e.9a20", + "bia": "286f.7f7e.9a20", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "131575706", + "output_packets": "100692177", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "3week(s) 2day(s)", + "vlan_id": "" + }, + { + "interface": "Ethernet1/54", + "link_status": "down (XCVR not inserted)", + "admin_state": "up", + "hardware_type": "10000/40000 Ethernet", + "mac_address": "286f.7f7e.9a21", + "bia": "286f.7f7e.9a21", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "never", + "vlan_id": "" + }, + { + "interface": "port-channel3", + "link_status": "down (No operational members)", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "0000.0000.0000", + "bia": "0000.0000.0000", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "100000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel6", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.99f1", + "bia": "286f.7f7e.99f1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "access", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "70952159970", + "output_packets": "100548427863", + "input_errors": "1", + "output_errors": "0", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel7", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.99f3", + "bia": "286f.7f7e.99f3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "54830379323", + "output_packets": "80216029713", + "input_errors": "121", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel29", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.9a0a", + "bia": "286f.7f7e.9a0a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "2200370500453", + "output_packets": "2987044769603", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel33", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.9a0c", + "bia": "286f.7f7e.9a0c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "344943998045", + "output_packets": "229842316314", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "2000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel35", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.9a0e", + "bia": "286f.7f7e.9a0e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "681028655587", + "output_packets": "797994518140", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "2000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel36", + "link_status": "down (Administratively down)", + "admin_state": "down", + "hardware_type": "Port-Channel", + "mac_address": "0000.0000.0000", + "bia": "0000.0000.0000", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "auto-speed", + "input_packets": "0", + "output_packets": "0", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "100000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel37", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.9a10", + "bia": "286f.7f7e.9a10", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "163814221869", + "output_packets": "53667458178", + "input_errors": "65", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel41", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.99eb", + "bia": "286f.7f7e.9a14", + "description": "a description", + "ip_address": "10.1.0.2", + "prefix_length": "30", + "mtu": "1500", + "mode": "", + "duplex": "full-duplex", + "speed": "1000 Mb/s", + "input_packets": "182568951", + "output_packets": "182568615", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "2000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel43", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.9a16", + "bia": "286f.7f7e.9a16", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "301550863185", + "output_packets": "664168855391", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "20000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel45", + "link_status": "up", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "286f.7f7e.9a18", + "bia": "286f.7f7e.9a18", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "full-duplex", + "speed": "10 Gb/s", + "input_packets": "2756827985828", + "output_packets": "1651049369840", + "input_errors": "22472", + "output_errors": "0", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "port-channel53", + "link_status": "down (No operational members)", + "admin_state": "up", + "hardware_type": "Port-Channel", + "mac_address": "0000.0000.0000", + "bia": "0000.0000.0000", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "trunk", + "duplex": "auto-duplex", + "speed": "40 Gb/s", + "input_packets": "131575706", + "output_packets": "100692177", + "input_errors": "0", + "output_errors": "0", + "bandwidth": "100000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "loopback0", + "link_status": "up", + "admin_state": "up", + "hardware_type": "", + "mac_address": "", + "bia": "", + "description": "a description", + "ip_address": "10.27.111.247", + "prefix_length": "32", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "8000000 Kbit", + "delay": "5000 usec", + "encapsulation": "LOOPBACK", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan1", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan63", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan64", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan66", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan67", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan68", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan70", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan71", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan72", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan110", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan115", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan128", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan135", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan136", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "144.5.136.3", + "prefix_length": "24", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan160", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan176", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan192", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan200", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan201", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan202", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan210", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan214", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan215", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan216", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan218", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan219", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan220", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan345", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan350", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan3112", + "link_status": "down (Administratively down)", + "admin_state": "down, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "172.22.32.1", + "prefix_length": "21", + "mtu": "9216", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan3130", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + }, + { + "interface": "Vlan3146", + "link_status": "up", + "admin_state": "up, autostate enabled", + "hardware_type": "EtherSVI", + "mac_address": "286f.7f7e.99eb", + "bia": "", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "mode": "", + "duplex": "", + "speed": "", + "input_packets": "", + "output_packets": "", + "input_errors": "", + "output_errors": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_link_flapped": "", + "vlan_id": "" + } + ], + "show port-channel summary": [ + { + "bundle_name": "Po3", + "bundle_status": "SD", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/3" + ], + "member_interface_status": [ + "D" + ] + }, + { + "bundle_name": "Po6", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/6" + ], + "member_interface_status": [ + "P" + ] + }, + { + "bundle_name": "Po7", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/7", + "Eth1/8", + "Eth1/9", + "Eth1/10" + ], + "member_interface_status": [ + "P", + "P", + "P", + "P" + ] + }, + { + "bundle_name": "Po29", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32" + ], + "member_interface_status": [ + "P", + "P", + "P", + "P" + ] + }, + { + "bundle_name": "Po33", + "bundle_status": "SU", + "bundle_protocol": "NONE", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/33", + "Eth1/34" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "bundle_name": "Po35", + "bundle_status": "SU", + "bundle_protocol": "NONE", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/35", + "Eth1/36" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "bundle_name": "Po36", + "bundle_status": "SD", + "bundle_protocol": "NONE", + "bundle_protocol_state": "", + "member_interface": [ + "--" + ], + "member_interface_status": [] + }, + { + "bundle_name": "Po37", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40" + ], + "member_interface_status": [ + "P", + "P", + "P", + "P" + ] + }, + { + "bundle_name": "Po41", + "bundle_status": "RU", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/41", + "Eth1/42" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "bundle_name": "Po43", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/43", + "Eth1/44" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "bundle_name": "Po45", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ], + "member_interface_status": [ + "P", + "P", + "P", + "P" + ] + }, + { + "bundle_name": "Po53", + "bundle_status": "SD", + "bundle_protocol": "LACP", + "bundle_protocol_state": "", + "member_interface": [ + "Eth1/53" + ], + "member_interface_status": [ + "D" + ] + } + ], + "show vrf interface": [ + { + "interface": "Vlan3112", + "name": "NFS", + "id": "3", + "origin": "--" + }, + { + "interface": "Vlan63", + "name": "Servers", + "id": "4", + "origin": "--" + }, + { + "interface": "Vlan214", + "name": "Servers", + "id": "4", + "origin": "--" + }, + { + "interface": "Vlan1", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan64", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan66", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan67", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan68", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan70", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan71", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan72", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan110", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan115", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan128", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan135", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan136", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan160", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan176", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan192", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan200", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan201", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan202", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan210", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan215", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan216", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan218", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan219", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan220", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan345", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan350", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan3130", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Vlan3146", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "loopback0", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "port-channel41", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Ethernet1/1", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Ethernet1/1.1", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Ethernet1/2", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Ethernet1/2.1", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Ethernet1/28", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "Ethernet1/28.2", + "name": "default", + "id": "1", + "origin": "--" + }, + { + "interface": "mgmt0", + "name": "management", + "id": "2", + "origin": "--" + } + ], + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/4", + "Eth1/11", + "Eth1/12", + "Eth1/13", + "Eth1/14", + "Eth1/15", + "Eth1/16", + "Eth1/17", + "Eth1/18", + "Eth1/19", + "Eth1/20", + "Eth1/21", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48", + "Eth1/49", + "Eth1/50", + "Eth1/51", + "Eth1/52", + "Eth1/54" + ] + }, + { + "vlan_id": "10", + "vlan_name": "vlan10", + "status": "active", + "interfaces": [ + "Po29", + "Po43", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/43", + "Eth1/44", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "63", + "vlan_name": "vlan63", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "64", + "vlan_name": "vlan64", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/23", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "65", + "vlan_name": "vlan65", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "66", + "vlan_name": "vlan66", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "67", + "vlan_name": "vlan67", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/24", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "68", + "vlan_name": "vlan68", + "status": "active", + "interfaces": [ + "Po3", + "Po7", + "Po29", + "Po37", + "Po45", + "Po53", + "Eth1/3", + "Eth1/7", + "Eth1/8", + "Eth1/9", + "Eth1/10", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48", + "Eth1/53" + ] + }, + { + "vlan_id": "70", + "vlan_name": "vlan70", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "71", + "vlan_name": "vlan71", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "72", + "vlan_name": "vlan72", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "110", + "vlan_name": "vid110", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/23", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "115", + "vlan_name": "v115", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/23", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "128", + "vlan_name": "vlan128", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/23", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "135", + "vlan_name": "VLAN135", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "136", + "vlan_name": "vlan136", + "status": "active", + "interfaces": [ + "Po29", + "Po43", + "Po45", + "Eth1/22", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/43", + "Eth1/44", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "160", + "vlan_name": "id160", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/23", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "176", + "vlan_name": "vlan176", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/23", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "192", + "vlan_name": "vlan192", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/23", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "200", + "vlan_name": "data", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/5", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "201", + "vlan_name": "fw", + "status": "active", + "interfaces": [ + "Po6", + "Po29", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "202", + "vlan_name": "VLAN0202", + "status": "active", + "interfaces": [ + "Po29", + "Po35", + "Po37", + "Po43", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/35", + "Eth1/36", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/43", + "Eth1/44", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "209", + "vlan_name": "abc", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "210", + "vlan_name": "Mgmt.FW", + "status": "active", + "interfaces": [ + "Po29", + "Po35", + "Po36", + "Po43", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/35", + "Eth1/36", + "Eth1/43", + "Eth1/44" + ] + }, + { + "vlan_id": "214", + "vlan_name": "inter", + "status": "active", + "interfaces": [ + "Po29", + "Po35", + "Po43", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/35", + "Eth1/36", + "Eth1/43", + "Eth1/44", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "215", + "vlan_name": "vmware", + "status": "active", + "interfaces": [ + "Po7", + "Po29", + "Po37", + "Po45", + "Eth1/7", + "Eth1/8", + "Eth1/9", + "Eth1/10", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "216", + "vlan_name": "VLAN0216", + "status": "active", + "interfaces": [ + "Po7", + "Po29", + "Po37", + "Po45", + "Eth1/7", + "Eth1/8", + "Eth1/9", + "Eth1/10", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "218", + "vlan_name": "dns", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "219", + "vlan_name": "v219", + "status": "active", + "interfaces": [ + "Po3", + "Po7", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/7", + "Eth1/8", + "Eth1/9", + "Eth1/10", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "220", + "vlan_name": "v220", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "345", + "vlan_name": "vlan345", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "350", + "vlan_name": "vlan350", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "857", + "vlan_name": "VLAN857", + "status": "active", + "interfaces": [ + "Po3", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27" + ] + }, + { + "vlan_id": "1200", + "vlan_name": "servers", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3002", + "vlan_name": "oob", + "status": "active", + "interfaces": [ + "Po29", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3030", + "vlan_name": "storage", + "status": "active", + "interfaces": [ + "Po7", + "Po29", + "Po37", + "Po45", + "Eth1/7", + "Eth1/8", + "Eth1/9", + "Eth1/10", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3085", + "vlan_name": "Servers", + "status": "active", + "interfaces": [ + "Po29", + "Po33", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/33", + "Eth1/34", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3100", + "vlan_name": "v3100", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3101", + "vlan_name": "v3101", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3105", + "vlan_name": "VLAN3105", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3110", + "vlan_name": "STORE", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3111", + "vlan_name": "STORAGE", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3112", + "vlan_name": "DATA", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3120", + "vlan_name": "vmware", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3121", + "vlan_name": "VLAN3121", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3122", + "vlan_name": "vLan3122", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3130", + "vlan_name": "data", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3131", + "vlan_name": "host", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3146", + "vlan_name": "VLAN3146", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3160", + "vlan_name": "virtuals", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3179", + "vlan_name": "v3179", + "status": "active", + "interfaces": [ + "Po3", + "Po29", + "Po37", + "Po45", + "Eth1/3", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3210", + "vlan_name": "svc", + "status": "active", + "interfaces": [ + "Po29", + "Po33", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/33", + "Eth1/34", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3214", + "vlan_name": "mgm", + "status": "active", + "interfaces": [ + "Po29", + "Po33", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/33", + "Eth1/34", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + }, + { + "vlan_id": "3215", + "vlan_name": "mgmt", + "status": "active", + "interfaces": [ + "Po29", + "Po33", + "Po37", + "Po45", + "Eth1/25", + "Eth1/26", + "Eth1/27", + "Eth1/29", + "Eth1/30", + "Eth1/31", + "Eth1/32", + "Eth1/33", + "Eth1/34", + "Eth1/37", + "Eth1/38", + "Eth1/39", + "Eth1/40", + "Eth1/45", + "Eth1/46", + "Eth1/47", + "Eth1/48" + ] + } + ], + "show interface switchport": [ + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/3", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "65-68,70-72,135,218-219", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/4", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "200", + "ACCESS_VLAN_NAME": "146.27.111.16/29.3RD-FW", + "INTERFACE": "Ethernet1/5", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "201", + "ACCESS_VLAN_NAME": "146.27.73.0/29.ForensicFW", + "INTERFACE": "Ethernet1/6", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/7", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "68,215-216,219,3030", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/8", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "68,215-216,219,3030", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/9", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "68,215-216,219,3030", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/10", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "68,215-216,219,3030", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/11", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/12", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/13", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/14", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/15", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/16", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/17", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/18", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/19", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/20", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/21", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "136", + "ACCESS_VLAN_NAME": "144.5.136.0/24-RTSN.Interconnect", + "INTERFACE": "Ethernet1/22", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/23", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "64,110,115,128,160,176,192", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "67", + "ACCESS_VLAN_NAME": "146.27.67.0/24", + "INTERFACE": "Ethernet1/24", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/25", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/26", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/27", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/29", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "851-856", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/30", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "851-856", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/31", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "851-856", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/32", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "851-856", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/33", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "3085,3210,3214-3215", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/34", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "3085,3210,3214-3215", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/35", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "202,210,214", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/36", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "202,210,214", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/37", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-9,211-213", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/38", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-9,211-213", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/39", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-9,211-213", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/40", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-9,211-213", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/43", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "10,136,202,210,214", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/44", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "10,136,202,210,214", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/45", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1,209-211", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/46", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1,209-211", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/47", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1,209-211", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/48", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1,209-211", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/49", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/50", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/51", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/52", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/53", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "68", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "Ethernet1/54", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel3", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "65-68,70-72", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "201", + "ACCESS_VLAN_NAME": "146.27.73.0/29.ForensicFW", + "INTERFACE": "port-channel6", + "MODE": "access", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-4094", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel7", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "68,215-216,219,3030", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel29", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "851-856", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel33", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "3085,3210,3214-3215", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel35", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "202,210,214", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel36", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "210", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel37", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1-9,211-213", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel43", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "10,136,202,210,214", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel45", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "1,209-211", + "VOICE_VLAN": "none" + }, + { + "ACCESS_VLAN": "1", + "ACCESS_VLAN_NAME": "default", + "INTERFACE": "port-channel53", + "MODE": "trunk", + "NATIVE_VLAN": "1", + "NATIVE_VLAN_NAME": "default", + "SWITCHPORT": "Enabled", + "SWITCHPORT_MONITOR": "Not enabled", + "TRUNKING_VLANS": "68", + "VOICE_VLAN": "none" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_devices/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_devices/expected_result_1.json new file mode 100755 index 00000000..c633518e --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_devices/expected_result_1.json @@ -0,0 +1,7 @@ +{ + "device_type": "Nexus9000 C9372PX chassis", + "hostname": "N9k-01", + "mask_length": 24, + "mgmt_interface": "mgmt0", + "serial": "FDO20432435" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_all/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_all/expected_result_1.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_all/expected_result_1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json new file mode 100755 index 00000000..3768f672 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json @@ -0,0 +1,1220 @@ +{ + "interfaces": { + "Ethernet1/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/1.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.246", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/10": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f5", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f6", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f7", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f8", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f9", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fa", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fc", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fd", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fe", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/2.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.250", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ff", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a00", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a01", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/23": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a02", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a03", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/25": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a04", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/26": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a05", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/27": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a06", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/28": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/28.2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.16.0.2", + "prefix_length": "31" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a08", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ee", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/30": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a09", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/31": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/32": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0b", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/34": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0d", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0f", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/38": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a11", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/39": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a12", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ef", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/40": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a13", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/42": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/44": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a17", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/46": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a19", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/47": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1a", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/48": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1b", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/49": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1c", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f0", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/50": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1d", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/51": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1e", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/52": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1f", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a20", + "mtu": "9216", + "type": "other" + }, + "Ethernet1/54": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a21", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f2", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/8": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/9": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f4", + "mtu": "9216", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan110": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.67", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan115": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.83", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan128": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.133", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan135": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.135.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan136": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "144.5.136.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan160": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan176": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.190", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan192": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.198", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan200": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.19", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan201": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.73.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan202": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.42", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan210": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.98", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan214": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan215": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.131", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan216": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.195", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan218": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.218.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan219": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.219.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan220": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.59.243", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan3112": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.32.1", + "prefix_length": "21" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual" + }, + "Vlan3130": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.8.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan3146": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.197.131", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan345": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.5.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan350": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.137.3", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan63": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.63.3", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual" + }, + "Vlan64": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.126", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan66": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.66.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan67": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.67.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan68": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.68.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan70": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.70.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan71": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.71.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan72": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.72.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "loopback0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.247", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "mgmt0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99e4", + "mtu": "1500", + "type": "other" + }, + "port-channel29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "lag" + }, + "port-channel3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag" + }, + "port-channel33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "lag" + }, + "port-channel35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "lag" + }, + "port-channel36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag" + }, + "port-channel37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "lag" + }, + "port-channel41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.1.0.2", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "lag" + }, + "port-channel43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "lag" + }, + "port-channel45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "lag" + }, + "port-channel53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "9216", + "type": "lag" + }, + "port-channel6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "lag" + }, + "port-channel7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "lag" + } + }, + "serial": "FDO20432435" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json new file mode 100755 index 00000000..a2f656d5 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json @@ -0,0 +1,2549 @@ +{ + "interfaces": { + "Ethernet1/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/1.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.246", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/10": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f5", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f6", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f7", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f8", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f9", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fa", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fb", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fc", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fd", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fe", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/2.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.250", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ff", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a00", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a01", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "136", + "name": "vlan136" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/23": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a02", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "64", + "name": "vlan64" + }, + { + "id": "110", + "name": "vid110" + }, + { + "id": "115", + "name": "v115" + }, + { + "id": "128", + "name": "vlan128" + }, + { + "id": "160", + "name": "id160" + }, + { + "id": "176", + "name": "vlan176" + }, + { + "id": "192", + "name": "vlan192" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a03", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "67", + "name": "vlan67" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/25": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a04", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/26": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a05", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/27": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a06", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/28": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/28.2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.16.0.2", + "prefix_length": "31" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a08", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ee", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "65", + "name": "vlan65" + }, + { + "id": "66", + "name": "vlan66" + }, + { + "id": "67", + "name": "vlan67" + }, + { + "id": "68", + "name": "vlan68" + }, + { + "id": "70", + "name": "vlan70" + }, + { + "id": "71", + "name": "vlan71" + }, + { + "id": "72", + "name": "vlan72" + }, + { + "id": "135", + "name": "VLAN135" + }, + { + "id": "218", + "name": "dns" + }, + { + "id": "219", + "name": "v219" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/30": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a09", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/31": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/32": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0b", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/34": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0d", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0f", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/38": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a11", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/39": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a12", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ef", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/40": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a13", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/42": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/44": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a17", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/46": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a19", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/47": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/48": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1b", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/49": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1c", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f0", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "200", + "name": "data" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/50": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1d", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/51": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1e", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/52": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1f", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a20", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/54": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a21", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "201", + "name": "fw" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f2", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/8": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/9": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f4", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan110": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.67", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan115": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.83", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan128": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.133", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan135": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.135.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan136": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "144.5.136.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan160": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan176": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.190", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan192": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.198", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan200": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.19", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan201": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.73.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan202": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.42", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan210": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.98", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan214": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan215": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.131", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan216": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.195", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan218": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.218.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan219": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.219.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan220": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.59.243", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3112": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.32.1", + "prefix_length": "21" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3130": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.8.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3146": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.197.131", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan345": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.5.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan350": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.137.3", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan63": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.63.3", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan64": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.126", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan66": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.66.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan67": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.67.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan68": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.68.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan70": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.70.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan71": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.71.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan72": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.72.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "loopback0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.247", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "mgmt0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99e4", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "port-channel29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "65", + "name": "vlan65" + }, + { + "id": "66", + "name": "vlan66" + }, + { + "id": "67", + "name": "vlan67" + }, + { + "id": "68", + "name": "vlan68" + }, + { + "id": "70", + "name": "vlan70" + }, + { + "id": "71", + "name": "vlan71" + }, + { + "id": "72", + "name": "vlan72" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "210", + "name": "Mgmt.FW" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.1.0.2", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": {} + }, + "port-channel43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "201", + "name": "fw" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + } + }, + "serial": "FDO20432435" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vrfs/expected_result_1.json new file mode 100755 index 00000000..c6ec071b --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vrfs/expected_result_1.json @@ -0,0 +1,1405 @@ +{ + "interfaces": { + "Ethernet1/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": { + "name": "default" + } + }, + "Ethernet1/1.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.246", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": { + "name": "default" + } + }, + "Ethernet1/10": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f5", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f6", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f7", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f8", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f9", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fa", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fb", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fc", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fd", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fe", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": { + "name": "default" + } + }, + "Ethernet1/2.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.250", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": { + "name": "default" + } + }, + "Ethernet1/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ff", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a00", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a01", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/23": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a02", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a03", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/25": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a04", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/26": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a05", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/27": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a06", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/28": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": { + "name": "default" + } + }, + "Ethernet1/28.2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.16.0.2", + "prefix_length": "31" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": { + "name": "default" + } + }, + "Ethernet1/29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a08", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ee", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/30": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a09", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/31": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/32": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0b", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/34": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/38": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a11", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/39": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a12", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ef", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/40": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a13", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/42": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/44": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a17", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/46": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a19", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/47": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1a", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/48": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1b", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/49": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1c", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Ethernet1/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f0", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/50": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1d", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Ethernet1/51": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1e", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Ethernet1/52": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1f", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Ethernet1/53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a20", + "mtu": "9216", + "type": "other", + "vrf": {} + }, + "Ethernet1/54": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a21", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Ethernet1/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f2", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/8": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Ethernet1/9": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f4", + "mtu": "9216", + "type": "1000base-t", + "vrf": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan110": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.67", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan115": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.83", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan128": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.133", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan135": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.135.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan136": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "144.5.136.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan160": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan176": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.190", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan192": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.198", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan200": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.19", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan201": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.73.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan202": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.42", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan210": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.98", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan214": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "Servers" + } + }, + "Vlan215": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.131", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan216": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.195", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan218": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.218.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan219": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.219.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan220": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.59.243", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan3112": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.32.1", + "prefix_length": "21" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual", + "vrf": { + "name": "NFS" + } + }, + "Vlan3130": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.8.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan3146": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.197.131", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan345": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.5.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan350": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.137.3", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan63": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.63.3", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual", + "vrf": { + "name": "Servers" + } + }, + "Vlan64": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.126", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan66": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.66.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan67": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.67.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan68": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.68.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan70": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.70.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan71": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.71.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "Vlan72": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.72.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual", + "vrf": { + "name": "default" + } + }, + "loopback0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.247", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": { + "name": "default" + } + }, + "mgmt0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99e4", + "mtu": "1500", + "type": "other", + "vrf": { + "name": "management" + } + }, + "port-channel29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "lag", + "vrf": {} + }, + "port-channel3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "port-channel33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "port-channel35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "port-channel36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "port-channel37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "lag", + "vrf": {} + }, + "port-channel41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.1.0.2", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "lag", + "vrf": { + "name": "default" + } + }, + "port-channel43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "port-channel45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "lag", + "vrf": {} + }, + "port-channel53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "9216", + "type": "lag", + "vrf": {} + }, + "port-channel6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "port-channel7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "lag", + "vrf": {} + } + }, + "serial": "FDO20432435" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_wlc/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_wlc/command_getter_result_1.json new file mode 100755 index 00000000..a5de3902 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_wlc/command_getter_result_1.json @@ -0,0 +1,45 @@ +{ + "show interface detailed management": [ + { + "gateway": "14.36.4.193", + "interface_name": "management", + "ip_address": "14.36.4.194", + "mac_address": "00:5d:73:da:e3:2b", + "netmask": "255.255.255.240", + "primary_dhcp_server": "14.36.82.34", + "secondary_dhcp_server": "14.36.80.34" + } + ], + "show inventory": [ + { + "bia": "00:5D:73:DA:E3:23", + "description": "Cisco 5520 Wireless Controller", + "max_ap_num": "1500", + "name": "Chassis", + "pid": "AIR-CT5520-K9", + "sn": "FCH2145V28L", + "vid": "V01" + } + ], + "show sysinfo": [ + { + "bootloader_version": "8.3.15.177", + "build_type": "DATA + WPS", + "configured_country": "Multiple Countries : BE,US", + "field_recovery_image_version": "", + "firmware_version": "", + "ip_address": "14.36.4.194", + "last_reset": "", + "mac_address": "00:5D:73:DA:E3:23", + "maximum_aps": "1500", + "number_active_clients": "58", + "number_wlans": "7", + "product_version": "8.10.185.0", + "system_contact": "Dan and Jake", + "system_location": "Dallas, Texas / United States / Americas", + "system_name": "ABCWC-01", + "system_timezone_location": "(GMT -6:00) Central Time (US and Canada)", + "system_up_time": "269 days 3 hrs 35 mins 31 secs" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_wlc/sync_devices/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_wlc/sync_devices/expected_result_1.json new file mode 100755 index 00000000..7ea657e9 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_wlc/sync_devices/expected_result_1.json @@ -0,0 +1,5 @@ +{"device_type": "AIR-CT5520-K9", + "hostname": "ABCWC-01", + "mask_length": 28, + "mgmt_interface": "management", + "serial": "FCH2145V28L"} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_1.json new file mode 100644 index 00000000..e7c44c7b --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_1.json @@ -0,0 +1,2830 @@ +{ + "show version": [ + { + "software_image": "X86_64_LINUX_IOSD-UNIVERSALK9-M", + "version": "16.9.4", + "release": "fc2", + "rommon": "IOS-XE", + "hostname": "ISR-XE-01", + "uptime": "23 weeks, 1 day, 2 hours, 11 minutes", + "uptime_years": "", + "uptime_weeks": "23", + "uptime_days": "1", + "uptime_hours": "2", + "uptime_minutes": "11", + "reload_reason": "Reload Command", + "running_image": "isr4300-universalk9.16.09.04.SPA.bin", + "hardware": [ + "ISR4331/K9" + ], + "serial": [ + "FLM241611GV" + ], + "config_register": "0x2102", + "mac_address": [], + "restarted": "15:01:04 UTC Thu Dec 21 2023" + } + ], + "show interfaces": [ + { + "interface": "GigabitEthernet0/0/0", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "ISR4331-3x1GE", + "mac_address": "ac3a.6789.5d40", + "bia": "ac3a.6789.5d40", + "description": "isr description", + "ip_address": "10.39.67.234", + "prefix_length": "30", + "mtu": "1500", + "duplex": "Full Duplex", + "speed": "100Mbps", + "media_type": "RJ45", + "bandwidth": "60000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "8526000", + "output_rate": "1709000", + "input_pps": "1074", + "output_pps": "643", + "input_packets": "6048364297", + "output_packets": "4226892804", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/0/1", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "ISR4331-3x1GE", + "mac_address": "ac3a.6789.5d41", + "bia": "ac3a.6789.5d41", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full Duplex", + "speed": "1000Mbps", + "media_type": "RJ45", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "802.1Q Virtual LAN", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "2055000", + "output_rate": "5820000", + "input_pps": "667", + "output_pps": "878", + "input_packets": "5374499091", + "output_packets": "6245799571", + "runts": "0", + "giants": "0", + "input_errors": "1296", + "crc": "0", + "frame": "0", + "overrun": "1296", + "abort": "", + "output_errors": "0", + "vlan_id": "1", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/0/1.100", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "ISR4331-3x1GE", + "mac_address": "ac3a.6789.5d41", + "bia": "ac3a.6789.5d41", + "description": "isr description", + "ip_address": "10.39.67.1", + "prefix_length": "25", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "802.1Q Virtual LAN", + "last_input": "", + "last_output": "", + "last_output_hang": "", + "queue_strategy": "", + "input_rate": "", + "output_rate": "", + "input_pps": "", + "output_pps": "", + "input_packets": "", + "output_packets": "", + "runts": "", + "giants": "", + "input_errors": "", + "crc": "", + "frame": "", + "overrun": "", + "abort": "", + "output_errors": "", + "vlan_id": "100", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/0/1.200", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "ISR4331-3x1GE", + "mac_address": "ac3a.6789.5d41", + "bia": "ac3a.6789.5d41", + "description": "isr description", + "ip_address": "10.41.238.129", + "prefix_length": "26", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "802.1Q Virtual LAN", + "last_input": "", + "last_output": "", + "last_output_hang": "", + "queue_strategy": "", + "input_rate": "", + "output_rate": "", + "input_pps": "", + "output_pps": "", + "input_packets": "", + "output_packets": "", + "runts": "", + "giants": "", + "input_errors": "", + "crc": "", + "frame": "", + "overrun": "", + "abort": "", + "output_errors": "", + "vlan_id": "200", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/0/1.300", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "ISR4331-3x1GE", + "mac_address": "ac3a.6789.5d41", + "bia": "ac3a.6789.5d41", + "description": "isr description", + "ip_address": "10.39.67.209", + "prefix_length": "29", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "802.1Q Virtual LAN", + "last_input": "", + "last_output": "", + "last_output_hang": "", + "queue_strategy": "", + "input_rate": "", + "output_rate": "", + "input_pps": "", + "output_pps": "", + "input_packets": "", + "output_packets": "", + "runts": "", + "giants": "", + "input_errors": "", + "crc": "", + "frame": "", + "overrun": "", + "abort": "", + "output_errors": "", + "vlan_id": "300", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/0/2", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "ISR4331-3x1GE", + "mac_address": "ac3a.6789.5d42", + "bia": "ac3a.6789.5d42", + "description": "isr description", + "ip_address": "10.39.67.217", + "prefix_length": "30", + "mtu": "1500", + "duplex": "Full Duplex", + "speed": "1000Mbps", + "media_type": "LX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:01", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "568000", + "output_rate": "3692000", + "input_pps": "215", + "output_pps": "442", + "input_packets": "1938320602", + "output_packets": "2741863078", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Service-Engine0/1/0", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "PVDM4-64", + "mac_address": "cc70.ed3b.0716", + "bia": "cc70.ed3b.0716", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "750000 Kbit", + "delay": "1000 usec", + "encapsulation": "DSP_SPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:0", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:1", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:2", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:3", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:4", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:5", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:6", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:7", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:8", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:9", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:10", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:11", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:12", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:13", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:14", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:15", + "link_status": "up", + "protocol_status": "up (spoofing)", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "00:00:03", + "last_output": "00:00:03", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "1882372", + "output_packets": "1884878", + "runts": "0", + "giants": "0", + "input_errors": "102", + "crc": "31", + "frame": "0", + "overrun": "0", + "abort": "71", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:16", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:17", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:18", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:19", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:20", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:21", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:22", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:23", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:24", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:25", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:26", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:27", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:28", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:29", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Serial0/1/0:30", + "link_status": "down", + "protocol_status": "down", + "hardware_type": "NIM-1MFT-T1", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "64 Kbit", + "delay": "20000 usec", + "encapsulation": "HDLC", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/0", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d50", + "bia": "ac3a.6789.5d50", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/1", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d51", + "bia": "ac3a.6789.5d51", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d52", + "bia": "ac3a.6789.5d52", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/3", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d53", + "bia": "ac3a.6789.5d53", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/4", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d54", + "bia": "ac3a.6789.5d54", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/5", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d55", + "bia": "ac3a.6789.5d55", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d56", + "bia": "ac3a.6789.5d56", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "NIM-ES2-8", + "mac_address": "ac3a.6789.5d57", + "bia": "ac3a.6789.5d57", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Service-Engine0/4/0", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "PVDM4-32", + "mac_address": "ac3a.6789.5d40", + "bia": "ac3a.6789.5d40", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "750000 Kbit", + "delay": "1000 usec", + "encapsulation": "DSP_SPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "RP management port", + "mac_address": "ac3a.6789.5dcf", + "bia": "ac3a.6789.5dcf", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto Duplex", + "speed": "Auto Speed", + "media_type": "RJ45", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Loopback0", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "Loopback", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "198.51.100.1", + "prefix_length": "32", + "mtu": "1514", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "8000000 Kbit", + "delay": "5000 usec", + "encapsulation": "LOOPBACK", + "last_input": "00:00:05", + "last_output": "2d08h", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "1174885", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Tunnel0", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "Tunnel", + "mac_address": "", + "bia": "", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "9972", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "100 Kbit", + "delay": "50000 usec", + "encapsulation": "TUNNEL", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "62", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "0", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan1", + "link_status": "up", + "protocol_status": "down , Autostate Enabled", + "hardware_type": "Ethernet SVI", + "mac_address": "ac3a.6789.5dc4", + "bia": "ac3a.6789.5dc4", + "description": "isr description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + } + ], + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [ + "Gi0/2/0", + "Gi0/2/1", + "Gi0/2/2", + "Gi0/2/3", + "Gi0/2/4", + "Gi0/2/5", + "Gi0/2/6" + ] + }, + { + "vlan_id": "500", + "vlan_name": "VLAN0500", + "status": "active", + "interfaces": [ + "Gi0/2/7" + ] + }, + { + "vlan_id": "1002", + "vlan_name": "fddi-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1003", + "vlan_name": "token-ring-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1004", + "vlan_name": "fddinet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1005", + "vlan_name": "trnet-default", + "status": "act/unsup", + "interfaces": [] + } + ], + "show interfaces switchport": [ + { + "interface": "Gi0/2/0", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "500", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + } + ], + "show etherchannel summary": [], + "show ip interface": [ + { + "interface": "GigabitEthernet0/0/0", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "10.39.67.234" + ], + "prefix_length": [ + "30" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [ + "10.36.82.34" + ], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/0/1.100", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "10.39.67.1" + ], + "prefix_length": [ + "25" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [ + "10.36.82.34", + "10.248.0.18" + ], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/0/1.200", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "10.41.238.129" + ], + "prefix_length": [ + "26" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [ + "10.36.82.34", + "10.248.0.18" + ], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/0/1.300", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "10.39.67.209" + ], + "prefix_length": [ + "29" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/0/2", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "10.39.67.217" + ], + "prefix_length": [ + "30" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [ + "10.36.82.34" + ], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Service-Engine0/1/0", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:0", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:1", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:3", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:4", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:5", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:11", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:12", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:13", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:14", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:15", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:17", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:18", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:19", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:20", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:21", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:22", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:23", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:24", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:25", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:26", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:27", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:28", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:29", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Serial0/1/0:30", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/0", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/1", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/3", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/4", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/5", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Service-Engine0/4/0", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Loopback0", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "198.51.100.1" + ], + "prefix_length": [ + "32" + ], + "vrf": "", + "mtu": "1514", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Tunnel0", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "1472", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan1", + "link_status": "up", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_1.json new file mode 100755 index 00000000..edbb9b32 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_1.json @@ -0,0 +1,7 @@ +{ + "device_type": "ISR4331/K9", + "hostname": "ISR-XE-01", + "mask_length": 32, + "mgmt_interface": "Loopback0", + "serial": "FLM241611GV" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_1.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json new file mode 100755 index 00000000..a781f5ca --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json @@ -0,0 +1,770 @@ +{ + "interfaces": { + "GigabitEthernet0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5dcf", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.234", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1.100": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.1", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1.200": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.41.238.129", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/1.300": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.209", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/0/2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.217", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d42", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d50", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d51", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d52", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/3": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d53", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/4": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d54", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/5": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d55", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/6": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d56", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet0/2/7": { + "802.1Q_mode": "access", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d57", + "mtu": "1500", + "type": "other" + }, + "Loopback0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1514", + "type": "other" + }, + "Serial0/1/0:0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:10": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:11": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:12": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:13": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:14": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:15": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:16": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:17": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:18": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:19": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:20": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:21": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:22": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:23": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:24": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:25": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:26": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:27": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:28": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:29": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:3": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:30": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:4": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:5": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:6": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:7": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:8": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Serial0/1/0:9": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "Service-Engine0/1/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "cc70.ed3b.0716", + "mtu": "9216", + "type": "other" + }, + "Service-Engine0/4/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "9216", + "type": "other" + }, + "Tunnel0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "9972", + "type": "other" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5dc4", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FLM241611GV" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json new file mode 100755 index 00000000..6570bc9c --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json @@ -0,0 +1,904 @@ +{ + "interfaces": { + "GigabitEthernet0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5dcf", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/0/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.234", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet0/0/1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet0/0/1.100": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.1", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet0/0/1.200": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.41.238.129", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet0/0/1.300": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.209", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet0/0/2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.217", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d42", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet0/2/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d50", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2/1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d51", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2/2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d52", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2/3": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d53", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2/4": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d54", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2/5": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d55", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2/6": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d56", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2/7": { + "802.1Q_mode": "access", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d57", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "500", + "name": "VLAN0500" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Loopback0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1514", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:10": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:11": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:12": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:13": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:14": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:15": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:16": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:17": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:18": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:19": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:20": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:21": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:22": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:23": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:24": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:25": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:26": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:27": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:28": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:29": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:3": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:30": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:4": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:5": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:6": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:7": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:8": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Serial0/1/0:9": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Service-Engine0/1/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "cc70.ed3b.0716", + "mtu": "9216", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Service-Engine0/4/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "9216", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Tunnel0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "9972", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5dc4", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + } + }, + "serial": "FLM241611GV" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json new file mode 100755 index 00000000..4b14c6f3 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json @@ -0,0 +1,821 @@ +{ + "interfaces": { + "GigabitEthernet0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5dcf", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/0/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.234", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/0/1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/0/1.100": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.1", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/0/1.200": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.41.238.129", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/0/1.300": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.209", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d41", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/0/2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "10.39.67.217", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d42", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d50", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d51", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d52", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/3": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d53", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/4": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d54", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/5": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d55", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/6": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d56", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet0/2/7": { + "802.1Q_mode": "access", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "ac3a.6789.5d57", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Loopback0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1514", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:10": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:11": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:12": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:13": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:14": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:15": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:16": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:17": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:18": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:19": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:2": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:20": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:21": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:22": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:23": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:24": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:25": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:26": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:27": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:28": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:29": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:3": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:30": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:4": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:5": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:6": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:7": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:8": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Serial0/1/0:9": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "Service-Engine0/1/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "cc70.ed3b.0716", + "mtu": "9216", + "type": "other", + "vrf": {} + }, + "Service-Engine0/4/0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5d40", + "mtu": "9216", + "type": "other", + "vrf": {} + }, + "Tunnel0": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "9972", + "type": "other", + "vrf": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "isr description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "ac3a.6789.5dc4", + "mtu": "1500", + "type": "virtual", + "vrf": {} + } + }, + "serial": "FLM241611GV" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/tmp_stack_command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/tmp_stack_command_getter_result_1.json new file mode 100755 index 00000000..c8f0cd1b --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/tmp_stack_command_getter_result_1.json @@ -0,0 +1,4826 @@ +{ + "show version": [ + { + "software_image": "CAT9K_IOSXE", + "version": "16.12.4", + "release": "fc5", + "rommon": "IOS-XE", + "hostname": "IOS-XE-C9500", + "uptime": "3 years, 1 day, 7 hours, 31 minutes", + "uptime_years": "3", + "uptime_weeks": "", + "uptime_days": "1", + "uptime_hours": "7", + "uptime_minutes": "31", + "reload_reason": "Reload Command", + "running_image": "packages.conf", + "hardware": [ + "C9500-24Y4C", + "C9500-24Y4C" + ], + "serial": [ + "FDO24340K4L", + "FDO243411LS" + ], + "config_register": "", + "mac_address": [ + "8c:94:1f:cd:95:c0", + "8c:94:1f:cd:d1:c0" + ], + "restarted": "08:25:36 UTC Mon May 31 2021" + } + ], + "show interfaces": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down , Autostate Enabled", + "hardware_type": "Ethernet SVI", + "mac_address": "8c94.1fcd.965f", + "bia": "8c94.1fcd.965f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/0", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "RP management port", + "mac_address": "8c94.1fcd.95c0", + "bia": "8c94.1fcd.95c0", + "description": "a description", + "ip_address": "198.51.100.1", + "prefix_length": "28", + "mtu": "1500", + "duplex": "Full Duplex", + "speed": "1000Mbps", + "media_type": "RJ45", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "14000", + "output_rate": "27000", + "input_pps": "11", + "output_pps": "9", + "input_packets": "278533761", + "output_packets": "172536647", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/1", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c1", + "bia": "8c94.1fcd.95c1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseSX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "1y46w", + "last_output": "3d12h", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/2", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c2", + "bia": "8c94.1fcd.95c2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseSX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:03", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "2000", + "output_rate": "4000", + "input_pps": "3", + "output_pps": "6", + "input_packets": "274456871687", + "output_packets": "1276315086253", + "runts": "0", + "giants": "0", + "input_errors": "1", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/3", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c3", + "bia": "8c94.1fcd.95c3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:21", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "176000", + "output_rate": "33000", + "input_pps": "35", + "output_pps": "14", + "input_packets": "744323750428", + "output_packets": "1143540145002", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/4", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c4", + "bia": "8c94.1fcd.95c4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:15", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "143000", + "output_rate": "264000", + "input_pps": "34", + "output_pps": "54", + "input_packets": "741937581097", + "output_packets": "1143086357120", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/5", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c5", + "bia": "8c94.1fcd.95c5", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseLX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:05", + "last_output": "00:00:01", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "15000", + "input_pps": "0", + "output_pps": "5", + "input_packets": "953067254870", + "output_packets": "192195903525", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c6", + "bia": "8c94.1fcd.95c6", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/7", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c7", + "bia": "8c94.1fcd.95c7", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:16", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "35000", + "output_rate": "23000", + "input_pps": "6", + "output_pps": "20", + "input_packets": "3494171912", + "output_packets": "2668631535", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/8", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c8", + "bia": "8c94.1fcd.95c8", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:05", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "1439000", + "output_rate": "778000", + "input_pps": "760", + "output_pps": "759", + "input_packets": "36883341269", + "output_packets": "24471971453", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95c9", + "bia": "8c94.1fcd.95c9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/10", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95ca", + "bia": "8c94.1fcd.95ca", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/11", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95cb", + "bia": "8c94.1fcd.95cb", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:13", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "3000", + "input_pps": "0", + "output_pps": "4", + "input_packets": "7432734212", + "output_packets": "1112162995", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/12", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95cc", + "bia": "8c94.1fcd.95cc", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:09", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "78050000", + "output_rate": "901000", + "input_pps": "24081", + "output_pps": "667", + "input_packets": "1327757112877", + "output_packets": "295044192113", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/13", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95cd", + "bia": "8c94.1fcd.95cd", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:13", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "3000", + "input_pps": "0", + "output_pps": "5", + "input_packets": "13256194452", + "output_packets": "9605226746", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/14", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95ce", + "bia": "8c94.1fcd.95ce", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:09", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "390804000", + "output_rate": "389000", + "input_pps": "45869", + "output_pps": "86", + "input_packets": "2301332561715", + "output_packets": "1481665537796", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/15", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95cf", + "bia": "8c94.1fcd.95cf", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseLX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "23094000", + "output_rate": "19113000", + "input_pps": "4782", + "output_pps": "3964", + "input_packets": "333417382025", + "output_packets": "226808865640", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/16", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d0", + "bia": "8c94.1fcd.95d0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/17", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d1", + "bia": "8c94.1fcd.95d1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/18", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d2", + "bia": "8c94.1fcd.95d2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseSX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:19", + "last_output": "00:00:03", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "19000", + "output_rate": "14000", + "input_pps": "16", + "output_pps": "8", + "input_packets": "81700460", + "output_packets": "122380195", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/19", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d3", + "bia": "8c94.1fcd.95d3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/20", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d4", + "bia": "8c94.1fcd.95d4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "unknown", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "2y48w", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/21", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d5", + "bia": "8c94.1fcd.95d5", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/22", + "link_status": "administratively down", + "protocol_status": "down (disabled)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d6", + "bia": "8c94.1fcd.95d6", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/23", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d7", + "bia": "8c94.1fcd.95d7", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseSX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:02", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "19310000", + "output_rate": "23071000", + "input_pps": "4057", + "output_pps": "4785", + "input_packets": "419554639833", + "output_packets": "1286321939269", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE1/0/24", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d8", + "bia": "8c94.1fcd.95d8", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseLX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:45", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "1104035", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE1/0/25", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.95d9", + "bia": "8c94.1fcd.95d9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "40Gb/s", + "media_type": "QSFP 40G SR BD SFP", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "332000", + "output_rate": "297564000", + "input_pps": "201", + "output_pps": "40328", + "input_packets": "895990058316", + "output_packets": "933795880615", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE1/0/26", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.95da", + "bia": "8c94.1fcd.95da", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "40Gb/s", + "media_type": "QSFP 40G SR BD SFP", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "797000", + "output_rate": "267429000", + "input_pps": "292", + "output_pps": "35845", + "input_packets": "899476977745", + "output_packets": "940193527818", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE1/0/27", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.95db", + "bia": "8c94.1fcd.95db", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "100000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE1/0/28", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.95dc", + "bia": "8c94.1fcd.95dc", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "100000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c1", + "bia": "8c94.1fcd.d1c1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseSX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:07", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "479123000", + "output_rate": "85238000", + "input_pps": "54979", + "output_pps": "26839", + "input_packets": "2268968017955", + "output_packets": "679876745726", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/2", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c2", + "bia": "8c94.1fcd.d1c2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseLX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "338971000", + "output_rate": "88655000", + "input_pps": "41114", + "output_pps": "24125", + "input_packets": "2266672571771", + "output_packets": "679026439143", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/3", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c3", + "bia": "8c94.1fcd.d1c3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:06", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "70287000", + "output_rate": "432957000", + "input_pps": "21401", + "output_pps": "49387", + "input_packets": "480992016929", + "output_packets": "1176820091720", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/4", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c4", + "bia": "8c94.1fcd.d1c4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:07", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "76909000", + "output_rate": "361269000", + "input_pps": "24938", + "output_pps": "42023", + "input_packets": "482618750531", + "output_packets": "1176896850271", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/5", + "link_status": "administratively down", + "protocol_status": "down (disabled)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c5", + "bia": "8c94.1fcd.d1c5", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c6", + "bia": "8c94.1fcd.d1c6", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/7", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c7", + "bia": "8c94.1fcd.d1c7", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:17", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "8578000", + "output_rate": "17443000", + "input_pps": "687", + "output_pps": "779", + "input_packets": "34657447107", + "output_packets": "36466216074", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/8", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c8", + "bia": "8c94.1fcd.d1c8", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:05", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "18384000", + "output_rate": "9244000", + "input_pps": "1282", + "output_pps": "1171", + "input_packets": "61295941330", + "output_packets": "57251904770", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1c9", + "bia": "8c94.1fcd.d1c9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/10", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1ca", + "bia": "8c94.1fcd.d1ca", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/11", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1cb", + "bia": "8c94.1fcd.d1cb", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:14", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "1000", + "input_pps": "0", + "output_pps": "1", + "input_packets": "7506443623", + "output_packets": "26847225982", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/12", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1cc", + "bia": "8c94.1fcd.d1cc", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:10", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "96897000", + "output_rate": "818617000", + "input_pps": "28031", + "output_pps": "96533", + "input_packets": "1329937941798", + "output_packets": "4532173701988", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/13", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1cd", + "bia": "8c94.1fcd.d1cd", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:14", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "1000", + "input_pps": "0", + "output_pps": "1", + "input_packets": "13253126610", + "output_packets": "4705866316", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/14", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1ce", + "bia": "8c94.1fcd.d1ce", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:10", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "403223000", + "output_rate": "146905000", + "input_pps": "45487", + "output_pps": "46276", + "input_packets": "2300544594949", + "output_packets": "955448637588", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/15", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1cf", + "bia": "8c94.1fcd.d1cf", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/16", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d0", + "bia": "8c94.1fcd.d1d0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/17", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d1", + "bia": "8c94.1fcd.d1d1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/18", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d2", + "bia": "8c94.1fcd.d1d2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseSX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:28", + "last_output": "00:00:07", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "2000", + "output_rate": "19000", + "input_pps": "3", + "output_pps": "10", + "input_packets": "302247909", + "output_packets": "84972394", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/19", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d3", + "bia": "8c94.1fcd.d1d3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/20", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d4", + "bia": "8c94.1fcd.d1d4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "unknown", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "2y48w", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/21", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d5", + "bia": "8c94.1fcd.d1d5", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/22", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d6", + "bia": "8c94.1fcd.d1d6", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/23", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d7", + "bia": "8c94.1fcd.d1d7", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "25000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "Class-based queueing", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TwentyFiveGigE2/0/24", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Twenty Five Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d8", + "bia": "8c94.1fcd.d1d8", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "1000BaseLX SFP", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:46", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "1104035", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE2/0/25", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1d9", + "bia": "8c94.1fcd.d1d9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "40Gb/s", + "media_type": "QSFP 40G SR BD SFP", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:32", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "297530000", + "output_rate": "331000", + "input_pps": "40316", + "output_pps": "203", + "input_packets": "933795964851", + "output_packets": "895990044004", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE2/0/26", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1da", + "bia": "8c94.1fcd.d1da", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "40Gb/s", + "media_type": "QSFP 40G SR BD SFP", + "bandwidth": "40000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:40", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "266852000", + "output_rate": "788000", + "input_pps": "35787", + "output_pps": "294", + "input_packets": "940193581466", + "output_packets": "899476968220", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE2/0/27", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1db", + "bia": "8c94.1fcd.d1db", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "100000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "HundredGigE2/0/28", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Hundred Gigabit Ethernet", + "mac_address": "8c94.1fcd.d1dc", + "bia": "8c94.1fcd.d1dc", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "unknown", + "bandwidth": "100000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel11", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.95c2", + "bia": "8c94.1fcd.95c2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "N/A", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "2000", + "output_rate": "3000", + "input_pps": "3", + "output_pps": "6", + "input_packets": "274456871697", + "output_packets": "1276315086272", + "runts": "0", + "giants": "0", + "input_errors": "1", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel12", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.95c3", + "bia": "8c94.1fcd.95c3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "N/A", + "bandwidth": "2000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:01", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "287000", + "output_rate": "262000", + "input_pps": "70", + "output_pps": "69", + "input_packets": "1486261331671", + "output_packets": "2286626502283", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel13", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.d1cb", + "bia": "8c94.1fcd.d1cb", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "N/A", + "bandwidth": "20000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "4000", + "input_pps": "0", + "output_pps": "4", + "input_packets": "14939177835", + "output_packets": "27959388985", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel14", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.d1cd", + "bia": "8c94.1fcd.d1cd", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "N/A", + "bandwidth": "20000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "2y33w", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "5000", + "input_pps": "0", + "output_pps": "7", + "input_packets": "26509321062", + "output_packets": "14311093065", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel21", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.d1c1", + "bia": "8c94.1fcd.d1c1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "N/A", + "bandwidth": "2000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "834394000", + "output_rate": "176942000", + "input_pps": "98100", + "output_pps": "52180", + "input_packets": "4535640766033", + "output_packets": "1358903281306", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel22", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.d1c3", + "bia": "8c94.1fcd.d1c3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "N/A", + "bandwidth": "2000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:01", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "150275000", + "output_rate": "810400000", + "input_pps": "47469", + "output_pps": "93320", + "input_packets": "963610855489", + "output_packets": "2353717109621", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel23", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.95cc", + "bia": "8c94.1fcd.95cc", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "N/A", + "bandwidth": "20000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "172129000", + "output_rate": "810726000", + "input_pps": "51404", + "output_pps": "96266", + "input_packets": "2657695154446", + "output_packets": "4827218070840", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel24", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.95ce", + "bia": "8c94.1fcd.95ce", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "N/A", + "bandwidth": "20000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "779514000", + "output_rate": "143626000", + "input_pps": "89754", + "output_pps": "45305", + "input_packets": "4601877242667", + "output_packets": "2437114265344", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel25", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "EtherChannel", + "mac_address": "0000.0000.0000", + "bia": "0000.0000.0000", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "N/A", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel30", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "8c94.1fcd.95d2", + "bia": "8c94.1fcd.95d2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "9216", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "N/A", + "bandwidth": "2000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:01", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "16000", + "output_rate": "18000", + "input_pps": "15", + "output_pps": "12", + "input_packets": "383948416", + "output_packets": "207352609", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + } + ], + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [ + "Twe1/0/1", + "Twe1/0/6", + "Twe1/0/9", + "Twe1/0/10", + "Twe1/0/16", + "Twe1/0/17", + "Twe1/0/19", + "Twe1/0/20", + "Twe1/0/21", + "Twe1/0/22", + "Hu1/0/27", + "Hu1/0/28", + "Twe2/0/5", + "Twe2/0/6", + "Twe2/0/9", + "Twe2/0/10", + "Twe2/0/15", + "Twe2/0/16", + "Twe2/0/17", + "Twe2/0/19", + "Twe2/0/20", + "Twe2/0/21", + "Twe2/0/22", + "Twe2/0/23", + "Hu2/0/27", + "Hu2/0/28" + ] + }, + { + "vlan_id": "100", + "vlan_name": "a vlan name", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "101", + "vlan_name": "a vlan name", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "200", + "vlan_name": "a vlan name", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "300", + "vlan_name": "a vlan name", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "301", + "vlan_name": "a vlan name", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "1002", + "vlan_name": "a vlan name", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1003", + "vlan_name": "a vlan name", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1004", + "vlan_name": "fddinet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1005", + "vlan_name": "trnet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "2100", + "vlan_name": "vlanNumber", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "2103", + "vlan_name": "vlanNumber", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "2950", + "vlan_name": "vlanNumber", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "2960", + "vlan_name": "vlanNumber", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3001", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3100", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3101", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3102", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3103", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3104", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3105", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3106", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3111", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3200", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3201", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3202", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3203", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3204", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3205", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3300", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3301", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3302", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3303", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3304", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3305", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3400", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "3500", + "vlan_name": "vlan", + "status": "active", + "interfaces": [] + } + ], + "show interfaces switchport": [ + { + "interface": "Twe1/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down (suspended member of bundle Po11)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2100-2110" + ] + }, + { + "interface": "Twe1/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po11)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2100-2110" + ] + }, + { + "interface": "Twe1/0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po12)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "3100-3110,3200-3205,3400" + ] + }, + { + "interface": "Twe1/0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po12)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "3100-3110,3200-3205,3400" + ] + }, + { + "interface": "Twe1/0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "3001" + ] + }, + { + "interface": "Twe1/0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "100,101,200-210,300-310,2950,2960,3200-3205,3300-3305", + "3400,3500" + ] + }, + { + "interface": "Twe1/0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "100,101,200-210,300-310,2950,2960,3200-3205,3300-3305", + "3400,3500" + ] + }, + { + "interface": "Twe1/0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po13)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "200-210,2100-2110" + ] + }, + { + "interface": "Twe1/0/12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po23)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "200-210,2100-2110" + ] + }, + { + "interface": "Twe1/0/13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po14)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300-310,3100-3110" + ] + }, + { + "interface": "Twe1/0/14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po24)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300-310,3100-3110" + ] + }, + { + "interface": "Twe1/0/15", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2103" + ] + }, + { + "interface": "Twe1/0/16", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/17", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/18", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po30)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300,2950,2960" + ] + }, + { + "interface": "Twe1/0/19", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/20", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/21", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/22", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe1/0/23", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2103,3001" + ] + }, + { + "interface": "Twe1/0/24", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "4094", + "native_vlan": "4094", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu1/0/25", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "4094", + "native_vlan": "4094", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu1/0/26", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "4094", + "native_vlan": "4094", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu1/0/27", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu1/0/28", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po21)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2100-2110" + ] + }, + { + "interface": "Twe2/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po21)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2100-2110" + ] + }, + { + "interface": "Twe2/0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po22)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "3100-3110,3300-3305,3500" + ] + }, + { + "interface": "Twe2/0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po22)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "3100-3110,3300-3305,3500" + ] + }, + { + "interface": "Twe2/0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "100,101,200-210,300-310,2950,2960,3200-3205,3300-3305", + "3400,3500" + ] + }, + { + "interface": "Twe2/0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "100,101,200-210,300-310,2950,2960,3200-3205,3300-3305", + "3400,3500" + ] + }, + { + "interface": "Twe2/0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po13)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "200-210,2100-2110" + ] + }, + { + "interface": "Twe2/0/12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po23)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "200-210,2100-2110" + ] + }, + { + "interface": "Twe2/0/13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po14)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300-310,3100-3110" + ] + }, + { + "interface": "Twe2/0/14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po24)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300-310,3100-3110" + ] + }, + { + "interface": "Twe2/0/15", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/16", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/17", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/18", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po30)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300,2950,2960" + ] + }, + { + "interface": "Twe2/0/19", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/20", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/21", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/22", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/23", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Twe2/0/24", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "4094", + "native_vlan": "4094", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu2/0/25", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "4094", + "native_vlan": "4094", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu2/0/26", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "4094", + "native_vlan": "4094", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu2/0/27", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Hu2/0/28", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Po11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2100-2110" + ] + }, + { + "interface": "Po12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "3100-3110,3200-3205,3400" + ] + }, + { + "interface": "Po13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "200-210,2100-2110" + ] + }, + { + "interface": "Po14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300-310,3100-3110" + ] + }, + { + "interface": "Po21", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "2100-2110" + ] + }, + { + "interface": "Po22", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "3100-3110,3300-3305,3500" + ] + }, + { + "interface": "Po23", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "200-210,2100-2110" + ] + }, + { + "interface": "Po24", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300-310,3100-3110" + ] + }, + { + "interface": "Po25", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "trunk", + "access_vlan": "unassigned", + "native_vlan": "0", + "voice_vlan": "none", + "trunking_vlans": [ + "4000" + ] + }, + { + "interface": "Po30", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "300,2950,2960" + ] + } + ], + "show etherchannel summary": [ + { + "group": "11", + "bundle_name": "Po11", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe1/0/1", + "Twe1/0/2" + ], + "member_interface_status": [ + "D", + "P" + ] + }, + { + "group": "12", + "bundle_name": "Po12", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe1/0/3", + "Twe1/0/4" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "group": "13", + "bundle_name": "Po13", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe1/0/11", + "Twe2/0/11" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "group": "14", + "bundle_name": "Po14", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe1/0/13", + "Twe2/0/13" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "group": "21", + "bundle_name": "Po21", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe2/0/1", + "Twe2/0/2" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "group": "22", + "bundle_name": "Po22", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe2/0/3", + "Twe2/0/4" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "group": "23", + "bundle_name": "Po23", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe1/0/12", + "Twe2/0/12" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "group": "24", + "bundle_name": "Po24", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe1/0/14", + "Twe2/0/14" + ], + "member_interface_status": [ + "P", + "P" + ] + }, + { + "group": "25", + "bundle_name": "Po25", + "bundle_status": "SD", + "bundle_protocol": "-", + "member_interface": [], + "member_interface_status": [] + }, + { + "group": "30", + "bundle_name": "Po30", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Twe1/0/18", + "Twe2/0/18" + ], + "member_interface_status": [ + "P", + "P" + ] + } + ], + "show ip interface": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/0", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "198.51.100.1" + ], + "prefix_length": [ + "28" + ], + "vrf": "Mgmt-vrf", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/1", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/2", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/3", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/4", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/5", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/7", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/8", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/11", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/12", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/13", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/14", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/15", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/17", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/18", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/19", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/20", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/21", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/22", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/23", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE1/0/24", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE1/0/25", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE1/0/26", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE1/0/27", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE1/0/28", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/2", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/3", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/4", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/5", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/7", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/8", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/11", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/12", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/13", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/14", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/15", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/17", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/18", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/19", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/20", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/21", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/22", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/23", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TwentyFiveGigE2/0/24", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE2/0/25", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE2/0/26", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE2/0/27", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "HundredGigE2/0/28", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel11", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel12", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel13", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel14", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel21", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel22", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel23", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel24", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel25", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel30", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml b/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml new file mode 100755 index 00000000..60d6a241 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml @@ -0,0 +1,118 @@ +--- +sync_devices: + hostname: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hostname" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial[]" + post_processor: "{{ obj | unique | first }}" + device_type: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hardware[]" + post_processor: "{{ obj | unique | first }}" + mgmt_interface: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].{name: interface, enabled: link_status}" + post_processor: "{{ (obj | selectattr('enabled', 'eq', 'up') | list | first ).name }}" + mask_length: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].prefix_length" + post_processor: "{{ obj | unique | first }}" +sync_network_data: + pre_processor: + vlan_map: + commands: + - command: "show vlan" + parser: "textfsm" + jpath: "[*].{id: vlan_id, name: vlan_name}" + # post_processor: "{% set result={} %}{% for entry in obj %}{{ result.update({entry['id']: entry['name']}) or '' }}{% endfor %}{{ result }}" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial[]" + interfaces: + root_key: true + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[*].interface" # when root_key=true this extracted value is what becomes interable in keys using __ under `current_key`. + post_processor: "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" + interfaces__type: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].hardware_type" + post_processor: "{{ obj[0] | map_interface_type }}" + interfaces__ip_addresses: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{ip_address: ip_address, prefix_length: prefix_length}" + iterable_type: "list" + interfaces__mtu: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mtu" + interfaces__mac_address: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mac_address" + interfaces__description: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].description" + interfaces__link_status: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].link_status" + post_processor: "{{ obj[0] | interface_status_to_bool }}" + interfaces__802.1Q_mode: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}" + post_processor: "{{ obj | interface_mode_logic }}" + iterable_type: "str" + interfaces__lag: + commands: + - command: "show etherchannel summary" + parser: "textfsm" + jpath: "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}" + iterable_type: "str" + interfaces__vrf: + commands: + - command: "show ip interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{name:vrf}" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | key_exist_or_default('name') | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" + interfaces__tagged_vlans: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}" + post_processor: "{{ obj | get_vlan_data | tojson }}" + interfaces__untagged_vlan: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" + post_processor: "{% if obj | length > 0 %}{{ vlan_map | selectattr('id', 'eq', obj[0]) | list | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json new file mode 100755 index 00000000..ce3a60cc --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json @@ -0,0 +1,25971 @@ +{ + "show interfaces routing-instance all terse | display json": {}, + "show version | display json": { + "software-information": [ + { + "host-name": [ + { + "data": "JUNOS-PE1" + } + ], + "product-model": [ + { + "data": "mx10-t" + } + ], + "product-name": [ + { + "data": "mx10-t" + } + ], + "junos-version": [ + { + "data": "20.4R3.8" + } + ], + "package-information": [ + { + "name": [ + { + "data": "junos" + } + ], + "comment": [ + { + "data": "JUNOS Base OS boot [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jbase" + } + ], + "comment": [ + { + "data": "JUNOS Base OS Software Suite [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jcrypto" + } + ], + "comment": [ + { + "data": "JUNOS Crypto Software Suite [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jpfe" + } + ], + "comment": [ + { + "data": "JUNOS Packet Forwarding Engine Support (MX80) [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jdocs" + } + ], + "comment": [ + { + "data": "JUNOS Online Documentation [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jsdn-powerpc" + } + ], + "comment": [ + { + "data": "JUNOS SDN Software Suite [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-alg" + } + ], + "comment": [ + { + "data": "JUNOS Services Application Level Gateways [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-cos" + } + ], + "comment": [ + { + "data": "JUNOS Services COS [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-jflow" + } + ], + "comment": [ + { + "data": "JUNOS Services Jflow Container package [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-sfw" + } + ], + "comment": [ + { + "data": "JUNOS Services Stateful Firewall [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-nat" + } + ], + "comment": [ + { + "data": "JUNOS Services NAT [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-rpm" + } + ], + "comment": [ + { + "data": "JUNOS Services RPM [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-softwire" + } + ], + "comment": [ + { + "data": "JUNOS Services SOFTWIRE [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-cpcd" + } + ], + "comment": [ + { + "data": "JUNOS Services Captive Portal and Content Delivery Container package [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jmacsec" + } + ], + "comment": [ + { + "data": "JUNOS Macsec Software Suite [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-crypto-base" + } + ], + "comment": [ + { + "data": "JUNOS Services Crypto [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-ipsec" + } + ], + "comment": [ + { + "data": "JUNOS Services IPSec [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-rtcom" + } + ], + "comment": [ + { + "data": "JUNOS Services RTCOM [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-ssl" + } + ], + "comment": [ + { + "data": "JUNOS Services SSL [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jservices-tcp-log" + } + ], + "comment": [ + { + "data": "JUNOS Services TCP-LOG [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jcrypto-dp-support" + } + ], + "comment": [ + { + "data": "JUNOS DP Crypto Software Software Suite [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "py-base-powerpc" + } + ], + "comment": [ + { + "data": "JUNOS py-base-powerpc [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "py-base2-powerpc" + } + ], + "comment": [ + { + "data": "JUNOS py-base2-powerpc [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "py-extensions-powerpc" + } + ], + "comment": [ + { + "data": "JUNOS py-extensions-powerpc [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "py-extensions2-powerpc" + } + ], + "comment": [ + { + "data": "JUNOS py-extensions2-powerpc [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jsd" + } + ], + "comment": [ + { + "data": "JUNOS jsd [powerpc-20.4R3.8-jet-1]" + } + ] + }, + { + "name": [ + { + "data": "jkernel" + } + ], + "comment": [ + { + "data": "JUNOS Kernel Software Suite [20.4R3.8]" + } + ] + }, + { + "name": [ + { + "data": "jroute" + } + ], + "comment": [ + { + "data": "JUNOS Routing Software Suite [20.4R3.8]" + } + ] + } + ] + } + ] + }, + "show chassis hardware | display json": { + "chassis-inventory": [ + { + "attributes": { + "xmlns": "http://xml.juniper.net/junos/20.4R0/junos-chassis" + }, + "chassis": [ + { + "attributes": { + "junos:style": "inventory" + }, + "name": [ + { + "data": "Chassis" + } + ], + "serial-number": [ + { + "data": "T9958" + } + ], + "description": [ + { + "data": "MX10-T" + } + ], + "chassis-module": [ + { + "name": [ + { + "data": "Midplane" + } + ], + "version": [ + { + "data": "REV 11" + } + ], + "part-number": [ + { + "data": "711-038213" + } + ], + "serial-number": [ + { + "data": "ABCH3315" + } + ], + "description": [ + { + "data": "MX10-T" + } + ], + "clei-code": [ + { + "data": "IPM8T10BRA" + } + ], + "model-number": [ + { + "data": "CHAS-MX10-T-S" + } + ] + }, + { + "name": [ + { + "data": "PEM 0" + } + ], + "version": [ + { + "data": "Rev 05" + } + ], + "part-number": [ + { + "data": "740-028288" + } + ], + "serial-number": [ + { + "data": "XH07209" + } + ], + "description": [ + { + "data": "AC Power Entry Module" + } + ], + "clei-code": [ + { + "data": "COUPAFAEAB" + } + ], + "model-number": [ + { + "data": "PWR-MX80-AC-S" + } + ] + }, + { + "name": [ + { + "data": "PEM 1" + } + ], + "version": [ + { + "data": "Rev 05" + } + ], + "part-number": [ + { + "data": "740-028288" + } + ], + "serial-number": [ + { + "data": "1GA74320781" + } + ], + "description": [ + { + "data": "AC Power Entry Module" + } + ], + "clei-code": [ + { + "data": "COUPAFAEAB" + } + ], + "model-number": [ + { + "data": "PWR-MX80-AC-S" + } + ] + }, + { + "name": [ + { + "data": "Routing Engine" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "Routing Engine" + } + ] + }, + { + "name": [ + { + "data": "TFEB 0" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "Forwarding Engine Processor" + } + ], + "chassis-sub-module": [ + { + "name": [ + { + "data": "QXM 0" + } + ], + "version": [ + { + "data": "REV 07" + } + ], + "part-number": [ + { + "data": "711-028408" + } + ], + "serial-number": [ + { + "data": "ABCT6963" + } + ], + "description": [ + { + "data": "MPC QXM" + } + ] + } + ] + }, + { + "name": [ + { + "data": "FPC 0" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "MPC BUILTIN" + } + ], + "chassis-sub-module": [ + { + "name": [ + { + "data": "MIC 0" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "4x 10GE XFP" + } + ], + "chassis-sub-sub-module": [ + { + "name": [ + { + "data": "PIC 0" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "4x 10GE XFP" + } + ], + "chassis-sub-sub-sub-module": [ + { + "name": [ + { + "data": "Xcvr 0" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-033777" + } + ], + "serial-number": [ + { + "data": "US106VG" + } + ], + "description": [ + { + "data": "XFP-10G-SR" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 1" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-031833" + } + ], + "serial-number": [ + { + "data": "USC13PJ" + } + ], + "description": [ + { + "data": "XFP-10G-LR" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 2" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-033777" + } + ], + "serial-number": [ + { + "data": "US106YC" + } + ], + "description": [ + { + "data": "XFP-10G-SR" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 3" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-033777" + } + ], + "serial-number": [ + { + "data": "US80D22" + } + ], + "description": [ + { + "data": "XFP-10G-SR" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "FPC 1" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "MPC BUILTIN" + } + ], + "chassis-sub-module": [ + { + "name": [ + { + "data": "MIC 0" + } + ], + "version": [ + { + "data": "REV 30" + } + ], + "part-number": [ + { + "data": "750-028392" + } + ], + "serial-number": [ + { + "data": "ABCV8313" + } + ], + "description": [ + { + "data": "3D 20x 1GE(LAN) SFP" + } + ], + "clei-code": [ + { + "data": "COUIBCRBAA" + } + ], + "model-number": [ + { + "data": "MIC-3D-20GE-SFP" + } + ], + "chassis-sub-sub-module": [ + { + "name": [ + { + "data": "PIC 0" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "10x 1GE(LAN) SFP" + } + ], + "chassis-sub-sub-sub-module": [ + { + "name": [ + { + "data": "Xcvr 0" + } + ], + "version": [ + { + "data": "REV 02" + } + ], + "part-number": [ + { + "data": "740-013111" + } + ], + "serial-number": [ + { + "data": "C350184" + } + ], + "description": [ + { + "data": "SFP-T" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 9" + } + ], + "version": [ + { + "data": "REV 02" + } + ], + "part-number": [ + { + "data": "740-013111" + } + ], + "serial-number": [ + { + "data": "C411975" + } + ], + "description": [ + { + "data": "SFP-T" + } + ] + } + ] + }, + { + "name": [ + { + "data": "PIC 1" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "10x 1GE(LAN) SFP" + } + ], + "chassis-sub-sub-sub-module": [ + { + "name": [ + { + "data": "Xcvr 0" + } + ], + "version": [ + { + "data": "REV 02" + } + ], + "part-number": [ + { + "data": "740-013111" + } + ], + "serial-number": [ + { + "data": "C350850" + } + ], + "description": [ + { + "data": "SFP-T" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 6" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-031850" + } + ], + "serial-number": [ + { + "data": "NS63YB1" + } + ], + "description": [ + { + "data": "SFP-LX10" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 7" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-031850" + } + ], + "serial-number": [ + { + "data": "NS639CT" + } + ], + "description": [ + { + "data": "SFP-LX10" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 8" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-031850" + } + ], + "serial-number": [ + { + "data": "NS63YFV" + } + ], + "description": [ + { + "data": "SFP-LX10" + } + ] + }, + { + "name": [ + { + "data": "Xcvr 9" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-031850" + } + ], + "serial-number": [ + { + "data": "NS639EF" + } + ], + "description": [ + { + "data": "SFP-LX10" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "MIC 1" + } + ], + "version": [ + { + "data": "REV 25" + } + ], + "part-number": [ + { + "data": "750-028380" + } + ], + "serial-number": [ + { + "data": "ABCY2259" + } + ], + "description": [ + { + "data": "3D 2x 10GE XFP" + } + ], + "clei-code": [ + { + "data": "COUIBDXBAA" + } + ], + "model-number": [ + { + "data": "MIC-3D-2XGE-XFP" + } + ], + "chassis-sub-sub-module": [ + { + "name": [ + { + "data": "PIC 2" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "1x 10GE XFP" + } + ], + "chassis-sub-sub-sub-module": [ + { + "name": [ + { + "data": "Xcvr 0" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-031833" + } + ], + "serial-number": [ + { + "data": "USC13CF" + } + ], + "description": [ + { + "data": "XFP-10G-LR" + } + ] + } + ] + }, + { + "name": [ + { + "data": "PIC 3" + } + ], + "part-number": [ + { + "data": "BUILTIN" + } + ], + "serial-number": [ + { + "data": "BUILTIN" + } + ], + "description": [ + { + "data": "1x 10GE XFP" + } + ], + "chassis-sub-sub-sub-module": [ + { + "name": [ + { + "data": "Xcvr 0" + } + ], + "version": [ + { + "data": "REV 01" + } + ], + "part-number": [ + { + "data": "740-033777" + } + ], + "serial-number": [ + { + "data": "US80D2Y" + } + ], + "description": [ + { + "data": "XFP-10G-SR" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "Fan Tray" + } + ], + "description": [ + { + "data": "Fan Tray" + } + ], + "model-number": [ + { + "data": "FANTRAY-MX80-S" + } + ] + } + ] + } + ] + } + ] + }, + "show interfaces terse | display json": { + "interface-information": [ + { + "attributes": { + "xmlns": "http://xml.juniper.net/junos/20.4R0/junos-interface", + "junos:style": "terse" + }, + "physical-interface": [ + { + "name": [ + { + "data": "lc-0/0/0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "lc-0/0/0.32769" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "vpls" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "pfe-0/0/0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "pfe-0/0/0.16383" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "pfh-0/0/0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "pfh-0/0/0.16383" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + } + ] + }, + { + "name": [ + { + "data": "pfh-0/0/0.16384" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "aenet" + } + ], + "ae-bundle-name": [ + { + "data": "ae0.0" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/1" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/1.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "aenet" + } + ], + "ae-bundle-name": [ + { + "data": "ae14.0" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/2.3100" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.98.49/30", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3101" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.106.245/30", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3102" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.104.1/30", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3103" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.106.241/30", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3104" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.106.249/30", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.32767" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/3" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/3.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "ccc" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/0/0.2950" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.209.193/28", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "ifa-local": [ + { + "data": "13.65.209.194/28", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/0.2953" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.145.73/29", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "ifa-local": [ + { + "data": "13.65.145.75/29", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/0.32767" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/1" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/2" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/3" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/4" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/5" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/6" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/7" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/8" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/9" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/0" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/1" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/2" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/3" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/4" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/5" + } + ], + "admin-status": [ + { + "data": "down" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/6" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/6.16386" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/7" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/7.16386" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/8" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/8.16386" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/9" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/9.16386" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "xe-1/2/0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-1/2/0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "aenet" + } + ], + "ae-bundle-name": [ + { + "data": "ae11.0" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-1/3/0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-1/3/0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "ccc" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ae0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ae0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.230.30/31", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "mpls", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ae3" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "down" + } + ] + }, + { + "name": [ + { + "data": "ae11" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ae11.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.231.109/31", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "mpls", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ae14" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ae14.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "13.65.231.118/31", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "mpls", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "cbp0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "demux0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "dsc" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "em0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "em0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "10.0.0.4/8", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "ifa-local": [ + { + "data": "133.4.74.1/2", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "ifa-local": [ + { + "data": "133.4.74.4/2", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "af06:e3b6:61bb:2fc8:9b44:3a70:4d3a:8304/64", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "ifa-local": [ + { + "data": "af47:43cc:8ad3:722:24ff:168e:79be:a504/64", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "tnp" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "0x4", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "em1" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "em1.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "10.0.0.1/8", + "attributes": { + "junos:emit": "emit" + } + } + ] + }, + { + "ifa-local": [ + { + "data": "133.4.74.1/2", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "tnp" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "0x4", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "esi" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti1" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti2" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti3" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti4" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti5" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti6" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fti7" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "fxp0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "fxp0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "gre" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "ipip" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "irb" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "jsrv" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "jsrv.1" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "133.4.74.127/2", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lo0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "lo0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "198.51.100.1" + } + ], + "ifa-destination": [ + { + "data": "0/0", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "49.013.0065.0224.0113", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "af06:e3b6:61bb:2fc8:ad6c:c0a1:8292:d9ff" + } + ], + "ifa-destination": [ + { + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lo0.16384" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "interface-address": [ + { + "ifa-local": [ + { + "data": "66.33.236.1" + } + ], + "ifa-destination": [ + { + "data": "0/0", + "attributes": { + "junos:emit": "emit" + } + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lo0.16385" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "lsi.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.1" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.2" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.3" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.4" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.5" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.6" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.7" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "me0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "me0.0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "mtun" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "pimd" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "pime" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "pip0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "pp0" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "rbeb" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "tap" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + }, + { + "name": [ + { + "data": "vtep" + } + ], + "admin-status": [ + { + "data": "up" + } + ], + "oper-status": [ + { + "data": "up" + } + ] + } + ] + } + ] + }, + "show route protocol direct | display json": { + "route-information": [ + { + "attributes": { + "xmlns": "http://xml.juniper.net/junos/20.4R0/junos-routing" + }, + "route-table": [ + { + "comment": "keepalive", + "table-name": [ + { + "data": "inet.0" + } + ], + "destination-count": [ + { + "data": "305" + } + ], + "total-route-count": [ + { + "data": "305" + } + ], + "active-route-count": [ + { + "data": "297" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "8" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "198.51.100.1/32" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:22:53", + "attributes": { + "junos:seconds": "45285773" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "lo0.0" + } + ] + } + ] + } + ] + }, + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.231.108/31" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "5d 12:23:33", + "attributes": { + "junos:seconds": "476613" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "ae11.0" + } + ] + } + ] + } + ] + }, + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.231.118/31" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "34w0d 10:32:07", + "attributes": { + "junos:seconds": "20601127" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "ae14.0" + } + ] + } + ] + } + ] + }, + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.230.30/31" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:29", + "attributes": { + "junos:seconds": "45285689" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "ae0.0" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "inet.3" + } + ], + "destination-count": [ + { + "data": "97" + } + ], + "total-route-count": [ + { + "data": "97" + } + ], + "active-route-count": [ + { + "data": "97" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-CORP.inet.0" + } + ], + "destination-count": [ + { + "data": "7298" + } + ], + "total-route-count": [ + { + "data": "37654" + } + ], + "active-route-count": [ + { + "data": "7297" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "1" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.98.48/30" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:31", + "attributes": { + "junos:seconds": "45285691" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "xe-0/0/2.3100" + } + ] + } + ] + } + ] + }, + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.145.72/29" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:22", + "attributes": { + "junos:seconds": "45285682" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "ge-1/0/0.2953" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-DEVICES.inet.0" + } + ], + "destination-count": [ + { + "data": "724" + } + ], + "total-route-count": [ + { + "data": "3616" + } + ], + "active-route-count": [ + { + "data": "724" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "2" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.106.248/30" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:31", + "attributes": { + "junos:seconds": "45285691" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "xe-0/0/2.3104" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-GUEST.inet.0" + } + ], + "destination-count": [ + { + "data": "834" + } + ], + "total-route-count": [ + { + "data": "4246" + } + ], + "active-route-count": [ + { + "data": "834" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "3" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.106.244/30" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:31", + "attributes": { + "junos:seconds": "45285691" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "xe-0/0/2.3101" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-IND.inet.0" + } + ], + "destination-count": [ + { + "data": "722" + } + ], + "total-route-count": [ + { + "data": "3598" + } + ], + "active-route-count": [ + { + "data": "721" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "3" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.104.0/30" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:31", + "attributes": { + "junos:seconds": "45285691" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "xe-0/0/2.3102" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-NETMGMT.inet.0" + } + ], + "destination-count": [ + { + "data": "128" + } + ], + "total-route-count": [ + { + "data": "497" + } + ], + "active-route-count": [ + { + "data": "128" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.209.192/28" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:22", + "attributes": { + "junos:seconds": "45285682" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "ge-1/0/0.2950" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-RED.inet.0" + } + ], + "destination-count": [ + { + "data": "212" + } + ], + "total-route-count": [ + { + "data": "878" + } + ], + "active-route-count": [ + { + "data": "212" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-USER.inet.0" + } + ], + "destination-count": [ + { + "data": "797" + } + ], + "total-route-count": [ + { + "data": "4054" + } + ], + "active-route-count": [ + { + "data": "797" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "2" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "13.65.106.240/30" + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:21:31", + "attributes": { + "junos:seconds": "45285691" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "xe-0/0/2.3103" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "iso.0" + } + ], + "destination-count": [ + { + "data": "1" + } + ], + "total-route-count": [ + { + "data": "1" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "49.013.0065.0224.0113" + } + ], + "rt-prefix-length": [ + { + "data": "72", + "attributes": { + "junos:emit": "emit" + } + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:22:53", + "attributes": { + "junos:seconds": "45285773" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "lo0.0" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "mpls.0" + } + ], + "destination-count": [ + { + "data": "1468" + } + ], + "total-route-count": [ + { + "data": "1468" + } + ], + "active-route-count": [ + { + "data": "1468" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "bgp.l3vpn.0" + } + ], + "destination-count": [ + { + "data": "27044" + } + ], + "total-route-count": [ + { + "data": "54088" + } + ], + "active-route-count": [ + { + "data": "27044" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "inet6.0" + } + ], + "destination-count": [ + { + "data": "2" + } + ], + "total-route-count": [ + { + "data": "2" + } + ], + "active-route-count": [ + { + "data": "2" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ], + "rt": [ + { + "attributes": { + "junos:style": "brief" + }, + "rt-destination": [ + { + "data": "af06:e3b6:61bb:2fc8:ad6c:c0a1:8292:d9ff/128", + "attributes": { + "junos:emit": "emit" + } + } + ], + "rt-entry": [ + { + "active-tag": [ + { + "data": "*" + } + ], + "current-active": [ + { + "data": [ + null + ] + } + ], + "last-active": [ + { + "data": [ + null + ] + } + ], + "protocol-name": [ + { + "data": "Direct" + } + ], + "preference": [ + { + "data": "0" + } + ], + "age": [ + { + "data": "74w6d 03:22:54", + "attributes": { + "junos:seconds": "45285774" + } + } + ], + "nh": [ + { + "selected-next-hop": [ + { + "data": [ + null + ] + } + ], + "via": [ + { + "data": "lo0.0" + } + ] + } + ] + } + ] + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-COMMSVCS.inet6.0" + } + ], + "destination-count": [ + { + "data": "1" + } + ], + "total-route-count": [ + { + "data": "1" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-CORP.inet6.0" + } + ], + "destination-count": [ + { + "data": "15" + } + ], + "total-route-count": [ + { + "data": "69" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "68" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-DEVICES.inet6.0" + } + ], + "destination-count": [ + { + "data": "20" + } + ], + "total-route-count": [ + { + "data": "81" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "80" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-GUEST.inet6.0" + } + ], + "destination-count": [ + { + "data": "21" + } + ], + "total-route-count": [ + { + "data": "85" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "84" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-IND.inet6.0" + } + ], + "destination-count": [ + { + "data": "14" + } + ], + "total-route-count": [ + { + "data": "65" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "64" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-NETMGMT.inet6.0" + } + ], + "destination-count": [ + { + "data": "1" + } + ], + "total-route-count": [ + { + "data": "1" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-RED.inet6.0" + } + ], + "destination-count": [ + { + "data": "14" + } + ], + "total-route-count": [ + { + "data": "53" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "52" + } + ] + }, + { + "table-name": [ + { + "data": "L32a2f5a-USER.inet6.0" + } + ], + "destination-count": [ + { + "data": "14" + } + ], + "total-route-count": [ + { + "data": "65" + } + ], + "active-route-count": [ + { + "data": "1" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "64" + } + ] + }, + { + "table-name": [ + { + "data": "bgp.l2vpn.0" + } + ], + "destination-count": [ + { + "data": "2" + } + ], + "total-route-count": [ + { + "data": "4" + } + ], + "active-route-count": [ + { + "data": "2" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "DEFPE1-ACME9525PE1.l2vpn.0" + } + ], + "destination-count": [ + { + "data": "2" + } + ], + "total-route-count": [ + { + "data": "3" + } + ], + "active-route-count": [ + { + "data": "2" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "ABC525PE1-ABCPE1.l2vpn.0" + } + ], + "destination-count": [ + { + "data": "2" + } + ], + "total-route-count": [ + { + "data": "3" + } + ], + "active-route-count": [ + { + "data": "2" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "bgp.l3vpn-inet6.0" + } + ], + "destination-count": [ + { + "data": "206" + } + ], + "total-route-count": [ + { + "data": "412" + } + ], + "active-route-count": [ + { + "data": "0" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "412" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "bgp.mvpn.0" + } + ], + "destination-count": [ + { + "data": "4" + } + ], + "total-route-count": [ + { + "data": "6" + } + ], + "active-route-count": [ + { + "data": "4" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "bgp.mvpn-inet6.0" + } + ], + "destination-count": [ + { + "data": "4" + } + ], + "total-route-count": [ + { + "data": "6" + } + ], + "active-route-count": [ + { + "data": "4" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "DEFPE1-ACME9525PE1.l2id.0" + } + ], + "destination-count": [ + { + "data": "2" + } + ], + "total-route-count": [ + { + "data": "4" + } + ], + "active-route-count": [ + { + "data": "2" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + }, + { + "table-name": [ + { + "data": "ABC525PE1-ABCPE1.l2id.0" + } + ], + "destination-count": [ + { + "data": "2" + } + ], + "total-route-count": [ + { + "data": "4" + } + ], + "active-route-count": [ + { + "data": "2" + } + ], + "holddown-route-count": [ + { + "data": "0" + } + ], + "hidden-route-count": [ + { + "data": "0" + } + ], + "restart-state": [ + { + "data": "Complete" + } + ] + } + ] + } + ] + }, + "show interfaces | display json": { + "interface-information": [ + { + "attributes": { + "xmlns": "http://xml.juniper.net/junos/20.4R0/junos-interface", + "junos:style": "normal" + }, + "physical-interface": [ + { + "name": [ + { + "data": "lc-0/0/0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "149" + } + ], + "snmp-index": [ + { + "data": "506" + } + ], + "speed": [ + { + "data": "800mbps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + {} + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "lc-0/0/0.32769" + } + ], + "local-index": [ + { + "data": "348" + } + ], + "snmp-index": [ + { + "data": "507" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "logical-interface-bandwidth": [ + { + "data": "0" + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "vpls" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "pfe-0/0/0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "151" + } + ], + "snmp-index": [ + { + "data": "509" + } + ], + "speed": [ + { + "data": "800mbps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + {} + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "pfe-0/0/0.16383" + } + ], + "local-index": [ + { + "data": "349" + } + ], + "snmp-index": [ + { + "data": "510" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "logical-interface-bandwidth": [ + { + "data": "0" + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "pfh-0/0/0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "150" + } + ], + "snmp-index": [ + { + "data": "508" + } + ], + "speed": [ + { + "data": "800mbps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + {} + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "pfh-0/0/0.16383" + } + ], + "local-index": [ + { + "data": "350" + } + ], + "snmp-index": [ + { + "data": "511" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "logical-interface-bandwidth": [ + { + "data": "0" + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "pfh-0/0/0.16384" + } + ], + "local-index": [ + { + "data": "351" + } + ], + "snmp-index": [ + { + "data": "581" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "logical-interface-bandwidth": [ + { + "data": "0" + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "152" + } + ], + "snmp-index": [ + { + "data": "514" + } + ], + "description": [ + { + "data": "a description" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mtu": [ + { + "data": "1602" + } + ], + "mru": [ + { + "data": "1610" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "none" + } + ], + "if-flow-control": [ + { + "data": "disabled" + } + ], + "if-speed-cfg": [ + { + "data": "Auto" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c0" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:00" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:31 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285694" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "51904024" + } + ], + "input-pps": [ + { + "data": "13081" + } + ], + "output-bps": [ + { + "data": "54142808" + } + ], + "output-pps": [ + { + "data": "9588" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "link-degrade-information": [ + { + "lnk-degrd-mon": [ + { + "data": "Disable" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/0.0" + } + ], + "local-index": [ + { + "data": "352" + } + ], + "snmp-index": [ + { + "data": "579" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "422722821868" + } + ], + "output-packets": [ + { + "data": "316139252715" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "aenet" + } + ], + "ae-bundle-name": [ + { + "data": "ae0.0" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/1" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "153" + } + ], + "snmp-index": [ + { + "data": "515" + } + ], + "description": [ + { + "data": "a description" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mtu": [ + { + "data": "1602" + } + ], + "mru": [ + { + "data": "1610" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "none" + } + ], + "if-flow-control": [ + { + "data": "disabled" + } + ], + "if-speed-cfg": [ + { + "data": "Auto" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c3" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:01" + } + ], + "interface-flapped": [ + { + "data": "2023-10-05 07:17:54 UTC (34w0d 10:32 ago)", + "attributes": { + "junos:seconds": "20601131" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "42775728" + } + ], + "input-pps": [ + { + "data": "8911" + } + ], + "output-bps": [ + { + "data": "55423152" + } + ], + "output-pps": [ + { + "data": "9375" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "46" + } + ], + "errored-blocks-seconds": [ + { + "data": "1517" + } + ] + } + ], + "link-degrade-information": [ + { + "lnk-degrd-mon": [ + { + "data": "Disable" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/1.0" + } + ], + "local-index": [ + { + "data": "353" + } + ], + "snmp-index": [ + { + "data": "573" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "148544493810" + } + ], + "output-packets": [ + { + "data": "241637003895" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "aenet" + } + ], + "ae-bundle-name": [ + { + "data": "ae14.0" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "154" + } + ], + "snmp-index": [ + { + "data": "564" + } + ], + "description": [ + { + "data": "UNI : : ACME9525RL1- : Te1/2/8" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mtu": [ + { + "data": "1522" + } + ], + "mru": [ + { + "data": "1530" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "none" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-speed-cfg": [ + { + "data": "Auto" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:02" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:02" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:31 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285694" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "191627208" + } + ], + "output-pps": [ + { + "data": "22568" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "link-degrade-information": [ + { + "lnk-degrd-mon": [ + { + "data": "Disable" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/2.3100" + } + ], + "local-index": [ + { + "data": "354" + } + ], + "snmp-index": [ + { + "data": "554" + } + ], + "description": [ + { + "data": "UNI : L32a2f5a-CORP : ACME9525RL1-VSS Ten 1/2/8" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x8100.3100 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x8100.3100 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "5370577" + } + ], + "output-packets": [ + { + "data": "146878731243" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-no-redirects": [ + { + "data": [ + null + ] + } + ], + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.98.48/30" + } + ], + "ifa-local": [ + { + "data": "13.65.98.49" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.98.51" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3101" + } + ], + "local-index": [ + { + "data": "355" + } + ], + "snmp-index": [ + { + "data": "548" + } + ], + "description": [ + { + "data": "UNI : L32a2f5a-GUEST : ACME9525RL1- : Te1/2/8 VID-3101" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x8100.3101 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x8100.3101 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "124920847" + } + ], + "output-packets": [ + { + "data": "1831595264" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-no-redirects": [ + { + "data": [ + null + ] + } + ], + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.106.244/30" + } + ], + "ifa-local": [ + { + "data": "13.65.106.245" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.106.247" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3102" + } + ], + "local-index": [ + { + "data": "356" + } + ], + "snmp-index": [ + { + "data": "550" + } + ], + "description": [ + { + "data": "UNI : L32a2f5a-IND : ACME9525RL1- : Te1/2/8 VID-3102" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x8100.3102 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x8100.3102 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "3148915" + } + ], + "output-packets": [ + { + "data": "3154101" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-no-redirects": [ + { + "data": [ + null + ] + } + ], + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.104.0/30" + } + ], + "ifa-local": [ + { + "data": "13.65.104.1" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.104.3" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3103" + } + ], + "local-index": [ + { + "data": "357" + } + ], + "snmp-index": [ + { + "data": "551" + } + ], + "description": [ + { + "data": "UNI : L32a2f5a-USER : ACME9525RL1- : Te1/2/8 VID-3103" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x8100.3103 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x8100.3103 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "166940786" + } + ], + "output-packets": [ + { + "data": "8632880481" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-no-redirects": [ + { + "data": [ + null + ] + } + ], + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.106.240/30" + } + ], + "ifa-local": [ + { + "data": "13.65.106.241" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.106.243" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.3104" + } + ], + "local-index": [ + { + "data": "358" + } + ], + "snmp-index": [ + { + "data": "553" + } + ], + "description": [ + { + "data": "UNI : L32a2f5a-DEVICES : ACME9525RL1- : Te1/2/8 VID-3104" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x8100.3104 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x8100.3104 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "132288169" + } + ], + "output-packets": [ + { + "data": "446833213" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-no-redirects": [ + { + "data": [ + null + ] + } + ], + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.106.248/30" + } + ], + "ifa-local": [ + { + "data": "13.65.106.249" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.106.251" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/2.32767" + } + ], + "local-index": [ + { + "data": "359" + } + ], + "snmp-index": [ + { + "data": "547" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x0000.0 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x0000.0 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "226096" + } + ], + "output-packets": [ + { + "data": "1631875" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-0/0/3" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "155" + } + ], + "snmp-index": [ + { + "data": "565" + } + ], + "link-level-type": [ + { + "data": "Ethernet-CCC" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mtu": [ + { + "data": "1522" + } + ], + "mru": [ + { + "data": "1530" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "none" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-speed-cfg": [ + { + "data": "Auto" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:03" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:03" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:31 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285694" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "65240" + } + ], + "input-pps": [ + { + "data": "60" + } + ], + "output-bps": [ + { + "data": "29616" + } + ], + "output-pps": [ + { + "data": "38" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "link-degrade-information": [ + { + "lnk-degrd-mon": [ + { + "data": "Disable" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-0/0/3.0" + } + ], + "local-index": [ + { + "data": "360" + } + ], + "snmp-index": [ + { + "data": "578" + } + ], + "description": [ + { + "data": "UNI : ABC525PE1-ABCPE1 : ACME9525RL1-VSS Ten1/2/6" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "Ethernet-CCC" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "5973057971" + } + ], + "output-packets": [ + { + "data": "2628850002" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "ccc" + } + ], + "mtu": [ + { + "data": "1522" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x402" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "156" + } + ], + "snmp-index": [ + { + "data": "516" + } + ], + "description": [ + { + "data": "UNI : : ACME9525-MS1 : Gi0/2" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1522" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1530" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-media-type": [ + { + "data": "Copper" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:60" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:60" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285685" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "7760" + } + ], + "input-pps": [ + { + "data": "5" + } + ], + "output-bps": [ + { + "data": "6304" + } + ], + "output-pps": [ + { + "data": "6" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/0/0.2950" + } + ], + "local-index": [ + { + "data": "361" + } + ], + "snmp-index": [ + { + "data": "513" + } + ], + "description": [ + { + "data": "UNI : L32a2f5a-NETMGMT : ACME9525-MS1 G0/2 VID-2950" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x8100.2950 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x8100.2950 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "137446420" + } + ], + "output-packets": [ + { + "data": "166509247" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "3" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.209.192/28" + } + ], + "ifa-local": [ + { + "data": "13.65.209.193" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.209.207" + } + ] + }, + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.209.192/28" + } + ], + "ifa-local": [ + { + "data": "13.65.209.194" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.209.207" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/0.2953" + } + ], + "local-index": [ + { + "data": "362" + } + ], + "snmp-index": [ + { + "data": "583" + } + ], + "description": [ + { + "data": "UNI : L32a2f5a-CORP : ACME9525-MS1 : Gi0/2 VID-2953" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x8100.2953 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x8100.2953 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "39337184" + } + ], + "output-packets": [ + { + "data": "63100209" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-no-redirects": [ + { + "data": [ + null + ] + } + ], + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.145.72/29" + } + ], + "ifa-local": [ + { + "data": "13.65.145.73" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.145.79" + } + ] + }, + { + "ifa-flags": [ + { + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.145.72/29" + } + ], + "ifa-local": [ + { + "data": "13.65.145.75" + } + ], + "ifa-broadcast": [ + { + "data": "13.65.145.79" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/0.32767" + } + ], + "local-index": [ + { + "data": "363" + } + ], + "snmp-index": [ + { + "data": "537" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "link-address": [ + { + "data": "[ 0x0000.0 ] ", + "attributes": { + "junos:format": "VLAN-Tag [ 0x0000.0 ] " + } + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "922889" + } + ], + "output-packets": [ + { + "data": "1631990" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/1" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "157" + } + ], + "snmp-index": [ + { + "data": "517" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:61" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:61" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/2" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "158" + } + ], + "snmp-index": [ + { + "data": "518" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:62" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:62" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/3" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "159" + } + ], + "snmp-index": [ + { + "data": "519" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:63" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:63" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/4" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "160" + } + ], + "snmp-index": [ + { + "data": "520" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:64" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:64" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/5" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "161" + } + ], + "snmp-index": [ + { + "data": "521" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:65" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:65" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/6" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "162" + } + ], + "snmp-index": [ + { + "data": "522" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:66" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:66" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/7" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "163" + } + ], + "snmp-index": [ + { + "data": "523" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:67" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:67" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/8" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "164" + } + ], + "snmp-index": [ + { + "data": "524" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:68" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:68" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/0/9" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "165" + } + ], + "snmp-index": [ + { + "data": "525" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-media-type": [ + { + "data": "Copper" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:69" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:69" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/0" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "166" + } + ], + "snmp-index": [ + { + "data": "526" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-media-type": [ + { + "data": "Copper" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:6c" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:6c" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/1" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "167" + } + ], + "snmp-index": [ + { + "data": "527" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:6d" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:6d" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/2" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "168" + } + ], + "snmp-index": [ + { + "data": "528" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:6e" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:6e" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/3" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "169" + } + ], + "snmp-index": [ + { + "data": "529" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:6f" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:6f" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/4" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "170" + } + ], + "snmp-index": [ + { + "data": "530" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:70" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:70" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/5" + } + ], + "admin-status": [ + { + "data": "down", + "attributes": { + "junos:format": "Administratively down" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "171" + } + ], + "snmp-index": [ + { + "data": "531" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:71" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:71" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/6" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "172" + } + ], + "snmp-index": [ + { + "data": "532" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-media-type": [ + { + "data": "Fiber" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:72" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:72" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:40 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285686" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/6.16386" + } + ], + "local-index": [ + { + "data": "364" + } + ], + "snmp-index": [ + { + "data": "587" + } + ], + "if-config-flags": [ + { + "iff-device-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/7" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "173" + } + ], + "snmp-index": [ + { + "data": "533" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-media-type": [ + { + "data": "Fiber" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-down": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:73" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:73" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:41 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285685" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "ethernet-alarm-link-down": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/7.16386" + } + ], + "local-index": [ + { + "data": "365" + } + ], + "snmp-index": [ + { + "data": "588" + } + ], + "if-config-flags": [ + { + "iff-device-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/8" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "174" + } + ], + "snmp-index": [ + { + "data": "534" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-media-type": [ + { + "data": "Fiber" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:74" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:74" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:43 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285683" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/8.16386" + } + ], + "local-index": [ + { + "data": "366" + } + ], + "snmp-index": [ + { + "data": "589" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "1631844" + } + ], + "output-packets": [ + { + "data": "1631762" + } + ] + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "ge-1/1/9" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "175" + } + ], + "snmp-index": [ + { + "data": "535" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mru": [ + { + "data": "1522" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "eth-switch-error": [ + { + "data": "none" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-auto-negotiation": [ + { + "data": "enabled" + } + ], + "if-remote-fault": [ + { + "data": "online" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-media-type": [ + { + "data": "Fiber" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:75" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:75" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:43 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285683" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "ethernet-fec-mode": [ + { + "attributes": { + "junos:style": "verbose" + }, + "enabled_fec_mode": [ + {} + ] + } + ], + "ethernet-fec-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "fec_ccw_count": [ + { + "data": "0" + } + ], + "fec_nccw_count": [ + { + "data": "0" + } + ], + "fec_ccw_error_rate": [ + { + "data": "0" + } + ], + "fec_nccw_error_rate": [ + { + "data": "0" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ge-1/1/9.16386" + } + ], + "local-index": [ + { + "data": "367" + } + ], + "snmp-index": [ + { + "data": "590" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "1631925" + } + ], + "output-packets": [ + { + "data": "1631842" + } + ] + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "xe-1/2/0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "176" + } + ], + "snmp-index": [ + { + "data": "570" + } + ], + "description": [ + { + "data": "a description" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mtu": [ + { + "data": "1602" + } + ], + "mru": [ + { + "data": "1610" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "none" + } + ], + "if-flow-control": [ + { + "data": "disabled" + } + ], + "if-speed-cfg": [ + { + "data": "Auto" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c2" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:78" + } + ], + "interface-flapped": [ + { + "data": "2024-05-25 05:26:26 UTC (5d 12:23 ago)", + "attributes": { + "junos:seconds": "476620" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "302063576" + } + ], + "input-pps": [ + { + "data": "41582" + } + ], + "output-bps": [ + { + "data": "94851768" + } + ], + "output-pps": [ + { + "data": "22367" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "4" + } + ] + } + ], + "link-degrade-information": [ + { + "lnk-degrd-mon": [ + { + "data": "Disable" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-1/2/0.0" + } + ], + "local-index": [ + { + "data": "368" + } + ], + "snmp-index": [ + { + "data": "576" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "519367958190" + } + ], + "output-packets": [ + { + "data": "444407262191" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "aenet" + } + ], + "ae-bundle-name": [ + { + "data": "ae11.0" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "xe-1/3/0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "177" + } + ], + "snmp-index": [ + { + "data": "571" + } + ], + "link-level-type": [ + { + "data": "Ethernet-CCC" + } + ], + "sonet-mode": [ + { + "data": "LAN-PHY" + } + ], + "mtu": [ + { + "data": "1522" + } + ], + "mru": [ + { + "data": "1530" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "ld-pdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "none" + } + ], + "if-flow-control": [ + { + "data": "enabled" + } + ], + "if-speed-cfg": [ + { + "data": "Auto" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "physical-interface-cos-information": [ + { + "physical-interface-cos-hw-max-queues": [ + { + "data": "8" + } + ], + "physical-interface-cos-use-max-queues": [ + { + "data": "8" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:84" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:84" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:43 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285683" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "228080" + } + ], + "input-pps": [ + { + "data": "129" + } + ], + "output-bps": [ + { + "data": "359744" + } + ], + "output-pps": [ + { + "data": "134" + } + ] + } + ], + "active-alarms": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "active-defects": [ + { + "interface-alarms": [ + { + "alarm-not-present": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ], + "ethernet-pcs-statistics": [ + { + "attributes": { + "junos:style": "verbose" + }, + "bit-error-seconds": [ + { + "data": "0" + } + ], + "errored-blocks-seconds": [ + { + "data": "0" + } + ] + } + ], + "link-degrade-information": [ + { + "lnk-degrd-mon": [ + { + "data": "Disable" + } + ] + } + ], + "interface-transmit-statistics": [ + { + "data": "Disabled" + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "xe-1/3/0.0" + } + ], + "local-index": [ + { + "data": "369" + } + ], + "snmp-index": [ + { + "data": "582" + } + ], + "description": [ + { + "data": "UNI : DEFPE1-ACME9525PE1 : ACME9525RL1-VSS Ten1/2/7" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "Ethernet-CCC" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "12319781793" + } + ], + "output-packets": [ + { + "data": "9935446027" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "ccc" + } + ], + "mtu": [ + { + "data": "1522" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x402" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ae0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "129" + } + ], + "snmp-index": [ + { + "data": "538" + } + ], + "description": [ + { + "data": "a description" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1602" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "disabled" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "minimum-links-in-aggregate": [ + { + "data": "1" + } + ], + "minimum-bandwidth-in-aggregate": [ + { + "data": "1bps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c0" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:c0" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:33 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285693" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "51904024" + } + ], + "input-pps": [ + { + "data": "13081" + } + ], + "output-bps": [ + { + "data": "54142880" + } + ], + "output-pps": [ + { + "data": "9588" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ae0.0" + } + ], + "local-index": [ + { + "data": "345" + } + ], + "snmp-index": [ + { + "data": "559" + } + ], + "description": [ + { + "data": "a description" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "lag-traffic-statistics": [ + { + "lag-bundle": [ + { + "input-packets": [ + { + "data": "422721190005" + } + ], + "input-pps": [ + { + "data": "13081" + } + ], + "input-bytes": [ + { + "data": "409595610055470" + } + ], + "input-bps": [ + { + "data": "51904024" + } + ], + "output-packets": [ + { + "data": "316137621010" + } + ], + "output-pps": [ + { + "data": "9587" + } + ], + "output-bytes": [ + { + "data": "171636424156222" + } + ], + "output-bps": [ + { + "data": "54141760" + } + ] + } + ], + "lag-adaptive-statistics": [ + { + "adaptive-adjusts": [ + { + "data": "0" + } + ], + "adaptive-scans": [ + { + "data": "0" + } + ], + "adaptive-updates": [ + { + "data": "0" + } + ] + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1588" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.230.30/31" + } + ], + "ifa-local": [ + { + "data": "13.65.230.30" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "1585" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "mpls" + } + ], + "mtu": [ + { + "data": "1576" + } + ], + "maximum-labels": [ + { + "data": "3" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ae3" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "130" + } + ], + "snmp-index": [ + { + "data": "541" + } + ], + "description": [ + { + "data": "UMI" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "Unspecified" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "disabled" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "minimum-links-in-aggregate": [ + { + "data": "1" + } + ], + "minimum-bandwidth-in-aggregate": [ + { + "data": "1bps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c1" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:c1" + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:28:20 UTC (74w6d 03:21 ago)", + "attributes": { + "junos:seconds": "45285706" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "0" + } + ], + "input-pps": [ + { + "data": "0" + } + ], + "output-bps": [ + { + "data": "0" + } + ], + "output-pps": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "ae11" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "131" + } + ], + "snmp-index": [ + { + "data": "549" + } + ], + "description": [ + { + "data": "a description" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1602" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "disabled" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "minimum-links-in-aggregate": [ + { + "data": "1" + } + ], + "minimum-bandwidth-in-aggregate": [ + { + "data": "1bps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c2" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:c2" + } + ], + "interface-flapped": [ + { + "data": "2024-05-25 05:26:30 UTC (5d 12:23 ago)", + "attributes": { + "junos:seconds": "476616" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "302063576" + } + ], + "input-pps": [ + { + "data": "41582" + } + ], + "output-bps": [ + { + "data": "94875288" + } + ], + "output-pps": [ + { + "data": "22367" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ae11.0" + } + ], + "local-index": [ + { + "data": "346" + } + ], + "snmp-index": [ + { + "data": "575" + } + ], + "description": [ + { + "data": "a description" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "lag-traffic-statistics": [ + { + "lag-bundle": [ + { + "input-packets": [ + { + "data": "696258617483" + } + ], + "input-pps": [ + { + "data": "41582" + } + ], + "input-bytes": [ + { + "data": "493816197619868" + } + ], + "input-bps": [ + { + "data": "302063576" + } + ], + "output-packets": [ + { + "data": "560054827039" + } + ], + "output-pps": [ + { + "data": "21877" + } + ], + "output-bytes": [ + { + "data": "492432915273815" + } + ], + "output-bps": [ + { + "data": "93864728" + } + ] + } + ], + "lag-adaptive-statistics": [ + { + "adaptive-adjusts": [ + { + "data": "0" + } + ], + "adaptive-scans": [ + { + "data": "0" + } + ], + "adaptive-updates": [ + { + "data": "0" + } + ] + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1588" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.231.108/31" + } + ], + "ifa-local": [ + { + "data": "13.65.231.109" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "1585" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "mpls" + } + ], + "mtu": [ + { + "data": "1576" + } + ], + "maximum-labels": [ + { + "data": "3" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "ae14" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "132" + } + ], + "snmp-index": [ + { + "data": "552" + } + ], + "description": [ + { + "data": "a description" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1602" + } + ], + "source-filtering": [ + { + "data": "disabled" + } + ], + "speed": [ + { + "data": "10Gbps" + } + ], + "bpdu-error": [ + { + "data": "none" + } + ], + "l2pt-error": [ + { + "data": "none" + } + ], + "loopback": [ + { + "data": "disabled" + } + ], + "if-flow-control": [ + { + "data": "disabled" + } + ], + "pad-to-minimum-frame-size": [ + { + "data": "Disabled" + } + ], + "minimum-links-in-aggregate": [ + { + "data": "1" + } + ], + "minimum-bandwidth-in-aggregate": [ + { + "data": "1bps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c3" + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:c3" + } + ], + "interface-flapped": [ + { + "data": "2023-10-05 07:17:56 UTC (34w0d 10:32 ago)", + "attributes": { + "junos:seconds": "20601130" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-bps": [ + { + "data": "42775728" + } + ], + "input-pps": [ + { + "data": "8911" + } + ], + "output-bps": [ + { + "data": "55423200" + } + ], + "output-pps": [ + { + "data": "9375" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "ae14.0" + } + ], + "local-index": [ + { + "data": "347" + } + ], + "snmp-index": [ + { + "data": "572" + } + ], + "description": [ + { + "data": "a description" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "lag-traffic-statistics": [ + { + "lag-bundle": [ + { + "input-packets": [ + { + "data": "148542354516" + } + ], + "input-pps": [ + { + "data": "8910" + } + ], + "input-bytes": [ + { + "data": "93250239099946" + } + ], + "input-bps": [ + { + "data": "42775232" + } + ], + "output-packets": [ + { + "data": "241635372179" + } + ], + "output-pps": [ + { + "data": "9374" + } + ], + "output-bytes": [ + { + "data": "205817095420187" + } + ], + "output-bps": [ + { + "data": "55422336" + } + ] + } + ], + "lag-adaptive-statistics": [ + { + "adaptive-adjusts": [ + { + "data": "0" + } + ], + "adaptive-scans": [ + { + "data": "0" + } + ], + "adaptive-updates": [ + { + "data": "0" + } + ] + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1588" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-sample-input": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "13.65.231.118/31" + } + ], + "ifa-local": [ + { + "data": "13.65.231.118" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "1585" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "mpls" + } + ], + "mtu": [ + { + "data": "1576" + } + ], + "maximum-labels": [ + { + "data": "3" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "multiservice" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "cbp0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "134" + } + ], + "snmp-index": [ + { + "data": "502" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "9192" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "current-physical-address": [ + { + "data": "2a:8a:1c:56:72:11", + "attributes": { + "junos:format": "MAC 2a:8a:1c:56:72:11" + } + } + ], + "hardware-physical-address": [ + { + "data": "2a:8a:1c:56:72:11", + "attributes": { + "junos:format": "MAC 2a:8a:1c:56:72:11" + } + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "demux0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "133" + } + ], + "snmp-index": [ + { + "data": "501" + } + ], + "if-type": [ + { + "data": "Software-Pseudo" + } + ], + "mtu": [ + { + "data": "9192" + } + ], + "clocking": [ + { + "data": "1" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "dsc" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "5" + } + ], + "snmp-index": [ + { + "data": "5" + } + ], + "if-type": [ + { + "data": "Software-Pseudo" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "em0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "2" + } + ], + "snmp-index": [ + { + "data": "17" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "02:00:00:00:00:04", + "attributes": { + "junos:format": "MAC 02:00:00:00:00:04" + } + } + ], + "hardware-physical-address": [ + { + "data": "02:00:00:00:00:04", + "attributes": { + "junos:format": "MAC 02:00:00:00:00:04" + } + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:26:58 UTC (74w6d 03:23 ago)", + "attributes": { + "junos:seconds": "45285788" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "1990791873" + } + ], + "output-packets": [ + { + "data": "2011337448" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "em0.0" + } + ], + "local-index": [ + { + "data": "3" + } + ], + "snmp-index": [ + { + "data": "18" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "1990791873" + } + ], + "output-packets": [ + { + "data": "2011337448" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "10/8" + } + ], + "ifa-local": [ + { + "data": "10.0.0.4" + } + ], + "ifa-broadcast": [ + { + "data": "10.255.255.255" + } + ] + }, + { + "ifa-flags": [ + { + "ifaf-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-kernel": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "128/2" + } + ], + "ifa-local": [ + { + "data": "133.4.74.1" + } + ], + "ifa-broadcast": [ + { + "data": "186.53.226.255" + } + ] + }, + { + "ifa-flags": [ + { + "ifaf-primary": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "128/2" + } + ], + "ifa-local": [ + { + "data": "133.4.74.4" + } + ], + "ifa-broadcast": [ + { + "data": "186.53.226.255" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "1" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "ifa-destination": [ + { + "data": "af06:e3b6:61bb:2fc8:9927:61f9:4308:8300/64" + } + ], + "ifa-local": [ + { + "data": "af06:e3b6:61bb:2fc8:9b44:3a70:4d3a:8304" + } + ], + "interface-address": [ + { + "in6-addr-flags": [ + { + "ifaf-none": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "af47:43cc:8ad3:722:24f5:96f1:497f:5400/64" + } + ], + "ifa-local": [ + { + "data": "af47:43cc:8ad3:722:24ff:168e:79be:a504" + } + ], + "interface-address": [ + { + "in6-addr-flags": [ + { + "ifaf-none": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "tnp" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "address-family-flags": [ + { + "ifff-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-address": [ + { + "attributes": { + "heading": "Addresses" + }, + "ifa-local": [ + { + "data": "0x4" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "em1" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "down" + } + ], + "local-index": [ + { + "data": "65" + } + ], + "snmp-index": [ + { + "data": "23" + } + ], + "description": [ + { + "data": "UMI" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-no-carrier": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-hardware-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "02:00:02:00:00:04", + "attributes": { + "junos:format": "MAC 02:00:02:00:00:04" + } + } + ], + "hardware-physical-address": [ + { + "data": "02:00:02:00:00:04", + "attributes": { + "junos:format": "MAC 02:00:02:00:00:04" + } + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:26:12 UTC (74w6d 03:23 ago)", + "attributes": { + "junos:seconds": "45285834" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "em1.0" + } + ], + "local-index": [ + { + "data": "4" + } + ], + "snmp-index": [ + { + "data": "24" + } + ], + "if-config-flags": [ + { + "iff-device-down": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-down": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "10/8" + } + ], + "ifa-local": [ + { + "data": "10.0.0.1" + } + ], + "ifa-broadcast": [ + { + "data": "10.255.255.255" + } + ] + }, + { + "ifa-flags": [ + { + "ifaf-primary": [ + { + "data": [ + null + ] + } + ], + "ifaf-down": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "128/2" + } + ], + "ifa-local": [ + { + "data": "133.4.74.1" + } + ], + "ifa-broadcast": [ + { + "data": "186.53.226.255" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "tnp" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "address-family-flags": [ + { + "ifff-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-address": [ + { + "attributes": { + "heading": "Addresses" + }, + "ifa-local": [ + { + "data": "0x4" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "esi" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "139" + } + ], + "snmp-index": [ + { + "data": "580" + } + ], + "if-type": [ + { + "data": "Software-Pseudo" + } + ], + "link-level-type": [ + { + "data": "VxLAN-Tunnel-Endpoint" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "141" + } + ], + "snmp-index": [ + { + "data": "556" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti1" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "142" + } + ], + "snmp-index": [ + { + "data": "557" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti2" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "143" + } + ], + "snmp-index": [ + { + "data": "561" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti3" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "144" + } + ], + "snmp-index": [ + { + "data": "562" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti4" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "145" + } + ], + "snmp-index": [ + { + "data": "574" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti5" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "146" + } + ], + "snmp-index": [ + { + "data": "584" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti6" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "147" + } + ], + "snmp-index": [ + { + "data": "585" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fti7" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "148" + } + ], + "snmp-index": [ + { + "data": "586" + } + ], + "if-type": [ + { + "data": "FTI" + } + ], + "link-level-type": [ + { + "data": "Flexible-tunnel-Interface" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "fxp0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "64" + } + ], + "snmp-index": [ + { + "data": "1" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:ff", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:ff" + } + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:ff", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:ff" + } + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:26:12 UTC (74w6d 03:23 ago)", + "attributes": { + "junos:seconds": "45285834" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "23683758" + } + ], + "output-packets": [ + { + "data": "1631858" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "fxp0.0" + } + ], + "local-index": [ + { + "data": "5" + } + ], + "snmp-index": [ + { + "data": "13" + } + ], + "description": [ + { + "data": "MGMT : OOB : ACME9525-MS1 Gig 0/4" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "23683758" + } + ], + "output-packets": [ + { + "data": "1631858" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1500" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ], + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "gre" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "10" + } + ], + "snmp-index": [ + { + "data": "8" + } + ], + "if-type": [ + { + "data": "GRE" + } + ], + "link-level-type": [ + { + "data": "GRE" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "ipip" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "11" + } + ], + "snmp-index": [ + { + "data": "9" + } + ], + "if-type": [ + { + "data": "IPIP" + } + ], + "link-level-type": [ + { + "data": "IP-over-IP" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "irb" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "137" + } + ], + "snmp-index": [ + { + "data": "505" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:f0", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:f0" + } + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:f0", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:f0" + } + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "jsrv" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "128" + } + ], + "snmp-index": [ + { + "data": "560" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + {} + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:c0", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:c0" + } + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:c0", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:c0" + } + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "jsrv.1" + } + ], + "local-index": [ + { + "data": "324" + } + ], + "snmp-index": [ + { + "data": "563" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "unknown" + } + ], + "policer-overhead": [ + {} + ], + "logical-interface-bandwidth": [ + { + "data": "1Gbps" + } + ], + "irb-domain": [ + { + "irb-routing-instance": [ + { + "data": "None" + } + ], + "irb-bridge": [ + { + "data": "None" + } + ] + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "max-local-cache": [ + { + "data": "75000" + } + ], + "new-hold-limit": [ + { + "data": "75000" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-primary": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-preferred": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-destination": [ + { + "data": "128/2" + } + ], + "ifa-local": [ + { + "data": "133.4.74.127" + } + ], + "ifa-broadcast": [ + { + "data": "186.53.226.255" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lo0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "6" + } + ], + "snmp-index": [ + { + "data": "6" + } + ], + "if-type": [ + { + "data": "Loopback" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ], + "ifdf-loopback": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "32089668" + } + ], + "output-packets": [ + { + "data": "32089668" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "lo0.0" + } + ], + "local-index": [ + { + "data": "322" + } + ], + "snmp-index": [ + { + "data": "16" + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "Unspecified" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "848" + } + ], + "output-packets": [ + { + "data": "848" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-sendbcast-pkt-to-re": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-local": [ + { + "data": "198.51.100.1" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "ifaf-current-default": [ + { + "data": [ + null + ] + } + ], + "ifaf-current-primary": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifa-local": [ + { + "data": "49.013.0065.0224.0113" + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "ifa-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "ifa-local": [ + { + "data": "af06:e3b6:61bb:2fc8:ad6c:c0a1:8292:d9ff" + } + ], + "interface-address": [ + { + "in6-addr-flags": [ + { + "ifaf-none": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lo0.16384" + } + ], + "local-index": [ + { + "data": "321" + } + ], + "snmp-index": [ + { + "data": "21" + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "Unspecified" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ], + "interface-address": [ + { + "attributes": { + "heading": "Addresses" + }, + "ifa-local": [ + { + "data": "66.33.236.1" + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lo0.16385" + } + ], + "local-index": [ + { + "data": "320" + } + ], + "snmp-index": [ + { + "data": "22" + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "Unspecified" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "32088820" + } + ], + "output-packets": [ + { + "data": "32088820" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "internal-flags": [ + { + "data": "0x2" + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "4" + } + ], + "snmp-index": [ + { + "data": "4" + } + ], + "if-type": [ + { + "data": "Software-Pseudo" + } + ], + "link-level-type": [ + { + "data": "LSI" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + {} + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "324364" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "lsi.0" + } + ], + "local-index": [ + { + "data": "337" + } + ], + "snmp-index": [ + { + "data": "512" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.1" + } + ], + "local-index": [ + { + "data": "338" + } + ], + "snmp-index": [ + { + "data": "566" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "649098" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.2" + } + ], + "local-index": [ + { + "data": "339" + } + ], + "snmp-index": [ + { + "data": "569" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.3" + } + ], + "local-index": [ + { + "data": "340" + } + ], + "snmp-index": [ + { + "data": "540" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "230" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.4" + } + ], + "local-index": [ + { + "data": "341" + } + ], + "snmp-index": [ + { + "data": "542" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.5" + } + ], + "local-index": [ + { + "data": "342" + } + ], + "snmp-index": [ + { + "data": "543" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "235" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.6" + } + ], + "local-index": [ + { + "data": "343" + } + ], + "snmp-index": [ + { + "data": "544" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "lsi.7" + } + ], + "local-index": [ + { + "data": "344" + } + ], + "snmp-index": [ + { + "data": "545" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "encapsulation": [ + { + "data": "LSI-NULL" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "714" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ], + "filter-information": [ + {} + ], + "address-family": [ + { + "address-family-name": [ + { + "data": "inet" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "iso" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "address-family-name": [ + { + "data": "inet6" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "max-local-cache": [ + { + "data": "0" + } + ], + "new-hold-limit": [ + { + "data": "0" + } + ], + "intf-curr-cnt": [ + { + "data": "0" + } + ], + "intf-unresolved-cnt": [ + { + "data": "0" + } + ], + "intf-dropcnt": [ + { + "data": "0" + } + ], + "address-family-flags": [ + { + "ifff-is-primary": [ + { + "data": [ + null + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "me0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "1" + } + ], + "snmp-index": [ + { + "data": "33" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "1514" + } + ], + "speed": [ + { + "data": "1000mbps" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "current-physical-address": [ + { + "data": "02:00:00:00:00:0b", + "attributes": { + "junos:format": "MAC 02:00:00:00:00:0b" + } + } + ], + "hardware-physical-address": [ + { + "data": "02:00:00:00:00:0b", + "attributes": { + "junos:format": "MAC 02:00:00:00:00:0b" + } + } + ], + "interface-flapped": [ + { + "data": "2022-12-23 14:26:12 UTC (74w6d 03:23 ago)", + "attributes": { + "junos:seconds": "45285834" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "1631918" + } + ] + } + ], + "logical-interface": [ + { + "name": [ + { + "data": "me0.0" + } + ], + "local-index": [ + { + "data": "6" + } + ], + "snmp-index": [ + { + "data": "34" + } + ], + "if-config-flags": [ + { + "iff-up": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ], + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "encapsulation": [ + { + "data": "ENET2" + } + ], + "policer-overhead": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "1631918" + } + ] + } + ], + "filter-information": [ + {} + ] + } + ] + }, + { + "name": [ + { + "data": "mtun" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "66" + } + ], + "snmp-index": [ + { + "data": "12" + } + ], + "if-type": [ + { + "data": "Multicast-GRE" + } + ], + "link-level-type": [ + { + "data": "GRE" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "pimd" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "26" + } + ], + "snmp-index": [ + { + "data": "11" + } + ], + "if-type": [ + { + "data": "PIMD" + } + ], + "link-level-type": [ + { + "data": "PIM-Decapsulator" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "pime" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "25" + } + ], + "snmp-index": [ + { + "data": "10" + } + ], + "if-type": [ + { + "data": "PIME" + } + ], + "link-level-type": [ + { + "data": "PIM-Encapsulator" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + {} + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "pip0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "135" + } + ], + "snmp-index": [ + { + "data": "503" + } + ], + "if-type": [ + { + "data": "Ethernet" + } + ], + "link-level-type": [ + { + "data": "Ethernet" + } + ], + "mtu": [ + { + "data": "9192" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "current-physical-address": [ + { + "data": "28:8a:1c:56:72:b0", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:b0" + } + } + ], + "hardware-physical-address": [ + { + "data": "28:8a:1c:56:72:b0", + "attributes": { + "junos:format": "MAC 28:8a:1c:56:72:b0" + } + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "pp0" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "136" + } + ], + "snmp-index": [ + { + "data": "504" + } + ], + "if-type": [ + { + "data": "PPPoE" + } + ], + "link-level-type": [ + { + "data": "PPPoE" + } + ], + "mtu": [ + { + "data": "1532" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-point-to-point": [ + { + "data": [ + null + ] + } + ], + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ] + }, + { + "name": [ + { + "data": "rbeb" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "140" + } + ], + "snmp-index": [ + { + "data": "555" + } + ], + "if-type": [ + { + "data": "Software-Pseudo" + } + ], + "link-level-type": [ + { + "data": "Remote-BEB" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "tap" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "12" + } + ], + "snmp-index": [ + { + "data": "7" + } + ], + "if-type": [ + { + "data": "Software-Pseudo" + } + ], + "link-level-type": [ + { + "data": "Interface-Specific" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + }, + { + "name": [ + { + "data": "vtep" + } + ], + "admin-status": [ + { + "data": "up", + "attributes": { + "junos:format": "Enabled" + } + } + ], + "oper-status": [ + { + "data": "up" + } + ], + "local-index": [ + { + "data": "138" + } + ], + "snmp-index": [ + { + "data": "577" + } + ], + "if-type": [ + { + "data": "Software-Pseudo" + } + ], + "link-level-type": [ + { + "data": "VxLAN-Tunnel-Endpoint" + } + ], + "mtu": [ + { + "data": "Unlimited" + } + ], + "speed": [ + { + "data": "Unlimited" + } + ], + "if-device-flags": [ + { + "ifdf-present": [ + { + "data": [ + null + ] + } + ], + "ifdf-running": [ + { + "data": [ + null + ] + } + ] + } + ], + "ifd-specific-config-flags": [ + { + "internal-flags": [ + { + "data": "0x0" + } + ] + } + ], + "if-config-flags": [ + { + "iff-snmp-traps": [ + { + "data": [ + null + ] + } + ] + } + ], + "link-type": [ + { + "data": "Full-Duplex" + } + ], + "if-media-flags": [ + { + "ifmf-none": [ + { + "data": [ + null + ] + } + ] + } + ], + "interface-flapped": [ + { + "data": "Never", + "attributes": { + "junos:seconds": "0" + } + } + ], + "traffic-statistics": [ + { + "attributes": { + "junos:style": "brief" + }, + "input-packets": [ + { + "data": "0" + } + ], + "output-packets": [ + { + "data": "0" + } + ] + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_devices/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_devices/expected_result_1.json new file mode 100755 index 00000000..ba9facb3 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_devices/expected_result_1.json @@ -0,0 +1,7 @@ +{ + "device_type": "MX10-T", + "hostname": "JUNOS-PE1", + "mask_length": 32, + "mgmt_interface": "lo0.0", + "serial": "T9958" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_all/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_all/expected_result_1.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_all/expected_result_1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json new file mode 100755 index 00000000..53cec81a --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json @@ -0,0 +1,1120 @@ +{ + "interfaces": { + "ae0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c0", + "mtu": 1602, + "type": "lag" + }, + "ae0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.230.30", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag" + }, + "ae11": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c2", + "mtu": 1602, + "type": "lag" + }, + "ae11.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.231.109", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag" + }, + "ae14": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c3", + "mtu": 1602, + "type": "lag" + }, + "ae14.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.231.118", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag" + }, + "ae3": { + "802.1Q_mode": "", + "description": "UMI", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c1", + "mtu": 1514, + "type": "lag" + }, + "cbp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "2a:8a:1c:56:72:11", + "mtu": 9192, + "type": "other" + }, + "demux0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "dsc": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "em0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:00:00:00:04", + "mtu": 1514, + "type": "other" + }, + "em0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.0.0.4", + "prefix_length": "8" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "em1": { + "802.1Q_mode": "", + "description": "UMI", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:02:00:00:04", + "mtu": 1514, + "type": "other" + }, + "em1.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.0.0.1", + "prefix_length": "8" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "esi": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fxp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:ff", + "mtu": 1514, + "type": "other" + }, + "fxp0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/0/0": { + "802.1Q_mode": "", + "description": "UNI : : ACME9525-MS1 : Gi0/2", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:60", + "mtu": 1522, + "type": "other" + }, + "ge-1/0/0.2950": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.209.193", + "prefix_length": "28" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "ge-1/0/0.2953": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.145.73", + "prefix_length": "29" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "ge-1/0/0.32767": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "ge-1/0/1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:61", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:62", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:63", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:64", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:65", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:66", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:67", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:68", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:69", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6c", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6d", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6e", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6f", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:70", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:71", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:72", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/6.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/1/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:73", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/7.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/1/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:74", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/8.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/1/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:75", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/9.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "gre": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "ipip": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "irb": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:f0", + "mtu": 1514, + "type": "other" + }, + "jsrv": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c0", + "mtu": 1514, + "type": "other" + }, + "jsrv.1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "133.4.74.127", + "prefix_length": "2" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "lc-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "lc-0/0/0.32769": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "lo0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lo0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": 32 + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lo0.16384": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "66.33.236.1", + "prefix_length": 32 + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lo0.16385": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "me0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:00:00:00:0b", + "mtu": 1514, + "type": "other" + }, + "me0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "mtun": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "pfe-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfe-0/0/0.16383": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfh-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfh-0/0/0.16383": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfh-0/0/0.16384": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pimd": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "pime": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "pip0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:b0", + "mtu": 9192, + "type": "other" + }, + "pp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1532, + "type": "other" + }, + "rbeb": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "tap": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "vtep": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "xe-0/0/0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae0", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:00", + "mtu": 1602, + "type": "other" + }, + "xe-0/0/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other" + }, + "xe-0/0/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae14", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:01", + "mtu": 1602, + "type": "other" + }, + "xe-0/0/1.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other" + }, + "xe-0/0/2": { + "802.1Q_mode": "", + "description": "UNI : : ACME9525RL1- : Te1/2/8", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:02", + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3100": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.98.49", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3101": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.245", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3102": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.104.1", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3103": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.241", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3104": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.249", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.32767": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:03", + "mtu": 1522, + "type": "other" + }, + "xe-0/0/3.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-1/2/0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae11", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:78", + "mtu": 1602, + "type": "other" + }, + "xe-1/2/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other" + }, + "xe-1/3/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:84", + "mtu": 1522, + "type": "other" + }, + "xe-1/3/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + } + }, + "serial": "T9958" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json new file mode 100755 index 00000000..31e739d0 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json @@ -0,0 +1,1120 @@ +{ + "interfaces": { + "ae0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c0", + "mtu": 1602, + "type": "lag" + }, + "ae0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.230.30", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag" + }, + "ae11": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c2", + "mtu": 1602, + "type": "lag" + }, + "ae11.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.231.109", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag" + }, + "ae14": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c3", + "mtu": 1602, + "type": "lag" + }, + "ae14.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.231.118", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag" + }, + "ae3": { + "802.1Q_mode": "", + "description": "UMI", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c1", + "mtu": 1514, + "type": "lag" + }, + "cbp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "2a:8a:1c:56:72:11", + "mtu": 9192, + "type": "other" + }, + "demux0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "dsc": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "em0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:00:00:00:04", + "mtu": 1514, + "type": "other" + }, + "em0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.0.0.4", + "prefix_length": "8" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "em1": { + "802.1Q_mode": "", + "description": "UMI", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:02:00:00:04", + "mtu": 1514, + "type": "other" + }, + "em1.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.0.0.1", + "prefix_length": "8" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "esi": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fti7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "fxp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:ff", + "mtu": 1514, + "type": "other" + }, + "fxp0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/0/0": { + "802.1Q_mode": "", + "description": "UNI : : ACME9525-MS1 : Gi0/2", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:60", + "mtu": 1522, + "type": "other" + }, + "ge-1/0/0.2950": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.209.193", + "prefix_length": "28" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "ge-1/0/0.2953": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.145.73", + "prefix_length": "29" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "ge-1/0/0.32767": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "ge-1/0/1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:61", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:62", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:63", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:64", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:65", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:66", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:67", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:68", + "mtu": 1514, + "type": "other" + }, + "ge-1/0/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:69", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6c", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6d", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6e", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6f", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:70", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:71", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:72", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/6.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/1/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:73", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/7.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/1/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:74", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/8.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "ge-1/1/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:75", + "mtu": 1514, + "type": "other" + }, + "ge-1/1/9.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "gre": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "ipip": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "irb": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:f0", + "mtu": 1514, + "type": "other" + }, + "jsrv": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c0", + "mtu": 1514, + "type": "other" + }, + "jsrv.1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "133.4.74.127", + "prefix_length": "2" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "lc-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "lc-0/0/0.32769": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "lo0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lo0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": 32 + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lo0.16384": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "66.33.236.1", + "prefix_length": 32 + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lo0.16385": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "lsi.7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "me0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:00:00:00:0b", + "mtu": 1514, + "type": "other" + }, + "me0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other" + }, + "mtun": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "pfe-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfe-0/0/0.16383": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfh-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfh-0/0/0.16383": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pfh-0/0/0.16384": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other" + }, + "pimd": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "pime": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "pip0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:b0", + "mtu": 9192, + "type": "other" + }, + "pp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1532, + "type": "other" + }, + "rbeb": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "tap": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "vtep": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other" + }, + "xe-0/0/0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae0", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:00", + "mtu": 1602, + "type": "other" + }, + "xe-0/0/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other" + }, + "xe-0/0/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae14", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:01", + "mtu": 1602, + "type": "other" + }, + "xe-0/0/1.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other" + }, + "xe-0/0/2": { + "802.1Q_mode": "", + "description": "UNI : : ACME9525RL1- : Te1/2/8", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:02", + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3100": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.98.49", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3101": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.245", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3102": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.104.1", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3103": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.241", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.3104": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.249", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/2.32767": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-0/0/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:03", + "mtu": 1522, + "type": "other" + }, + "xe-0/0/3.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + }, + "xe-1/2/0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae11", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:78", + "mtu": 1602, + "type": "other" + }, + "xe-1/2/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other" + }, + "xe-1/3/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:84", + "mtu": 1522, + "type": "other" + }, + "xe-1/3/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other" + } + }, + "serial": "T9958" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json new file mode 100755 index 00000000..f3bc0ec4 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json @@ -0,0 +1,1224 @@ +{ + "interfaces": { + "ae0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c0", + "mtu": 1602, + "type": "lag", + "vrf": {} + }, + "ae0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.230.30", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag", + "vrf": {} + }, + "ae11": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c2", + "mtu": 1602, + "type": "lag", + "vrf": {} + }, + "ae11.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.231.109", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag", + "vrf": {} + }, + "ae14": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c3", + "mtu": 1602, + "type": "lag", + "vrf": {} + }, + "ae14.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.231.118", + "prefix_length": "31" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "lag", + "vrf": {} + }, + "ae3": { + "802.1Q_mode": "", + "description": "UMI", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c1", + "mtu": 1514, + "type": "lag", + "vrf": {} + }, + "cbp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "2a:8a:1c:56:72:11", + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "demux0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "dsc": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "em0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:00:00:00:04", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "em0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.0.0.4", + "prefix_length": "8" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "em1": { + "802.1Q_mode": "", + "description": "UMI", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:02:00:00:04", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "em1.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.0.0.1", + "prefix_length": "8" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "esi": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fti7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "fxp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:ff", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "fxp0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/0": { + "802.1Q_mode": "", + "description": "UNI : : ACME9525-MS1 : Gi0/2", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:60", + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "ge-1/0/0.2950": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.209.193", + "prefix_length": "28" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "ge-1/0/0.2953": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.145.73", + "prefix_length": "29" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "ge-1/0/0.32767": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "ge-1/0/1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:61", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:62", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:63", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:64", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:65", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:66", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:67", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:68", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/0/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:69", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6c", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6d", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6e", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:6f", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:70", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "False", + "mac_address": "28:8a:1c:56:72:71", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:72", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/6.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:73", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/7.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/8": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:74", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/8.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/9": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:75", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "ge-1/1/9.16386": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "gre": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "ipip": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "irb": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:f0", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "jsrv": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:c0", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "jsrv.1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "133.4.74.127", + "prefix_length": "2" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "lc-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other", + "vrf": {} + }, + "lc-0/0/0.32769": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other", + "vrf": {} + }, + "lo0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lo0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": 32 + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lo0.16384": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "66.33.236.1", + "prefix_length": 32 + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lo0.16385": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.2": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.4": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.5": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.6": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "lsi.7": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "me0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "02:00:00:00:00:0b", + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "me0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1514, + "type": "other", + "vrf": {} + }, + "mtun": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "pfe-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other", + "vrf": {} + }, + "pfe-0/0/0.16383": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other", + "vrf": {} + }, + "pfh-0/0/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other", + "vrf": {} + }, + "pfh-0/0/0.16383": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other", + "vrf": {} + }, + "pfh-0/0/0.16384": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": [], + "type": "other", + "vrf": {} + }, + "pimd": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "pime": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "pip0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:b0", + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "pp0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1532, + "type": "other", + "vrf": {} + }, + "rbeb": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "tap": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "vtep": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 9192, + "type": "other", + "vrf": {} + }, + "xe-0/0/0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae0", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:00", + "mtu": 1602, + "type": "other", + "vrf": {} + }, + "xe-0/0/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other", + "vrf": {} + }, + "xe-0/0/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae14", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:01", + "mtu": 1602, + "type": "other", + "vrf": {} + }, + "xe-0/0/1.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other", + "vrf": {} + }, + "xe-0/0/2": { + "802.1Q_mode": "", + "description": "UNI : : ACME9525RL1- : Te1/2/8", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:02", + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/2.3100": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.98.49", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/2.3101": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.245", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/2.3102": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.104.1", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/2.3103": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.241", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/2.3104": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "13.65.106.249", + "prefix_length": "30" + } + ], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/2.32767": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/3": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:03", + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-0/0/3.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-1/2/0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "ae11", + "link_status": "True", + "mac_address": "28:8a:1c:56:72:78", + "mtu": 1602, + "type": "other", + "vrf": {} + }, + "xe-1/2/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1602, + "type": "other", + "vrf": {} + }, + "xe-1/3/0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": "28:8a:1c:56:72:84", + "mtu": 1522, + "type": "other", + "vrf": {} + }, + "xe-1/3/0.0": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [], + "lag": [], + "link_status": "True", + "mac_address": [], + "mtu": 1522, + "type": "other", + "vrf": {} + } + }, + "serial": "T9958" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/test_command_getter.py b/nautobot_device_onboarding/tests/test_command_getter.py new file mode 100755 index 00000000..9ac90c8c --- /dev/null +++ b/nautobot_device_onboarding/tests/test_command_getter.py @@ -0,0 +1,172 @@ +"""Test for nornir plays in command_getter.""" + +import os +import unittest + +import yaml + +from nautobot_device_onboarding.nornir_plays.command_getter import _get_commands_to_run + +MOCK_DIR = os.path.join("nautobot_device_onboarding", "tests", "mock") + + +class TestGetCommandsToRun(unittest.TestCase): + """Test the ability to get the proper commands to run.""" + + def setUp(self): + with open(f"{MOCK_DIR}/command_mappers/mock_cisco_ios.yml", "r", encoding="utf-8") as mock_file_data: + self.expected_data = yaml.safe_load(mock_file_data) + + def test_deduplicate_command_list_sync_devices(self): + """Test dedup on sync_devices ssot job.""" + get_commands_to_run = _get_commands_to_run( + self.expected_data["sync_devices"], sync_vlans=False, sync_vrfs=False + ) + expected_commands_to_run = [ + {"command": "show version", "jpath": "[*].hostname", "parser": "textfsm"}, + { + "command": "show interfaces", + "jpath": "[?ip_address=='{{ obj }}'].{name: interface, enabled: link_status}", + "parser": "textfsm", + "post_processor": "{{ (obj | selectattr('enabled', 'eq', 'up') | list | first ).name }}", + }, + ] + self.assertEqual(get_commands_to_run, expected_commands_to_run) + + def test_deduplicate_command_list_sync_data_no_vrfs_no_vlans(self): + """Test dedup on sync_network_data ssot job.""" + get_commands_to_run = _get_commands_to_run( + self.expected_data["sync_network_data"], sync_vlans=False, sync_vrfs=False + ) + expected_commands_to_run = [ + {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, + {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, + { + "command": "show interfaces", + "parser": "textfsm", + "jpath": "[*].interface", + "post_processor": "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}", + }, + { + "command": "show interfaces switchport", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}", + "post_processor": "{{ obj | interface_mode_logic }}", + "iterable_type": "str", + }, + { + "command": "show etherchannel summary", + "parser": "textfsm", + "jpath": "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name", + "post_processor": "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}", + "iterable_type": "str", + }, + ] + self.assertEqual(get_commands_to_run, expected_commands_to_run) + + def test_deduplicate_command_list_sync_data_with_vrfs_no_vlans(self): + """Test dedup on sync_network_data ssot job.""" + get_commands_to_run = _get_commands_to_run( + self.expected_data["sync_network_data"], sync_vlans=False, sync_vrfs=True + ) + expected_commands_to_run = [ + {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, + {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, + { + "command": "show interfaces", + "parser": "textfsm", + "jpath": "[*].interface", + "post_processor": "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}", + }, + { + "command": "show interfaces switchport", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}", + "post_processor": "{{ obj | interface_mode_logic }}", + "iterable_type": "str", + }, + { + "command": "show etherchannel summary", + "parser": "textfsm", + "jpath": "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name", + "post_processor": "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}", + "iterable_type": "str", + }, + { + "command": "show ip interface", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key }}'].{name:vrf}", + "post_processor": "{% if obj | length > 0 %}{{ obj[0] | key_exist_or_default('name') | tojson }}{% else %}{{ obj }}{% endif %}", + "iterable_type": "dict", + }, + ] + self.assertEqual(get_commands_to_run, expected_commands_to_run) + + def test_deduplicate_command_list_sync_data_no_vrfs_with_vlans(self): + """Test dedup on sync_network_data ssot job.""" + get_commands_to_run = _get_commands_to_run( + self.expected_data["sync_network_data"], sync_vlans=True, sync_vrfs=False + ) + expected_commands_to_run = [ + {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, + {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, + { + "command": "show interfaces", + "parser": "textfsm", + "jpath": "[*].interface", + "post_processor": "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}", + }, + { + "command": "show interfaces switchport", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}", + "post_processor": "{{ obj | interface_mode_logic }}", + "iterable_type": "str", + }, + { + "command": "show etherchannel summary", + "parser": "textfsm", + "jpath": "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name", + "post_processor": "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}", + "iterable_type": "str", + }, + ] + self.assertEqual(get_commands_to_run, expected_commands_to_run) + + def test_deduplicate_command_list_sync_data_with_vrfs_and_vlans(self): + """Test dedup on sync_network_data ssot job.""" + get_commands_to_run = _get_commands_to_run( + self.expected_data["sync_network_data"], sync_vlans=True, sync_vrfs=True + ) + expected_commands_to_run = [ + {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, + {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, + { + "command": "show interfaces", + "parser": "textfsm", + "jpath": "[*].interface", + "post_processor": "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}", + }, + { + "command": "show interfaces switchport", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}", + "post_processor": "{{ obj | interface_mode_logic }}", + "iterable_type": "str", + }, + { + "command": "show etherchannel summary", + "parser": "textfsm", + "jpath": "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name", + "post_processor": "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}", + "iterable_type": "str", + }, + { + "command": "show ip interface", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key }}'].{name:vrf}", + "post_processor": "{% if obj | length > 0 %}{{ obj[0] | key_exist_or_default('name') | tojson }}{% else %}{{ obj }}{% endif %}", + "iterable_type": "dict", + }, + ] + self.assertEqual(get_commands_to_run, expected_commands_to_run) diff --git a/nautobot_device_onboarding/tests/test_empty_inventory.py b/nautobot_device_onboarding/tests/test_empty_inventory.py new file mode 100755 index 00000000..018cea0b --- /dev/null +++ b/nautobot_device_onboarding/tests/test_empty_inventory.py @@ -0,0 +1,21 @@ +"""Test empty inventory creation.""" + +import unittest + +from nautobot_device_onboarding.nornir_plays.empty_inventory import EmptyInventory + + +class TestEmptyInventory(unittest.TestCase): + """Test Empty Inventory Nornir Class.""" + + def setUp(self): + self.inv = EmptyInventory().load() + + def test_initialize_empty_inventory_hosts(self): + self.assertEqual(self.inv.hosts, {}) + + def test_initialize_empty_inventory_groups(self): + self.assertEqual(self.inv.groups, {}) + + def test_initialize_empty_inventory_defaults(self): + self.assertEqual(list(self.inv.defaults.data.keys()), ["platform_parsing_info", "network_driver_mappings"]) diff --git a/nautobot_device_onboarding/tests/test_formatter.py b/nautobot_device_onboarding/tests/test_formatter.py new file mode 100755 index 00000000..574876a8 --- /dev/null +++ b/nautobot_device_onboarding/tests/test_formatter.py @@ -0,0 +1,678 @@ +"""Test for nornir plays in command_getter.""" + +import json +import os +import unittest +from unittest.mock import patch + +import yaml +from nornir.core.inventory import ConnectionOptions, Defaults, Host + +from nautobot_device_onboarding.nornir_plays.formatter import extract_and_post_process, perform_data_extraction +from nautobot_device_onboarding.nornir_plays.transform import add_platform_parsing_info + +MOCK_DIR = os.path.join("nautobot_device_onboarding", "tests", "mock") + + +def find_files_by_prefix(directory, prefix): + """Finds all files within a directory whose names start with the given prefix. + + Args: + directory: The directory path to search. + prefix: The prefix string to match in filenames. + + Returns: + A list of filenames that start with the prefix. + """ + matching_files = [] + for filename in os.listdir(directory): + if filename.startswith(prefix): + matching_files.append(filename) + return matching_files + + +class TestFormatterExtractAndProcess(unittest.TestCase): + """Tests Basic Operations of formatter.""" + + def setUp(self): + with open(f"{MOCK_DIR}/command_mappers/mock_cisco_ios.yml", "r", encoding="utf-8") as parsing_info: + self.platform_parsing_info = yaml.safe_load(parsing_info) + with open(f"{MOCK_DIR}/cisco_ios/command_getter_result_1.json", "r", encoding="utf-8") as command_info: + self.command_outputs = json.loads(command_info.read()) + self.host = Host( + name="198.51.100.1", + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="cisco_ios", + connection_options={ + "netmiko": ConnectionOptions( + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="platform", + ) + }, + defaults=Defaults(data={"sync_vlans": False, "sync_vrfs": False}), + ) + + def test_perform_data_extraction_simple_host_values(self): + self.assertEqual("198.51.100.1", self.host.name) + self.assertFalse(self.host.defaults.data.get("sync_vlans")) + self.assertFalse(self.host.defaults.data.get("sync_vrfs")) + + def test_extract_and_post_process_empty_command_result_str(self): + parsed_command_output = "" + actual_result = extract_and_post_process( + parsed_command_output, + self.platform_parsing_info["sync_devices"]["serial"], + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = ("", []) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_empty_command_result_list(self): + parsed_command_output = [] + actual_result = extract_and_post_process( + parsed_command_output, + self.platform_parsing_info["sync_devices"]["serial"], + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = ([], []) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_empty_command_result_dict(self): + parsed_command_output = {} + actual_result = extract_and_post_process( + parsed_command_output, + self.platform_parsing_info["sync_devices"]["serial"], + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = ({}, []) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_empty_command_result_str_with_iterable(self): + parsed_command_output = "" + actual_result = extract_and_post_process( + parsed_command_output, + self.platform_parsing_info["sync_devices"]["serial"], + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + "str", + False, + ) + expected_parsed_result = ("", "") + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_empty_command_result_list_with_iterable(self): + parsed_command_output = [] + actual_result = extract_and_post_process( + parsed_command_output, + self.platform_parsing_info["sync_devices"]["serial"], + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + "dict", + False, + ) + expected_parsed_result = ([], {}) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_empty_command_result_dict_with_iterable(self): + parsed_command_output = {} + actual_result = extract_and_post_process( + parsed_command_output, + self.platform_parsing_info["sync_devices"]["serial"], + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + "dict", + False, + ) + expected_parsed_result = ({}, {}) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_dict_with_iterable(self): + parsed_command_output = self.command_outputs["show version"] + actual_result = extract_and_post_process( + parsed_command_output, + self.platform_parsing_info["sync_devices"]["serial"]["commands"][0], + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = (["FOC2341Y2CQ"], "FOC2341Y2CQ") + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_json_string(self): + parsed_command_output = '{"foo": "bar"}' + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "foo", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = ("bar", "bar") + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_python_dict(self): + parsed_command_output = {"foo": "bar"} + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "foo", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = ("bar", "bar") + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_non_json_string(self): + parsed_command_output = "jeff" + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "foo", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = ([], []) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_non_json_string_with_iterable(self): + parsed_command_output = "bar" + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "foo", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + "dict", + False, + ) + expected_parsed_result = ([], {}) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_list_to_dict(self): + parsed_command_output = [{"foo": {"bar": "moo"}}] + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "[*].foo", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + "dict", + False, + ) + expected_parsed_result = ([{"bar": "moo"}], {"bar": "moo"}) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_list_to_string(self): + parsed_command_output = ["foo"] + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "[*]", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + "str", + False, + ) + expected_parsed_result = (["foo"], "foo") + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_default_iterable(self): + parsed_command_output = [{"foo": {"bar": "moo"}}] + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "[*].foo", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + None, + False, + ) + expected_parsed_result = ([{"bar": "moo"}], [{"bar": "moo"}]) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_pre_processor(self): + parsed_command_output = [ + { + "access_vlan": "10", + "admin_mode": "trunk", + "interface": "Gi1/8", + "mode": "down (suspended member of bundle Po8)", + "native_vlan": "10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "trunking_vlans": ["10"], + "voice_vlan": "none", + } + ] + vlan_map_post_processed = {"1": "default", "10": "10.39.110.0/25.LAN"} + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show interfaces switchport", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}", + "post_processor": "{{ obj | get_vlan_data(vlan_map) | tojson }}", + }, + { + "obj": "1.1.1.1", + "original_host": "1.1.1.1", + "vlan_map": vlan_map_post_processed, + "current_key": "GigabitEthernet1/8", + }, + None, + False, + ) + expected_parsed_result = ( + [ + { + "access_vlan": "10", + "admin_mode": "trunk", + "mode": "down (suspended member of bundle Po8)", + "trunking_vlans": ["10"], + } + ], + [{"id": "10", "name": "10.39.110.0/25.LAN"}], + ) + self.assertEqual(expected_parsed_result, actual_result) + + def test_extract_and_post_process_result_list_to_string_vios(self): + parsed_command_output = [ + { + "software_image": "VIOS-ADVENTERPRISEK9-M", + "version": "15.8(3)M2", + "release": "fc2", + "rommon": "Bootstrap", + "hostname": "rtr-01", + "uptime": "1 week, 3 days, 16 hours, 11 minutes", + "uptime_years": "", + "uptime_weeks": "1", + "uptime_days": "3", + "uptime_hours": "16", + "uptime_minutes": "11", + "reload_reason": "Unknown reason", + "running_image": "/vios-adventerprisek9-m", + "hardware": ["IOSv"], + "serial": ["991UCMIHG4UAJ1J010CQG"], + "config_register": "0x0", + "mac_address": [], + "restarted": "", + } + ] + actual_result = extract_and_post_process( + parsed_command_output, + { + "command": "show version", + "parser": "textfsm", + "jpath": "[*].serial[]", + }, + {"obj": "1.1.1.1", "original_host": "1.1.1.1"}, + "str", + False, + ) + expected_parsed_result = (["991UCMIHG4UAJ1J010CQG"], "991UCMIHG4UAJ1J010CQG") + self.assertEqual(expected_parsed_result, actual_result) + + +class TestFormatterSyncDevices(unittest.TestCase): + """Tests to ensure formatter is working for sync devices 'ssot job'.""" + + @patch("nautobot_device_onboarding.nornir_plays.transform.GitRepository") + def setUp(self, mock_repo): + # Load the application command_mapper files + mock_repo.return_value = 0 + self.platform_parsing_info = add_platform_parsing_info() + self.host = Host( + name="198.51.100.1", + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="", # Purposedly setting as None since we will loop through a single host instance for other tests. + connection_options={ + "netmiko": ConnectionOptions( + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="platform", + ) + }, + defaults=Defaults(data={"sync_vlans": False, "sync_vrfs": False}), + ) + + def test_add_platform_parsing_info_sane_defaults(self): + # Note: This is also officially tested in test_transform, but secondary check here as well. + default_mappers = ["cisco_ios", "arista_eos", "cisco_wlc", "cisco_xe", "juniper_junos", "cisco_nxos"] + self.assertEqual(sorted(default_mappers), list(sorted(self.platform_parsing_info.keys()))) + + def test_create_inventory_host_per_platform(self): + for platform in list(self.platform_parsing_info.keys()): + self.host.platform = platform + with self.subTest(msg=f"Testing host with platform {platform}"): + self.assertEqual(platform, self.host.platform) + + def test_perform_data_extraction_simple_host_values(self): + for platform in list(self.platform_parsing_info.keys()): + self.host.platform = platform + with self.subTest(msg=f"Testing host with platform {platform}"): + self.assertEqual("198.51.100.1", self.host.name) + self.assertFalse(self.host.defaults.data.get("sync_vlans")) + self.assertFalse(self.host.defaults.data.get("sync_vrfs")) + + def test_perform_data_extraction_sync_devices(self): + for platform in list(self.platform_parsing_info.keys()): + self.host.platform = platform + current_test_dir = f"{MOCK_DIR}/{platform}/" + getters = find_files_by_prefix(current_test_dir, "command_getter") + # NOTE: Cleanup later, should always require tests to be present + if len(getters) > 0: + with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + for command_getter_file in getters: + with open( + f"{MOCK_DIR}/{platform}/sync_devices/expected_result_{command_getter_file.split('_')[-1]}", + "r", + encoding="utf-8", + ) as expected_parsed: + expected_parsed_result = json.loads(expected_parsed.read()) + with open( + f"{MOCK_DIR}/{platform}/{command_getter_file}", "r", encoding="utf-8" + ) as command_info: + command_outputs = json.loads(command_info.read()) + actual_result = perform_data_extraction( + self.host, + self.platform_parsing_info[platform]["sync_devices"], + command_outputs, + job_debug=False, + ) + self.assertEqual(expected_parsed_result, actual_result) + + +class TestFormatterSyncNetworkDataNoOptions(unittest.TestCase): + """Tests to ensure formatter is working for sync devices 'ssot job'.""" + + @patch("nautobot_device_onboarding.nornir_plays.transform.GitRepository") + def setUp(self, mock_repo): + # Load the application command_mapper files + mock_repo.return_value = 0 + self.platform_parsing_info = add_platform_parsing_info() + self.host = Host( + name="198.51.100.1", + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="", # Purposedly setting as None since we will loop through a single host instance for other tests. + connection_options={ + "netmiko": ConnectionOptions( + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="platform", + ) + }, + defaults=Defaults(data={"sync_vlans": False, "sync_vrfs": False}), + ) + + def test_perform_data_extraction_simple_host_values(self): + for platform in list(self.platform_parsing_info.keys()): + self.host.platform = platform + with self.subTest(msg=f"Testing host with platform {platform}"): + self.assertEqual("198.51.100.1", self.host.name) + self.assertFalse(self.host.defaults.data.get("sync_vlans")) + self.assertFalse(self.host.defaults.data.get("sync_vrfs")) + + def test_perform_data_extraction_sync_network_data_no_options(self): + supported_platforms = list(self.platform_parsing_info.keys()) + supported_platforms.remove("cisco_wlc") + for platform in supported_platforms: + self.host.platform = platform + current_test_dir = f"{MOCK_DIR}/{platform}/" + getters = find_files_by_prefix(current_test_dir, "command_getter") + # NOTE: Cleanup later, should always require tests to be present + if len(getters) > 0: + with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + for command_getter_file in getters: + with open( + f"{MOCK_DIR}/{platform}/sync_network_data_no_options/expected_result_{command_getter_file.split('_')[-1]}", + "r", + encoding="utf-8", + ) as expected_parsed: + expected_parsed_result = json.loads(expected_parsed.read()) + with open( + f"{MOCK_DIR}/{platform}/{command_getter_file}", "r", encoding="utf-8" + ) as command_info: + command_outputs = json.loads(command_info.read()) + actual_result = perform_data_extraction( + self.host, + self.platform_parsing_info[platform]["sync_network_data"], + command_outputs, + job_debug=False, + ) + self.assertEqual(expected_parsed_result, actual_result) + + +class TestFormatterSyncNetworkDataWithVrfs(unittest.TestCase): + """Tests to ensure formatter is working for sync devices 'ssot job'.""" + + @patch("nautobot_device_onboarding.nornir_plays.transform.GitRepository") + def setUp(self, mock_repo): + # Load the application command_mapper files + mock_repo.return_value = 0 + self.platform_parsing_info = add_platform_parsing_info() + self.host = Host( + name="198.51.100.1", + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="", # Purposedly setting as None since we will loop through a single host instance for other tests. + connection_options={ + "netmiko": ConnectionOptions( + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="platform", + ) + }, + defaults=Defaults(data={"sync_vlans": False, "sync_vrfs": True}), + ) + + def test_perform_data_extraction_simple_host_values(self): + for platform in list(self.platform_parsing_info.keys()): + self.host.platform = platform + with self.subTest(msg=f"Testing host with platform {platform}"): + self.assertEqual("198.51.100.1", self.host.name) + self.assertFalse(self.host.defaults.data.get("sync_vlans")) + self.assertTrue(self.host.defaults.data.get("sync_vrfs")) + + def test_perform_data_extraction_sync_network_data_with_vrfs(self): + supported_platforms = list(self.platform_parsing_info.keys()) + supported_platforms.remove("cisco_wlc") + for platform in supported_platforms: + self.host.platform = platform + current_test_dir = f"{MOCK_DIR}/{platform}/" + getters = find_files_by_prefix(current_test_dir, "command_getter") + # NOTE: Cleanup later, should always require tests to be present + if len(getters) > 0: + with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + for command_getter_file in getters: + with open( + f"{MOCK_DIR}/{platform}/sync_network_data_with_vrfs/expected_result_{command_getter_file.split('_')[-1]}", + "r", + encoding="utf-8", + ) as expected_parsed: + expected_parsed_result = json.loads(expected_parsed.read()) + with open( + f"{MOCK_DIR}/{platform}/{command_getter_file}", "r", encoding="utf-8" + ) as command_info: + command_outputs = json.loads(command_info.read()) + actual_result = perform_data_extraction( + self.host, + self.platform_parsing_info[platform]["sync_network_data"], + command_outputs, + job_debug=False, + ) + self.assertEqual(expected_parsed_result, actual_result) + + +class TestFormatterSyncNetworkDataWithVlans(unittest.TestCase): + """Tests to ensure formatter is working for sync devices 'ssot job'.""" + + @patch("nautobot_device_onboarding.nornir_plays.transform.GitRepository") + def setUp(self, mock_repo): + # Load the application command_mapper files + mock_repo.return_value = 0 + self.platform_parsing_info = add_platform_parsing_info() + self.host = Host( + name="198.51.100.1", + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="", # Purposedly setting as None since we will loop through a single host instance for other tests. + connection_options={ + "netmiko": ConnectionOptions( + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="platform", + ) + }, + defaults=Defaults(data={"sync_vlans": True, "sync_vrfs": False}), + ) + + def test_perform_data_extraction_simple_host_values(self): + for platform in list(self.platform_parsing_info.keys()): + self.host.platform = platform + with self.subTest(msg=f"Testing host with platform {platform}"): + self.assertEqual("198.51.100.1", self.host.name) + self.assertTrue(self.host.defaults.data.get("sync_vlans")) + self.assertFalse(self.host.defaults.data.get("sync_vrfs")) + + def test_perform_data_extraction_sync_network_data_with_vlans(self): + supported_platforms = list(self.platform_parsing_info.keys()) + supported_platforms.remove("cisco_wlc") + for platform in supported_platforms: + self.host.platform = platform + current_test_dir = f"{MOCK_DIR}/{platform}/" + getters = find_files_by_prefix(current_test_dir, "command_getter") + # NOTE: Cleanup later, should always require tests to be present + if len(getters) > 0: + with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + for command_getter_file in getters: + with open( + f"{MOCK_DIR}/{platform}/sync_network_data_with_vlans/expected_result_{command_getter_file.split('_')[-1]}", + "r", + encoding="utf-8", + ) as expected_parsed: + expected_parsed_result = json.loads(expected_parsed.read()) + with open( + f"{MOCK_DIR}/{platform}/{command_getter_file}", "r", encoding="utf-8" + ) as command_info: + command_outputs = json.loads(command_info.read()) + actual_result = perform_data_extraction( + self.host, + self.platform_parsing_info[platform]["sync_network_data"], + command_outputs, + job_debug=False, + ) + self.assertEqual(expected_parsed_result, actual_result) + + +@unittest.skip(reason="Todo test sync network data with all options.") +class TestFormatterSyncNetworkDataAll(unittest.TestCase): + """Tests to ensure formatter is working for sync devices 'ssot job'.""" + + @patch("nautobot_device_onboarding.nornir_plays.transform.GitRepository") + def setUp(self, mock_repo): + # Load the application command_mapper files + mock_repo.return_value = 0 + self.platform_parsing_info = add_platform_parsing_info() + self.host = Host( + name="198.51.100.1", + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="", # Purposedly setting as None since we will loop through a single host instance for other tests. + connection_options={ + "netmiko": ConnectionOptions( + hostname="198.51.100.1", + port=22, + username="username", + password="password", # nosec + platform="platform", + ) + }, + defaults=Defaults(data={"sync_vlans": True, "sync_vrfs": True}), + ) + + def test_perform_data_extraction_simple_host_values(self): + for platform in list(self.platform_parsing_info.keys()): + self.host.platform = platform + with self.subTest(msg=f"Testing host with platform {platform}"): + self.assertEqual("198.51.100.1", self.host.name) + self.assertTrue(self.host.defaults.data.get("sync_vlans")) + self.assertTrue(self.host.defaults.data.get("sync_vrfs")) + + def test_perform_data_extraction_sync_network_data_all(self): + supported_platforms = list(self.platform_parsing_info.keys()) + supported_platforms.remove("cisco_wlc") + for platform in supported_platforms: + self.host.platform = platform + current_test_dir = f"{MOCK_DIR}/{platform}/" + getters = find_files_by_prefix(current_test_dir, "command_getter") + # NOTE: Cleanup later, should always require tests to be present + if len(getters) > 0: + with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + for command_getter_file in getters: + with open( + f"{MOCK_DIR}/{platform}/sync_network_data_all/expected_result_{command_getter_file.split('_')[-1]}", + "r", + encoding="utf-8", + ) as expected_parsed: + expected_parsed_result = json.loads(expected_parsed.read()) + with open( + f"{MOCK_DIR}/{platform}/{command_getter_file}", "r", encoding="utf-8" + ) as command_info: + command_outputs = json.loads(command_info.read()) + actual_result = perform_data_extraction( + self.host, + self.platform_parsing_info[platform]["sync_network_data"], + command_outputs, + job_debug=False, + ) + self.assertEqual(expected_parsed_result, actual_result) diff --git a/nautobot_device_onboarding/tests/test_inventory_creator.py b/nautobot_device_onboarding/tests/test_inventory_creator.py new file mode 100755 index 00000000..de8b5a31 --- /dev/null +++ b/nautobot_device_onboarding/tests/test_inventory_creator.py @@ -0,0 +1,47 @@ +"""Test ability to create an inventory.""" + +import unittest +from unittest.mock import patch + +from nautobot.dcim.models import Platform + +from nautobot_device_onboarding.nornir_plays.inventory_creator import _set_inventory, guess_netmiko_device_type + + +class TestInventoryCreator(unittest.TestCase): + """Test ability to create an inventory.""" + + def setUp(self) -> None: + self.host_ip = "198.51.100.1" + self.hostname = "router1.example.com" + self.username = "admin" + self.password = "password" # nosec + self.port = 22 + self.platform = Platform(name="cisco_xe", network_driver="cisco_xe") + + @patch("nautobot_device_onboarding.nornir_plays.inventory_creator.SSHDetect") + def test_guess_device_type_success(self, mock_sshdetect): + mock_sshdetect.return_value.autodetect.return_value = "cisco_ios" + device_type, exception = guess_netmiko_device_type(self.hostname, self.username, self.password, self.port) + self.assertEqual(device_type, "cisco_ios") + self.assertIsNone(exception) + + @patch("nautobot_device_onboarding.nornir_plays.inventory_creator.SSHDetect") + def test_guess_device_type_exception(self, mock_sshdetect): + mock_sshdetect.return_value.autodetect.side_effect = Exception("SSH Connection Failed") + device_type, exception = guess_netmiko_device_type(self.hostname, self.username, self.password, self.port) + self.assertIsNone(device_type) + self.assertIsInstance(exception, Exception) + + @patch("nautobot_device_onboarding.nornir_plays.inventory_creator.SSHDetect") + def test_set_inventory_no_platform(self, mock_sshdetect): + mock_sshdetect.return_value.autodetect.return_value = "cisco_ios" + inv, exception = _set_inventory(self.host_ip, None, self.port, self.username, self.password) + + self.assertEqual(inv["198.51.100.1"].platform, "cisco_ios") + self.assertIsNone(exception) + + def test_set_inventory_specified_platform(self): + inv, exception = _set_inventory(self.host_ip, self.platform, self.port, self.username, self.password) + self.assertEqual(inv["198.51.100.1"].platform, self.platform.name) + self.assertIsNone(exception) diff --git a/nautobot_device_onboarding/tests/test_jinja_filters.py b/nautobot_device_onboarding/tests/test_jinja_filters.py new file mode 100755 index 00000000..89f9dc81 --- /dev/null +++ b/nautobot_device_onboarding/tests/test_jinja_filters.py @@ -0,0 +1,255 @@ +"""Test Filters for Jinja2 PostProcessing.""" + +import unittest +import unittest.mock +from nautobot_device_onboarding.jinja_filters import ( + extract_prefix, + flatten_dict_from_value, + flatten_list_of_dict_from_value, + get_entry_from_dict, + get_vlan_data, + interface_mode_logic, + interface_status_to_bool, + key_exist_or_default, + map_interface_type, + parse_junos_ip_address, + port_mode_to_nautobot, +) + + +class TestJinjaFilters(unittest.TestCase): + """Test all the jinja filters defined.""" + + def test_map_interface_type_default(self): + """Map interface type to a Nautobot type.""" + self.assertEqual(map_interface_type("foo"), "other") + + def test_map_interface_type_valid_key(self): + """Map interface type to a Nautobot type.""" + self.assertEqual(map_interface_type("ethernet"), "1000base-t") + + def test_extract_prefix_valid_without_slash(self): + """Extract the prefix length from the IP/Prefix. E.g 192.168.1.1/24.""" + self.assertEqual(extract_prefix("198.51.100.1"), "198.51.100.1") + + def test_extract_prefix_valid_with_slash(self): + """Extract the prefix length from the IP/Prefix. E.g 192.168.1.1/24.""" + self.assertEqual(extract_prefix("198.51.100.1/24"), "24") + + def test_interface_status_to_bool_down(self): + """Take links or admin status and change to boolean.""" + self.assertFalse(interface_status_to_bool("down")) + + def test_interface_status_to_bool_admindown(self): + """Take links or admin status and change to boolean.""" + self.assertFalse(interface_status_to_bool("Administratively Down")) + + def test_interface_status_to_bool_linkdown(self): + """Take links or admin status and change to boolean.""" + self.assertFalse(interface_status_to_bool("link status down")) + + def test_interface_status_to_bool_up(self): + """Take links or admin status and change to boolean.""" + self.assertTrue(interface_status_to_bool("up")) + + def test_interface_status_to_bool_up_upper(self): + """Take links or admin status and change to boolean.""" + self.assertTrue(interface_status_to_bool("UP")) + + def test_port_mode_to_nautobot_default(self): + """Take links or admin status and change to boolean.""" + self.assertEqual(port_mode_to_nautobot("foo"), "") + + def test_port_mode_to_nautobot_valid_key(self): + """Take links or admin status and change to boolean.""" + self.assertEqual(port_mode_to_nautobot("bridged"), "tagged") + + def test_key_exist_or_default_key_valid(self): + """Take a dict with a key and if its not truthy return a default.""" + self.assertEqual(key_exist_or_default({"foo": "bar"}, "foo"), {"foo": "bar"}) + + def test_key_exist_or_default_key_invalid(self): + """Take a dict with a key and if its not truthy return a default.""" + self.assertEqual(key_exist_or_default({"foo": "bar"}, "baz"), {}) + + def test_flatten_list_of_dict_from_value_valid(self): + """Takes a list of dictionaries with a value and flattens it.""" + sent_data = [{"1": {"name": "name1"}}, {"2": {"name": "name2"}}] + expected_data = {"1": "name1", "2": "name2"} + self.assertEqual(flatten_list_of_dict_from_value(sent_data, "name"), expected_data) + + def test_flatten_dict_from_value_valid(self): + """Takes a dictionary of dictionaries with a value and flattens it.""" + sent_data = {"1": {"name": "name1"}, "2": {"name": "name2"}} + expected_data = {"1": "name1", "2": "name2"} + self.assertEqual(flatten_dict_from_value(sent_data, "name"), expected_data) + + def test_get_entry_from_dict_valid(self): + """Take a dict with a key and return its object.""" + self.assertEqual(get_entry_from_dict({"foo": "bar"}, "foo"), "bar") + + def test_get_entry_from_dict_default(self): + """Take a dict with a key and return its object.""" + self.assertEqual(get_entry_from_dict({"foo": "bar"}, "baz"), "") + + def test_interface_mode_logic_access(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "access" + actual_value = interface_mode_logic( + [{"admin_mode": "access", "mode": "access", "access_vlan": "1", "trunking_vlans": "10"}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_trunk_tagged_all_str(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "tagged-all" + actual_value = interface_mode_logic( + [{"admin_mode": "trunk", "mode": "trunk", "access_vlan": "1", "trunking_vlans": "ALL"}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_trunk_tagged_range_str(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "tagged-all" + actual_value = interface_mode_logic( + [{"admin_mode": "trunk", "mode": "trunk", "access_vlan": "1", "trunking_vlans": "1-4094"}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_trunk_tagged_all_list(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "tagged-all" + actual_value = interface_mode_logic( + [{"admin_mode": "trunk", "mode": "trunk", "access_vlan": "1", "trunking_vlans": ["ALL"]}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_trunk_tagged_range_list(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "tagged-all" + actual_value = interface_mode_logic( + [{"admin_mode": "trunk", "mode": "trunk", "access_vlan": "1", "trunking_vlans": ["1-4094"]}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_trunk_single_tagged(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "tagged" + actual_value = interface_mode_logic( + [{"admin_mode": "trunk", "mode": "trunk", "access_vlan": "1", "trunking_vlans": ["10"]}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_dynamic_access(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "access" + actual_value = interface_mode_logic( + [{"admin_mode": "dynamic", "mode": "access", "access_vlan": "1", "trunking_vlans": ["10"]}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_dynamic_trunk_all(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "tagged-all" + actual_value = interface_mode_logic( + [{"admin_mode": "dynamic", "mode": "trunk", "access_vlan": "1", "trunking_vlans": ["ALL"]}] + ) + self.assertEqual(expected_value, actual_value) + + def test_interface_mode_logic_dynamic_trunk_single(self): + """Logic to translate network modes to nautobot mode.""" + expected_value = "tagged" + actual_value = interface_mode_logic( + [{"admin_mode": "dynamic", "mode": "trunk", "access_vlan": "1", "trunking_vlans": "10"}] + ) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_empty_item_data(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "access" + expected_value = [] + actual_value = get_vlan_data([], []) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_tagged_all_tagged_all(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "tagged-all" + expected_value = [] + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["ALL"]}], [{"10": "VLAN0010"}]) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_tagged_all_tagged_range(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "tagged-all" + expected_value = [] + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "VLAN0010"}) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_access_create_defined_name(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "access" + expected_value = [{"id": "10", "name": "DATA"}] + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "DATA"}) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_access_tagged_vlans_defined_trunking_as_list(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "tagged" + expected_value = [{"id": "10", "name": "DATA"}] + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["10"]}], {"10": "DATA"}) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_access_tagged_vlans_defined_trunking_as_str(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "tagged" + expected_value = [{"id": "10", "name": "DATA"}] + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "10"}], {"10": "DATA"}) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_access_tagged_vlans_no_name_trunking_as_list(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "tagged" + expected_value = [{"id": "12", "name": "VLAN0012"}] + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["12"]}], {"10": "DATA"}) + self.assertEqual(expected_value, actual_value) + + @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") + def test_get_vlan_data_access_tagged_vlans_no_name_trunking_as_str(self, mock_mode): + """Get vlan information from an item.""" + mock_mode.return_value = "tagged" + expected_value = [{"id": "12", "name": "VLAN0012"}] + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "12"}], {"10": "DATA"}) + self.assertEqual(expected_value, actual_value) + + def test_parse_junos_ip_address_values_as_list_single(self): + """Parse Junos IP and destination prefix.""" + data = [{"prefix_length": ["10.65.229.106/31"], "ip_address": ["10.65.229.106"]}] + expected = [{"prefix_length": "31", "ip_address": "10.65.229.106"}] + self.assertEqual(parse_junos_ip_address(data), expected) + + @unittest.skip("Need to correct assert used for list of dictionaries.") + def test_parse_junos_ip_address_values_as_list_multiple(self): + """Parse Junos IP and destination prefix.""" + data = [{"prefix_length": ["10.65.133.0/29", "10.65.133.0/29"], "ip_address": ["10.65.133.1", "10.65.133.3"]}] + expected = [ + {"prefix_length": "29", "ip_address": "10.65.133.1"}, + {"ip_address": "10.65.133.3", "prefix_length": "29"}, + ] + self.assertEqual(parse_junos_ip_address(data), expected) + + def test_parse_junos_ip_address_values_as_empty_list(self): + """Parse Junos IP and destination prefix.""" + data = [{"prefix_length": [], "ip_address": []}] + self.assertEqual(parse_junos_ip_address(data), []) + + def test_parse_junos_ip_address_values_as_none(self): + """Parse Junos IP and destination prefix.""" + data = [{"prefix_length": None, "ip_address": None}] + self.assertEqual(parse_junos_ip_address(data), []) diff --git a/nautobot_device_onboarding/tests/test_transform.py b/nautobot_device_onboarding/tests/test_transform.py new file mode 100755 index 00000000..2cc0dbaf --- /dev/null +++ b/nautobot_device_onboarding/tests/test_transform.py @@ -0,0 +1,109 @@ +"""Testing the transform helpers.""" + +import os +import tempfile +import unittest +from unittest import mock + +import yaml +from nautobot.core.jobs import GitRepositorySync +from nautobot.core.testing import TransactionTestCase, run_job_for_testing +from nautobot.extras.choices import JobResultStatusChoices +from nautobot.extras.models import GitRepository, JobResult + +from nautobot_device_onboarding.nornir_plays.transform import add_platform_parsing_info, load_command_mappers_from_dir + +MOCK_DIR = os.path.join("nautobot_device_onboarding", "tests", "mock") + + +class TestTransformNoGitRepo(unittest.TestCase): + """Testing the transform helpers with no git repo overloads.""" + + def setUp(self): + self.yaml_file_dir = f"{MOCK_DIR}/command_mappers/" + + def test_add_platform_parsing_info_sane_defaults(self): + command_mappers = add_platform_parsing_info() + default_mappers = ["cisco_ios", "arista_eos", "cisco_wlc", "cisco_xe", "juniper_junos", "cisco_nxos"] + self.assertEqual(sorted(default_mappers), list(sorted(command_mappers.keys()))) + + def test_load_command_mappers_from_dir(self): + command_mappers = load_command_mappers_from_dir(self.yaml_file_dir) + self.assertEqual(["mock_cisco_ios"], list(command_mappers.keys())) + + +@mock.patch("nautobot.extras.datasources.git.GitRepo") +class TestTransformWithGitRepo(TransactionTestCase): + """Testing the transform helpers with git repo overloads.""" + + databases = ("default", "job_logs") + COMMIT_HEXSHA = "88dd9cd78df89e887ee90a1d209a3e9a04e8c841" + + def setUp(self): + super().setUp() + self.yaml_file_dir = f"{MOCK_DIR}/command_mappers/" + self.repo_slug = "test_git_repo" + self.repo = GitRepository( + name="Test Git Repository", + slug=self.repo_slug, + remote_url="http://localhost/git.git", + provided_contents=["nautobot_device_onboarding.onboarding_command_mappers"], + ) + self.repo.save() + self.job_result = JobResult.objects.create(name=self.repo.name) + return mock.DEFAULT + + def populate_repo(self, path, url, *args, **kwargs): + """Simple helper to populate a mock repo with some data.""" + os.makedirs(path, exist_ok=True) + os.makedirs(os.path.join(path, "onboarding_command_mappers"), exist_ok=True) + with open(os.path.join(path, "onboarding_command_mappers", "foo_bar.yml"), "w", encoding="utf-8") as fd: + yaml.dump( + { + "sync_devices": { + "serial": { + "commands": [{"command": "show version", "parser": "textfsm", "jpath": "[*].serial"}] + } + } + }, + fd, + ) + return mock.DEFAULT + + def test_git_repo_was_created(self, MockGitRepo): # pylint:disable=invalid-name + repo_count = GitRepository.objects.filter( + provided_contents=["nautobot_device_onboarding.onboarding_command_mappers"] + ).count() + self.assertEqual(1, repo_count) + + @mock.patch("nautobot_device_onboarding.nornir_plays.transform.load_command_mappers_from_dir") + def test_pull_git_repository_and_refresh_data_with_valid_data( + self, mock_load_command_mappers, MockGitRepo + ): # pylint:disable=invalid-name + """ + The test_pull_git_repository_and_refresh_data job should succeed if valid data is present in the repo. + """ + with tempfile.TemporaryDirectory() as tempdir: + with self.settings(GIT_ROOT=tempdir): + MockGitRepo.side_effect = self.populate_repo + MockGitRepo.return_value.checkout.return_value = (self.COMMIT_HEXSHA, True) + + # Run the Git operation and refresh the object from the DB + job_model = GitRepositorySync().job_model + job_result = run_job_for_testing(job=job_model, repository=self.repo.pk) + job_result.refresh_from_db() + self.assertEqual( + job_result.status, + JobResultStatusChoices.STATUS_SUCCESS, + (job_result.traceback, list(job_result.job_log_entries.values_list("message", flat=True))), + ) + mock_load_command_mappers.side_effect = [ + {"foo_bar": {"sync_devices": "serial"}}, + {"cisco_ios": {"sync_devices": "serial-2"}}, + ] + expected_dict = { + "foo_bar": {"sync_devices": "serial"}, + "cisco_ios": {"sync_devices": "serial-2"}, + } + merged_mappers = add_platform_parsing_info() + self.assertEqual(expected_dict, merged_mappers) From 419728e75ca4fb4fb8fd1c6192924e1bdde90d80 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Thu, 6 Jun 2024 14:08:10 -0600 Subject: [PATCH 02/81] General application updates for 4.0 and updates from drift manager Co-Authored-By: David Cates <57967713+Dav-C@users.noreply.github.com> Co-Authored-By: Susan Hooks <51679702+susanhooks@users.noreply.github.com> --- README.md | 2 +- changes/176.fixed | 1 - changes/8.housekeeping | 1 - development/Dockerfile | 6 +- development/app_config_schema.py | 65 - development/development.env | 2 + development/docker-compose.base.yml | 1 - development/docker-compose.dev.yml | 1 - development/docker-compose.mysql.yml | 2 - development/docker-compose.postgres.yml | 2 - development/docker-compose.redis.yml | 1 - development/nautobot_config.py | 29 +- poetry.lock | 1794 ++++++++++++++--------- pyproject.toml | 30 +- tasks.py | 64 +- 15 files changed, 1199 insertions(+), 802 deletions(-) delete mode 100644 changes/176.fixed delete mode 100644 changes/8.housekeeping delete mode 100644 development/app_config_schema.py mode change 100644 => 100755 poetry.lock mode change 100644 => 100755 pyproject.toml diff --git a/README.md b/README.md index b0602c33..cc2b1beb 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@


- + diff --git a/changes/176.fixed b/changes/176.fixed deleted file mode 100644 index 4a4ec64b..00000000 --- a/changes/176.fixed +++ /dev/null @@ -1 +0,0 @@ -Updated tests for OnboardingTask Job. \ No newline at end of file diff --git a/changes/8.housekeeping b/changes/8.housekeeping deleted file mode 100644 index 653c54ac..00000000 --- a/changes/8.housekeeping +++ /dev/null @@ -1 +0,0 @@ -Re-baked from the latest template. diff --git a/development/Dockerfile b/development/Dockerfile index 34bd5c64..0d2083f7 100644 --- a/development/Dockerfile +++ b/development/Dockerfile @@ -6,8 +6,8 @@ # ------------------------------------------------------------------------------------- # !!! USE CAUTION WHEN MODIFYING LINES BELOW -# Accepts a desired Nautobot version as build argument, default to 2.0.3 -ARG NAUTOBOT_VER="2.0.3" +# Accepts a desired Nautobot version as build argument, default to 2.2.3 +ARG NAUTOBOT_VER="2.2.3" # Accepts a desired Python version as build argument, default to 3.11 ARG PYTHON_VER="3.11" @@ -28,7 +28,7 @@ ENV INVOKE_NAUTOBOT_DEVICE_ONBOARDING_LOCAL=true # Since this is only used for development and we don't ship this container, pinning Poetry back is not expressly necessary # We also don't need virtual environments in container RUN which poetry || curl -sSL https://install.python-poetry.org | python3 - && \ - poetry config virtualenvs.create false + poetry config virtualenvs.create false # !!! USE CAUTION WHEN MODIFYING LINES ABOVE # ------------------------------------------------------------------------------------- diff --git a/development/app_config_schema.py b/development/app_config_schema.py deleted file mode 100644 index a779b14e..00000000 --- a/development/app_config_schema.py +++ /dev/null @@ -1,65 +0,0 @@ -"""App Config Schema Generator and Validator.""" - -import json -from importlib import import_module -from os import getenv -from pathlib import Path -from urllib.parse import urlparse - -import jsonschema -import toml -from django.conf import settings -from to_json_schema.to_json_schema import SchemaBuilder - - -def _enrich_object_schema(schema, defaults, required): - schema["additionalProperties"] = False - for key, value in schema["properties"].items(): - if required and key in required: - value["required"] = True - default_value = defaults and defaults.get(key, None) - if value["type"] == "object" and "properties" in value: - _enrich_object_schema(value, default_value, None) - elif default_value is not None: - value["default"] = default_value - - -def _main(): - pyproject = toml.loads(Path("pyproject.toml").read_text()) - url = urlparse(pyproject["tool"]["poetry"]["repository"]) - _, owner, repository = url.path.split("/") - package_name = pyproject["tool"]["poetry"]["packages"][0]["include"] - app_config = settings.PLUGINS_CONFIG[package_name] # type: ignore - schema_path = Path(package_name) / "app-config-schema.json" - command = getenv("APP_CONFIG_SCHEMA_COMMAND", "") - if command == "generate": - schema = { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": f"https://raw.githubusercontent.com/{owner}/{repository}/develop/{package_name}/app-config-schema.json", - "$comment": "TBD: Update $id, replace `develop` with the future release tag", - **SchemaBuilder().to_json_schema(app_config), # type: ignore - } - app_config = import_module(package_name).config - _enrich_object_schema(schema, app_config.default_settings, app_config.required_settings) - schema_path.write_text(json.dumps(schema, indent=4) + "\n") - print(f"\n==================\nGenerated schema:\n\n{schema_path}\n") - print( - "WARNING: Review and edit the generated file before committing.\n" - "\n" - "Its content is inferred from:\n" - "\n" - "- The current configuration in `PLUGINS_CONFIG`\n" - "- `NautobotAppConfig.default_settings`\n" - "- `NautobotAppConfig.required_settings`" - ) - elif command == "validate": - schema = json.loads(schema_path.read_text()) - jsonschema.validate(app_config, schema) - print( - f"\n==================\nValidated configuration using the schema:\n{schema_path}\nConfiguration is valid." - ) - else: - raise RuntimeError(f"Unknown command: {command}") - - -_main() diff --git a/development/development.env b/development/development.env index 54f0b870..11d1edcc 100644 --- a/development/development.env +++ b/development/development.env @@ -36,3 +36,5 @@ POSTGRES_DB=${NAUTOBOT_DB_NAME} MYSQL_USER=${NAUTOBOT_DB_USER} MYSQL_DATABASE=${NAUTOBOT_DB_NAME} MYSQL_ROOT_HOST=% + +NAUTOBOT_SSOT_HIDE_EXAMPLE_JOBS="True" diff --git a/development/docker-compose.base.yml b/development/docker-compose.base.yml index e6a6c59b..bdfbcdcc 100644 --- a/development/docker-compose.base.yml +++ b/development/docker-compose.base.yml @@ -13,7 +13,6 @@ x-nautobot-base: &nautobot-base - "creds.env" tty: true -version: "3.8" services: nautobot: depends_on: diff --git a/development/docker-compose.dev.yml b/development/docker-compose.dev.yml index 8855621a..ea6a6257 100644 --- a/development/docker-compose.dev.yml +++ b/development/docker-compose.dev.yml @@ -3,7 +3,6 @@ # any override will need to include these volumes to use them. # see: https://github.com/docker/compose/issues/3729 --- -version: "3.8" services: nautobot: command: "nautobot-server runserver 0.0.0.0:8080" diff --git a/development/docker-compose.mysql.yml b/development/docker-compose.mysql.yml index 062ada94..a8fe3129 100644 --- a/development/docker-compose.mysql.yml +++ b/development/docker-compose.mysql.yml @@ -1,6 +1,4 @@ --- -version: "3.8" - services: nautobot: environment: diff --git a/development/docker-compose.postgres.yml b/development/docker-compose.postgres.yml index 12d1de31..8d96fdba 100644 --- a/development/docker-compose.postgres.yml +++ b/development/docker-compose.postgres.yml @@ -1,6 +1,4 @@ --- -version: "3.8" - services: nautobot: environment: diff --git a/development/docker-compose.redis.yml b/development/docker-compose.redis.yml index 6da9fa01..b5e266a3 100644 --- a/development/docker-compose.redis.yml +++ b/development/docker-compose.redis.yml @@ -1,5 +1,4 @@ --- -version: "3.8" services: redis: image: "redis:6-alpine" diff --git a/development/nautobot_config.py b/development/nautobot_config.py index 24719984..4f29792d 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -93,11 +93,11 @@ "disable_existing_loggers": False, "formatters": { "normal": { - "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)s : %(message)s", + "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)s :\n %(message)s", "datefmt": "%H:%M:%S", }, "verbose": { - "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)-20s %(filename)-15s %(funcName)30s() : %(message)s", + "format": "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)-20s %(filename)-15s %(funcName)30s() :\n %(message)s", "datefmt": "%H:%M:%S", }, }, @@ -127,13 +127,24 @@ # # Enable installed Apps. Add the name of each App to the list. -PLUGINS = ["nautobot_device_onboarding"] +PLUGINS = ["nautobot_device_onboarding", "nautobot_ssot", "nautobot_plugin_nornir"] # Apps configuration settings. These settings are used by various Apps that the user may have installed. # Each key in the dictionary is the name of an installed App and its value is a dictionary of settings. -# PLUGINS_CONFIG = { -# 'nautobot_device_onboarding': { -# 'foo': 'bar', -# 'buzz': 'bazz' -# } -# } +PLUGINS_CONFIG = { + "nautobot_device_onboarding": {}, + "nautobot_ssot": { + "hide_example_jobs": is_truthy(os.getenv("NAUTOBOT_SSOT_HIDE_EXAMPLE_JOBS")), + }, + "nautobot_plugin_nornir": { + "nornir_settings": { + "credentials": "nautobot_plugin_nornir.plugins.credentials.nautobot_secrets.CredentialsNautobotSecrets", + "runner": { + "plugin": "threaded", + "options": { + "num_workers": 20, + }, + }, + }, + }, +} diff --git a/poetry.lock b/poetry.lock old mode 100644 new mode 100755 index c6b0ce97..f1830ae6 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "amqp" @@ -14,6 +14,10 @@ files = [ [package.dependencies] vine = ">=5.0.0,<6.0.0" + + + + [[package]] name = "aniso8601" version = "7.0.0" @@ -25,6 +29,28 @@ files = [ {file = "aniso8601-7.0.0.tar.gz", hash = "sha256:513d2b6637b7853806ae79ffaca6f3e8754bdd547048f5ccc1420aec4b714f1e"}, ] +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + [[package]] name = "appnope" version = "0.1.4" @@ -55,13 +81,13 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "3.1.0" +version = "3.2.2" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.8.0" files = [ - {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, - {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, + {file = "astroid-3.2.2-py3-none-any.whl", hash = "sha256:e8a0083b4bb28fcffb6207a3bfc9e5d0a68be951dd7e336d5dcf639c682388c0"}, + {file = "astroid-3.2.2.tar.gz", hash = "sha256:8ead48e31b92b2e217b6c9733a21afafe479d52d6e164dd25fb1a770c7c3cf94"}, ] [package.dependencies] @@ -213,38 +239,38 @@ yaml = ["PyYAML"] [[package]] name = "bcrypt" -version = "4.1.2" +version = "4.1.3" description = "Modern password hashing for your software and your servers" optional = false python-versions = ">=3.7" files = [ - {file = "bcrypt-4.1.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ac621c093edb28200728a9cca214d7e838529e557027ef0581685909acd28b5e"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea505c97a5c465ab8c3ba75c0805a102ce526695cd6818c6de3b1a38f6f60da1"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57fa9442758da926ed33a91644649d3e340a71e2d0a5a8de064fb621fd5a3326"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb3bd3321517916696233b5e0c67fd7d6281f0ef48e66812db35fc963a422a1c"}, - {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6cad43d8c63f34b26aef462b6f5e44fdcf9860b723d2453b5d391258c4c8e966"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:44290ccc827d3a24604f2c8bcd00d0da349e336e6503656cb8192133e27335e2"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:732b3920a08eacf12f93e6b04ea276c489f1c8fb49344f564cca2adb663b3e4c"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1c28973decf4e0e69cee78c68e30a523be441972c826703bb93099868a8ff5b5"}, - {file = "bcrypt-4.1.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b8df79979c5bae07f1db22dcc49cc5bccf08a0380ca5c6f391cbb5790355c0b0"}, - {file = "bcrypt-4.1.2-cp37-abi3-win32.whl", hash = "sha256:fbe188b878313d01b7718390f31528be4010fed1faa798c5a1d0469c9c48c369"}, - {file = "bcrypt-4.1.2-cp37-abi3-win_amd64.whl", hash = "sha256:9800ae5bd5077b13725e2e3934aa3c9c37e49d3ea3d06318010aa40f54c63551"}, - {file = "bcrypt-4.1.2-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:71b8be82bc46cedd61a9f4ccb6c1a493211d031415a34adde3669ee1b0afbb63"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e3c6642077b0c8092580c819c1684161262b2e30c4f45deb000c38947bf483"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:387e7e1af9a4dd636b9505a465032f2f5cb8e61ba1120e79a0e1cd0b512f3dfc"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f70d9c61f9c4ca7d57f3bfe88a5ccf62546ffbadf3681bb1e268d9d2e41c91a7"}, - {file = "bcrypt-4.1.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2a298db2a8ab20056120b45e86c00a0a5eb50ec4075b6142db35f593b97cb3fb"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ba55e40de38a24e2d78d34c2d36d6e864f93e0d79d0b6ce915e4335aa81d01b1"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3566a88234e8de2ccae31968127b0ecccbb4cddb629da744165db72b58d88ca4"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b90e216dc36864ae7132cb151ffe95155a37a14e0de3a8f64b49655dd959ff9c"}, - {file = "bcrypt-4.1.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:69057b9fc5093ea1ab00dd24ede891f3e5e65bee040395fb1e66ee196f9c9b4a"}, - {file = "bcrypt-4.1.2-cp39-abi3-win32.whl", hash = "sha256:02d9ef8915f72dd6daaef40e0baeef8a017ce624369f09754baf32bb32dba25f"}, - {file = "bcrypt-4.1.2-cp39-abi3-win_amd64.whl", hash = "sha256:be3ab1071662f6065899fe08428e45c16aa36e28bc42921c4901a191fda6ee42"}, - {file = "bcrypt-4.1.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d75fc8cd0ba23f97bae88a6ec04e9e5351ff3c6ad06f38fe32ba50cbd0d11946"}, - {file = "bcrypt-4.1.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a97e07e83e3262599434816f631cc4c7ca2aa8e9c072c1b1a7fec2ae809a1d2d"}, - {file = "bcrypt-4.1.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e51c42750b7585cee7892c2614be0d14107fad9581d1738d954a262556dd1aab"}, - {file = "bcrypt-4.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba4e4cc26610581a6329b3937e02d319f5ad4b85b074846bf4fef8a8cf51e7bb"}, - {file = "bcrypt-4.1.2.tar.gz", hash = "sha256:33313a1200a3ae90b75587ceac502b048b840fc69e7f7a0905b5f87fac7a1258"}, + {file = "bcrypt-4.1.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:48429c83292b57bf4af6ab75809f8f4daf52aa5d480632e53707805cc1ce9b74"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8bea4c152b91fd8319fef4c6a790da5c07840421c2b785084989bf8bbb7455"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d3b317050a9a711a5c7214bf04e28333cf528e0ed0ec9a4e55ba628d0f07c1a"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:094fd31e08c2b102a14880ee5b3d09913ecf334cd604af27e1013c76831f7b05"}, + {file = "bcrypt-4.1.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4fb253d65da30d9269e0a6f4b0de32bd657a0208a6f4e43d3e645774fb5457f3"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:193bb49eeeb9c1e2db9ba65d09dc6384edd5608d9d672b4125e9320af9153a15"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8cbb119267068c2581ae38790e0d1fbae65d0725247a930fc9900c285d95725d"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6cac78a8d42f9d120b3987f82252bdbeb7e6e900a5e1ba37f6be6fe4e3848286"}, + {file = "bcrypt-4.1.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01746eb2c4299dd0ae1670234bf77704f581dd72cc180f444bfe74eb80495b64"}, + {file = "bcrypt-4.1.3-cp37-abi3-win32.whl", hash = "sha256:037c5bf7c196a63dcce75545c8874610c600809d5d82c305dd327cd4969995bf"}, + {file = "bcrypt-4.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:8a893d192dfb7c8e883c4576813bf18bb9d59e2cfd88b68b725990f033f1b978"}, + {file = "bcrypt-4.1.3-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d4cf6ef1525f79255ef048b3489602868c47aea61f375377f0d00514fe4a78c"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5698ce5292a4e4b9e5861f7e53b1d89242ad39d54c3da451a93cac17b61921a"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec3c2e1ca3e5c4b9edb94290b356d082b721f3f50758bce7cce11d8a7c89ce84"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3a5be252fef513363fe281bafc596c31b552cf81d04c5085bc5dac29670faa08"}, + {file = "bcrypt-4.1.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5f7cd3399fbc4ec290378b541b0cf3d4398e4737a65d0f938c7c0f9d5e686611"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:c4c8d9b3e97209dd7111bf726e79f638ad9224b4691d1c7cfefa571a09b1b2d6"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:31adb9cbb8737a581a843e13df22ffb7c84638342de3708a98d5c986770f2834"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:551b320396e1d05e49cc18dd77d970accd52b322441628aca04801bbd1d52a73"}, + {file = "bcrypt-4.1.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6717543d2c110a155e6821ce5670c1f512f602eabb77dba95717ca76af79867d"}, + {file = "bcrypt-4.1.3-cp39-abi3-win32.whl", hash = "sha256:6004f5229b50f8493c49232b8e75726b568535fd300e5039e255d919fc3a07f2"}, + {file = "bcrypt-4.1.3-cp39-abi3-win_amd64.whl", hash = "sha256:2505b54afb074627111b5a8dc9b6ae69d0f01fea65c2fcaea403448c503d3991"}, + {file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:cb9c707c10bddaf9e5ba7cdb769f3e889e60b7d4fea22834b261f51ca2b89fed"}, + {file = "bcrypt-4.1.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9f8ea645eb94fb6e7bea0cf4ba121c07a3a182ac52876493870033141aa687bc"}, + {file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f44a97780677e7ac0ca393bd7982b19dbbd8d7228c1afe10b128fd9550eef5f1"}, + {file = "bcrypt-4.1.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d84702adb8f2798d813b17d8187d27076cca3cd52fe3686bb07a9083930ce650"}, + {file = "bcrypt-4.1.3.tar.gz", hash = "sha256:2ee15dd749f5952fe3f0430d0ff6b74082e159c50332a1413d51b5689cf06623"}, ] [package.extras] @@ -264,33 +290,33 @@ files = [ [[package]] name = "black" -version = "24.4.0" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"}, - {file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"}, - {file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"}, - {file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"}, - {file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"}, - {file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"}, - {file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"}, - {file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"}, - {file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"}, - {file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"}, - {file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"}, - {file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"}, - {file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"}, - {file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"}, - {file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"}, - {file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"}, - {file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"}, - {file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"}, - {file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"}, - {file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"}, - {file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"}, - {file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -631,63 +657,63 @@ files = [ [[package]] name = "coverage" -version = "7.4.4" +version = "7.5.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, - {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, - {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, - {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, - {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, - {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, - {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, - {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, - {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, - {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, - {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, - {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, - {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, - {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, + {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, + {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, + {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, + {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, + {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, + {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, + {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, + {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, + {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, + {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, + {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, + {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, + {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, + {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, + {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, + {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, + {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, + {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, + {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, + {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, + {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, + {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, ] [package.extras] @@ -709,43 +735,43 @@ dev = ["polib"] [[package]] name = "cryptography" -version = "42.0.5" +version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] @@ -772,6 +798,24 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "deepdiff" +version = "6.7.1" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +optional = false +python-versions = ">=3.7" +files = [ + {file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"}, + {file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"}, +] + +[package.dependencies] +ordered-set = ">=4.0.2,<4.2.0" + +[package.extras] +cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"] +optimize = ["orjson"] + [[package]] name = "defusedxml" version = "0.7.1" @@ -783,6 +827,27 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "diffsync" +version = "1.10.0" +description = "Library to easily sync/diff/update 2 different data sources" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "diffsync-1.10.0-py3-none-any.whl", hash = "sha256:f4368c97162d51eecc7a8e87026c731197a694026cabcf2ab4f16d18d7bdadbd"}, + {file = "diffsync-1.10.0.tar.gz", hash = "sha256:a9d7cb8e8ce983b446bf858c1c5c82cf473fcf231db73c0855e8c59ee7cd8370"}, +] + +[package.dependencies] +colorama = ">=0.4.3,<0.5.0" +packaging = ">=21.3,<24.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +structlog = ">=20.1.0,<23.0.0" +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +redis = ["redis (>=4.3,<5.0)"] + [[package]] name = "dill" version = "0.3.8" @@ -955,13 +1020,13 @@ Django = ">=3.2" [[package]] name = "django-health-check" -version = "3.18.1" +version = "3.18.2" description = "Run checks on services like databases, queue servers, celery processes, etc." optional = false python-versions = ">=3.8" files = [ - {file = "django-health-check-3.18.1.tar.gz", hash = "sha256:44552d55ae8950c9548d3b90f9d9fd5570b57446a19b2a8e674c82f993cb7a2c"}, - {file = "django_health_check-3.18.1-py2.py3-none-any.whl", hash = "sha256:2c89a326cd79830e2fc6808823a9e7e874ab23f7aef3ff2c4d1194c998e1dca1"}, + {file = "django_health_check-3.18.2-py2.py3-none-any.whl", hash = "sha256:16f9c9186236cbc2858fa0d0ecc3566ba2ad2b72683e5678d0d58eb9e8bbba1a"}, + {file = "django_health_check-3.18.2.tar.gz", hash = "sha256:21235120f8d756fa75ba430d0b0dbb04620fbd7bfac92ed6a0b911915ba38918"}, ] [package.dependencies] @@ -969,7 +1034,7 @@ django = ">=2.2" [package.extras] docs = ["sphinx"] -test = ["celery", "pytest", "pytest-cov", "pytest-django", "redis"] +test = ["boto3", "celery", "django-storages", "pytest", "pytest-cov", "pytest-django", "redis"] [[package]] name = "django-jinja" @@ -1189,13 +1254,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2024.4.1" +version = "2024.5.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf-spectacular-sidecar-2024.4.1.tar.gz", hash = "sha256:68532dd094714f79c1775c00848f22c10f004826abc856442ff30c3bc9c40bb4"}, - {file = "drf_spectacular_sidecar-2024.4.1-py3-none-any.whl", hash = "sha256:8359befe69a8953fea86be01c1ff37038854a62546225551de16c47c07dccd4e"}, + {file = "drf_spectacular_sidecar-2024.5.1-py3-none-any.whl", hash = "sha256:089fdef46b520b7b1c8a497a398cde9336c3f20b115835baeb158dc4138d743d"}, + {file = "drf_spectacular_sidecar-2024.5.1.tar.gz", hash = "sha256:1ecfbe86174461e3cf78a9cd49f69aa8d9e0710cb5e8b35107d3f8cc0f380c21"}, ] [package.dependencies] @@ -1215,6 +1280,20 @@ files = [ [package.extras] dev = ["coverage", "coveralls", "pytest"] +[[package]] +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] + +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "executing" version = "2.0.1" @@ -1410,19 +1489,75 @@ six = ">=1.12" [[package]] name = "griffe" -version = "0.44.0" +version = "0.45.2" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.44.0-py3-none-any.whl", hash = "sha256:8a4471c469ba980b87c843f1168850ce39d0c1d0c7be140dca2480f76c8e5446"}, - {file = "griffe-0.44.0.tar.gz", hash = "sha256:34aee1571042f9bf00529bc715de4516fb6f482b164e90d030300601009e0223"}, + {file = "griffe-0.45.2-py3-none-any.whl", hash = "sha256:297ec8530d0c68e5b98ff86fb588ebc3aa3559bb5dc21f3caea8d9542a350133"}, + {file = "griffe-0.45.2.tar.gz", hash = "sha256:83ce7dcaafd8cb7f43cbf1a455155015a1eb624b1ffd93249e5e1c4a22b2fdb2"}, ] [package.dependencies] astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "idna" version = "3.7" @@ -1436,22 +1571,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "4.13.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "importlib-resources" @@ -1561,6 +1696,21 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] +[[package]] +name = "jdiff" +version = "0.0.6" +description = "A light-weight library to compare structured output from network devices show commands." +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "jdiff-0.0.6-py3-none-any.whl", hash = "sha256:346798820be11ae2485ce2a29eb9a9cc0ddaa23388319566d367be18730cbaa8"}, + {file = "jdiff-0.0.6.tar.gz", hash = "sha256:b42d26947d24fe7c297c8e3d38709b6e78823a41dcf50417d6be916d7d49be45"}, +] + +[package.dependencies] +deepdiff = ">=5.5.0,<7.0" +jmespath = ">=1.0.1,<2.0.0" + [[package]] name = "jedi" version = "0.19.1" @@ -1582,13 +1732,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -1597,15 +1747,26 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + [[package]] name = "jsonschema" -version = "4.21.1" +version = "4.22.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, - {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, ] [package.dependencies] @@ -1694,166 +1855,149 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "lxml" -version = "5.2.1" +version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ - {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1"}, - {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a"}, - {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01"}, - {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1"}, - {file = "lxml-5.2.1-cp310-cp310-win32.whl", hash = "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5"}, - {file = "lxml-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f"}, - {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867"}, - {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a"}, - {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f"}, - {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534"}, - {file = "lxml-5.2.1-cp311-cp311-win32.whl", hash = "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be"}, - {file = "lxml-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102"}, - {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851"}, - {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0"}, - {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169"}, - {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4"}, - {file = "lxml-5.2.1-cp312-cp312-win32.whl", hash = "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134"}, - {file = "lxml-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a"}, - {file = "lxml-5.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863"}, - {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62"}, - {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461"}, - {file = "lxml-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0"}, - {file = "lxml-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289"}, - {file = "lxml-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0"}, - {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75"}, - {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, - {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, - {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, - {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5"}, - {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533"}, - {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c"}, - {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637"}, - {file = "lxml-5.2.1-cp38-cp38-win32.whl", hash = "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da"}, - {file = "lxml-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806"}, - {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd"}, - {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b"}, - {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c"}, - {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188"}, - {file = "lxml-5.2.1-cp39-cp39-win32.whl", hash = "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708"}, - {file = "lxml-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e"}, - {file = "lxml-5.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96"}, - {file = "lxml-5.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85"}, - {file = "lxml-5.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246"}, - {file = "lxml-5.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704"}, - {file = "lxml-5.2.1.tar.gz", hash = "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, ] [package.extras] @@ -2198,13 +2342,13 @@ typing-extensions = ">=4.3.0" [[package]] name = "nautobot" -version = "2.2.2" +version = "2.2.5" description = "Source of truth and network automation platform." optional = false python-versions = "<3.12,>=3.8" files = [ - {file = "nautobot-2.2.2-py3-none-any.whl", hash = "sha256:4a77b13d60f004815007d519f29602bba5b9ff899d235bb055a64ce9b6f461ce"}, - {file = "nautobot-2.2.2.tar.gz", hash = "sha256:502fd0bf8691900b1c86c307e8bb3765990890a02e656c4af8e0b9cc3b7cc6f4"}, + {file = "nautobot-2.2.5-py3-none-any.whl", hash = "sha256:8b4256cb5f76b13d56c754b8a04e2869bc78d6a6593b2e7aae8094073320cb49"}, + {file = "nautobot-2.2.5.tar.gz", hash = "sha256:0b0ac6aae922092dad271feccfef3efe1e1482284b23d0acbdb0c61f78227b57"}, ] [package.dependencies] @@ -2235,7 +2379,7 @@ emoji = ">=2.11.0,<2.12.0" GitPython = ">=3.1.43,<3.2.0" graphene-django = ">=2.16.0,<2.17.0" graphene-django-optimizer = ">=0.8.0,<0.9.0" -Jinja2 = ">=3.1.3,<3.2.0" +Jinja2 = ">=3.1.4,<3.2.0" jsonschema = ">=4.7.0,<5.0.0" Markdown = ">=3.5.2,<3.6.0" MarkupSafe = ">=2.1.5,<2.2.0" @@ -2249,16 +2393,79 @@ psycopg2-binary = ">=2.9.9,<2.10.0" python-slugify = ">=8.0.3,<8.1.0" pyuwsgi = ">=2.0.23,<2.1.0" PyYAML = ">=6.0,<6.1" -social-auth-app-django = ">=5.4.0,<5.5.0" +social-auth-app-django = ">=5.4.1,<5.5.0" svgwrite = ">=1.4.2,<1.5.0" [package.extras] -all = ["django-auth-ldap (>=4.7.0,<4.8.0)", "django-storages (>=1.14.2,<1.15.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[openidconnect,saml] (>=4.5.3,<4.6.0)"] +all = ["django-auth-ldap (>=4.7.0,<4.8.0)", "django-storages (>=1.14.2,<1.15.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[saml] (>=4.5.3,<4.6.0)"] ldap = ["django-auth-ldap (>=4.7.0,<4.8.0)"] mysql = ["mysqlclient (>=2.2.3,<2.3.0)"] napalm = ["napalm (>=4.1.0,<4.2.0)"] remote-storage = ["django-storages (>=1.14.2,<1.15.0)"] -sso = ["social-auth-core[openidconnect,saml] (>=4.5.3,<4.6.0)"] +sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] + +[[package]] +name = "nautobot-plugin-nornir" +version = "2.0.1" +description = "Nautobot Nornir plugin." +optional = false +python-versions = ">=3.8,<3.12" +files = [ + {file = "nautobot_plugin_nornir-2.0.1-py3-none-any.whl", hash = "sha256:a74eb904d99df599c78f47ad05075677defe0b13c79e8a60ebd51d063815dc93"}, + {file = "nautobot_plugin_nornir-2.0.1.tar.gz", hash = "sha256:4893d5cb601a760620a6991de8822cf424f2964fefee360cd8e8b86b56fddbb7"}, +] + +[package.dependencies] +nautobot = ">=2.0.0,<3.0.0" +netutils = ">=1.6.0" +nornir-nautobot = ">=3.0.0,<4.0.0" + +[[package]] +name = "nautobot-secrets-providers" +version = "2.0.1" +description = "Nautobot Secrets Providers App" +optional = false +python-versions = ">=3.8,<3.12" +files = [ + {file = "nautobot_secrets_providers-2.0.1-py3-none-any.whl", hash = "sha256:67d671fccf1fbe4c62e4771ec17306ac4531b1ada65b0359390a762378661bfc"}, + {file = "nautobot_secrets_providers-2.0.1.tar.gz", hash = "sha256:f3bb1a2986dc4c9b5b40a5756d4025a9cffdcb4f0e7a6214ee610a3e527f789b"}, +] + +[package.extras] +all = ["boto3 (>=1.19.5,<1.20.0)", "hvac (>=0.11.0,<1.1.0)", "python-tss-sdk (>=1.2.0,<1.3.0)"] +aws = ["boto3 (>=1.19.5,<1.20.0)"] +hashicorp = ["hvac (>=0.11.0,<1.1.0)"] +nautobot = ["nautobot (>=2.0.0,<3.0.0)"] +thycotic = ["python-tss-sdk (>=1.2.0,<1.3.0)"] + +[[package]] +name = "nautobot-ssot" +version = "2.6.1" +description = "Nautobot Single Source of Truth" +optional = false +python-versions = "<3.12,>=3.8" +files = [ + {file = "nautobot_ssot-2.6.1-py3-none-any.whl", hash = "sha256:6368980a09ac27e7e21f0e80de0b0cae0e70a2ecf4d2340eb9250907167e8864"}, + {file = "nautobot_ssot-2.6.1.tar.gz", hash = "sha256:88f1e0387a7668636ffca3c59ff2f828b7676bfa54301b9834f34a45084e884b"}, +] + +[package.dependencies] +diffsync = ">=1.6.0,<2.0.0" +Markdown = "!=3.3.5" +nautobot = ">=2.1.0,<3.0.0" +packaging = ">=21.3,<24" +prometheus-client = ">=0.17.1" + +[package.extras] +aci = ["PyYAML (>=6)"] +all = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)", "dnspython (>=2.1.0,<3.0.0)", "ijson (>=2.5.1)", "ipfabric (>=6.0.9,<6.1.0)", "ipfabric-diagrams (>=6.0.2,<6.1.0)", "nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)", "netutils (>=1.0.0,<2.0.0)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] +aristacv = ["cloudvision (>=1.9.0,<2.0.0)", "cvprac (>=1.2.2,<2.0.0)"] +device42 = ["requests (>=2.21.0)"] +infoblox = ["dnspython (>=2.1.0,<3.0.0)"] +ipfabric = ["httpx (>=0.23.3)", "ipfabric (>=6.0.9,<6.1.0)", "ipfabric-diagrams (>=6.0.2,<6.1.0)", "netutils (>=1.0.0,<2.0.0)"] +nautobot-device-lifecycle-mgmt = ["nautobot-device-lifecycle-mgmt (>=2.0.0,<3.0.0)"] +pysnow = ["ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] +servicenow = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "ijson (>=2.5.1)", "oauthlib (>=3.1.0)", "python-magic (>=0.4.15)", "pytz (>=2019.3)", "requests (>=2.21.0)", "requests-oauthlib (>=1.3.0)", "six (>=1.13.0)"] [[package]] name = "ncclient" @@ -2345,15 +2552,115 @@ files = [ {file = "nh3-0.2.17.tar.gz", hash = "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028"}, ] +[[package]] +name = "nornir" +version = "3.4.1" +description = "Pluggable multi-threaded framework with inventory management to help operate collections of devices" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "nornir-3.4.1-py3-none-any.whl", hash = "sha256:db079cb95e3baf855530f4f40cb6ee93f93e1bf3cb74ac08180546adb1b987b8"}, + {file = "nornir-3.4.1.tar.gz", hash = "sha256:82a90a3478a3890bef8ad51b256fa966e6e4ca326cbe20a230918ef907cf68c3"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4,<5", markers = "python_version < \"3.10\""} +mypy_extensions = ">=1.0.0,<2.0.0" +"ruamel.yaml" = ">=0.17" + +[[package]] +name = "nornir-jinja2" +version = "0.2.0" +description = "Jinja2 plugins for nornir" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "nornir_jinja2-0.2.0-py3-none-any.whl", hash = "sha256:0c446bec7a8492923d4eb9ca00fb327603b41bc35d5f0112843c048737b506b1"}, + {file = "nornir_jinja2-0.2.0.tar.gz", hash = "sha256:9ee5e725fe5543dcba4ec8b976804e9e88ecd356ea3b62bad97578cea0de1f75"}, +] + +[package.dependencies] +jinja2 = ">=2.11.2,<4" +nornir = ">=3,<4" + +[[package]] +name = "nornir-napalm" +version = "0.4.0" +description = "NAPALM's plugins for nornir" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "nornir_napalm-0.4.0-py3-none-any.whl", hash = "sha256:20a41499aecf9c4e41181b18a73b2ee3ab7763824645ac0eb80abb3973a5f17e"}, + {file = "nornir_napalm-0.4.0.tar.gz", hash = "sha256:84e0711ccbdf24bdb228042ab530bf688d6b2b8f12c65fa3cb73499c6974a9de"}, +] + +[package.dependencies] +napalm = ">=4,<5" +nornir = ">=3,<4" + +[[package]] +name = "nornir-nautobot" +version = "3.2.0" +description = "Nornir Nautobot" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "nornir_nautobot-3.2.0-py3-none-any.whl", hash = "sha256:ed0ac258eebd2e3072f1d7a0c1f964965e7c9bf8c744290bb5ea04d5800b0ef4"}, + {file = "nornir_nautobot-3.2.0.tar.gz", hash = "sha256:087ad3f6b37112e2a4ff4be64a3b5bfbddfae22057c182e57fae7084850d3d63"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<=0.27.0" +netutils = ">=1.6.0,<2.0.0" +nornir = ">=3.0.0,<4.0.0" +nornir-jinja2 = ">=0.2.0,<0.3.0" +nornir-napalm = ">=0.4.0,<1.0.0" +nornir-netmiko = ">=1,<2" +nornir-utils = ">=0,<1" +pynautobot = ">=2.0.2" +requests = ">=2.25.1,<3.0.0" + +[package.extras] +mikrotik-driver = ["routeros-api (>=0.17.0,<0.18.0)"] + +[[package]] +name = "nornir-netmiko" +version = "1.0.1" +description = "Netmiko's plugins for Nornir" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "nornir_netmiko-1.0.1-py3-none-any.whl", hash = "sha256:eaee2944ad386b40c0719e8ac393ac63d531f44fb9a07d660bae7de430f12834"}, + {file = "nornir_netmiko-1.0.1.tar.gz", hash = "sha256:498546df001e0e499f10c5646d1356e361ccbb165b1335b89cfe8f19765e24d7"}, +] + +[package.dependencies] +netmiko = ">=4.0.0,<5.0.0" + +[[package]] +name = "nornir-utils" +version = "0.2.0" +description = "Collection of plugins and functions for nornir that don't require external dependencies" +optional = false +python-versions = ">=3.6.2,<4.0.0" +files = [ + {file = "nornir_utils-0.2.0-py3-none-any.whl", hash = "sha256:b4c430793a74f03affd5ff2d90abc8c67a28c7ff325f48e3a01a9a44ec71b844"}, + {file = "nornir_utils-0.2.0.tar.gz", hash = "sha256:4de6aaa35e5c1a98e1c84db84a008b0b1e974dc65d88484f2dcea3e30c95fbc2"}, +] + +[package.dependencies] +colorama = ">=0.4.3,<0.5.0" +nornir = ">=3,<4" + [[package]] name = "ntc-templates" -version = "5.0.0" +version = "5.1.0" description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable." optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "ntc_templates-5.0.0-py3-none-any.whl", hash = "sha256:4fc4e2e9b239bd5b25d3c256c301859eec9262c2d418e17a60ff023ecb6824a5"}, - {file = "ntc_templates-5.0.0.tar.gz", hash = "sha256:56919fbe83da582de03474f8a204d945dadeef0c98e630743c3c069a9bcf1120"}, + {file = "ntc_templates-5.1.0-py3-none-any.whl", hash = "sha256:8784bbf790a814789910c04148ee84726183228f173a118b80e0c7420290b4dd"}, + {file = "ntc_templates-5.1.0.tar.gz", hash = "sha256:820583f35a8d7411c86b70635a6acd65ce357b8bc19e1f408ce836eac30a6371"}, ] [package.dependencies] @@ -2375,15 +2682,29 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] + +[package.extras] +dev = ["black", "mypy", "pytest"] + [[package]] name = "packaging" -version = "24.0" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -2568,18 +2889,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "prometheus-client" @@ -2613,13 +2935,13 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.45" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.45-py3-none-any.whl", hash = "sha256:a29b89160e494e3ea8622b09fa5897610b437884dcdcd054fdc1308883326c2a"}, + {file = "prompt_toolkit-3.0.45.tar.gz", hash = "sha256:07c60ee4ab7b7e90824b61afa840c8f5aad2d46b3e2e10acc33d8ecc94a49089"}, ] [package.dependencies] @@ -2658,6 +2980,7 @@ files = [ {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, @@ -2666,6 +2989,8 @@ files = [ {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, @@ -2750,6 +3075,58 @@ files = [ {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] +[[package]] +name = "pydantic" +version = "1.10.15" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55"}, + {file = "pydantic-1.10.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0"}, + {file = "pydantic-1.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"}, + {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"}, + {file = "pydantic-1.10.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7"}, + {file = "pydantic-1.10.15-cp37-cp37m-win_amd64.whl", hash = "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b"}, + {file = "pydantic-1.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4"}, + {file = "pydantic-1.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7"}, + {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"}, + {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + [[package]] name = "pyeapi" version = "1.0.2" @@ -2780,17 +3157,16 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -2812,17 +3188,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "3.1.0" +version = "3.2.2" description = "python code static checker" optional = false python-versions = ">=3.8.0" files = [ - {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, - {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, + {file = "pylint-3.2.2-py3-none-any.whl", hash = "sha256:3f8788ab20bb8383e06dd2233e50f8e08949cfd9574804564803441a4946eab4"}, + {file = "pylint-3.2.2.tar.gz", hash = "sha256:d068ca1dfd735fb92a07d33cb8f288adc0f6bc1287a139ca2425366f7cbe38f8"}, ] [package.dependencies] -astroid = ">=3.1.0,<=3.2.0-dev0" +astroid = ">=3.2.2,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -2932,6 +3308,22 @@ cffi = ">=1.4.1" docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] +[[package]] +name = "pynautobot" +version = "2.1.1" +description = "Nautobot API client library" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pynautobot-2.1.1-py3-none-any.whl", hash = "sha256:bcf56fee4733942a87dd07f956418f67580f45d08e5296c8fa3d11316c4ca419"}, + {file = "pynautobot-2.1.1.tar.gz", hash = "sha256:f01907a519689dc842f909f850737f68b53953818c97380a8101406d37e49d1b"}, +] + +[package.dependencies] +packaging = ">=23.2,<24.0" +requests = ">=2.30.0,<3.0.0" +urllib3 = ">=1.21.1,<1.27" + [[package]] name = "pyparsing" version = "3.1.2" @@ -2962,13 +3354,12 @@ cp2110 = ["hidapi"] [[package]] name = "python-crontab" -version = "3.0.0" +version = "3.1.0" description = "Python Crontab API" optional = false python-versions = "*" files = [ - {file = "python-crontab-3.0.0.tar.gz", hash = "sha256:79fb7465039ddfd4fb93d072d6ee0d45c1ac8bf1597f0686ea14fd4361dba379"}, - {file = "python_crontab-3.0.0-py3-none-any.whl", hash = "sha256:6d5ba3c190ec76e4d252989a1644fcb233dbf53fbc8fceeb9febe1657b9fb1d4"}, + {file = "python-crontab-3.1.0.tar.gz", hash = "sha256:f4ea1605d24533b67fa7a634ef26cb59a5f2e7954f6e677d2d7a2229959a2fc8"}, ] [package.dependencies] @@ -3009,6 +3400,20 @@ text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] +[[package]] +name = "python-tss-sdk" +version = "1.2.2" +description = "The Delinea Secret Server Python SDK" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_tss_sdk-1.2.2-py3-none-any.whl", hash = "sha256:f69e5d9fba75b5835b9182402f8520294dd8e8abc4b4e0409080121bc06b5186"}, + {file = "python_tss_sdk-1.2.2.tar.gz", hash = "sha256:2620d0002d794d4407f85b7521d69d73f865f348238e43f61418754a6aeb520e"}, +] + +[package.dependencies] +requests = ">=2.12.5" + [[package]] name = "python3-openid" version = "3.2.0" @@ -3115,6 +3520,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3165,13 +3571,13 @@ pyyaml = "*" [[package]] name = "redis" -version = "5.0.3" +version = "5.0.4" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.3-py3-none-any.whl", hash = "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d"}, - {file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"}, + {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, + {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, ] [package.dependencies] @@ -3183,13 +3589,13 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "referencing" -version = "0.34.0" +version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.34.0-py3-none-any.whl", hash = "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4"}, - {file = "referencing-0.34.0.tar.gz", hash = "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844"}, + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, ] [package.dependencies] @@ -3198,115 +3604,101 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.4.16" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18"}, - {file = "regex-2024.4.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47"}, - {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af"}, - {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a"}, - {file = "regex-2024.4.16-cp310-cp310-win32.whl", hash = "sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0"}, - {file = "regex-2024.4.16-cp310-cp310-win_amd64.whl", hash = "sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd"}, - {file = "regex-2024.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89"}, - {file = "regex-2024.4.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d"}, - {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6"}, - {file = "regex-2024.4.16-cp311-cp311-win32.whl", hash = "sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d"}, - {file = "regex-2024.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec"}, - {file = "regex-2024.4.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70"}, - {file = "regex-2024.4.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81"}, - {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc"}, - {file = "regex-2024.4.16-cp312-cp312-win32.whl", hash = "sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b"}, - {file = "regex-2024.4.16-cp312-cp312-win_amd64.whl", hash = "sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9"}, - {file = "regex-2024.4.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682"}, - {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5"}, - {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a"}, - {file = "regex-2024.4.16-cp37-cp37m-win32.whl", hash = "sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46"}, - {file = "regex-2024.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4"}, - {file = "regex-2024.4.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d"}, - {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76"}, - {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9"}, - {file = "regex-2024.4.16-cp38-cp38-win32.whl", hash = "sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e"}, - {file = "regex-2024.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455"}, - {file = "regex-2024.4.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317"}, - {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c"}, - {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50"}, - {file = "regex-2024.4.16-cp39-cp39-win32.whl", hash = "sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335"}, - {file = "regex-2024.4.16-cp39-cp39-win_amd64.whl", hash = "sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483"}, - {file = "regex-2024.4.16.tar.gz", hash = "sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6"}, + {file = "regex-2024.5.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796"}, + {file = "regex-2024.5.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f"}, + {file = "regex-2024.5.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53"}, + {file = "regex-2024.5.15-cp310-cp310-win32.whl", hash = "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3"}, + {file = "regex-2024.5.15-cp310-cp310-win_amd64.whl", hash = "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656"}, + {file = "regex-2024.5.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f"}, + {file = "regex-2024.5.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d"}, + {file = "regex-2024.5.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68"}, + {file = "regex-2024.5.15-cp311-cp311-win32.whl", hash = "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa"}, + {file = "regex-2024.5.15-cp311-cp311-win_amd64.whl", hash = "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e"}, + {file = "regex-2024.5.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf"}, + {file = "regex-2024.5.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d"}, + {file = "regex-2024.5.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80"}, + {file = "regex-2024.5.15-cp312-cp312-win32.whl", hash = "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe"}, + {file = "regex-2024.5.15-cp312-cp312-win_amd64.whl", hash = "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850"}, + {file = "regex-2024.5.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa"}, + {file = "regex-2024.5.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67"}, + {file = "regex-2024.5.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741"}, + {file = "regex-2024.5.15-cp38-cp38-win32.whl", hash = "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9"}, + {file = "regex-2024.5.15-cp38-cp38-win_amd64.whl", hash = "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1"}, + {file = "regex-2024.5.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c"}, + {file = "regex-2024.5.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d"}, + {file = "regex-2024.5.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456"}, + {file = "regex-2024.5.15-cp39-cp39-win32.whl", hash = "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694"}, + {file = "regex-2024.5.15-cp39-cp39-win_amd64.whl", hash = "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388"}, + {file = "regex-2024.5.15.tar.gz", hash = "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -3358,136 +3750,213 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.0" +version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, - {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, - {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, - {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, - {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, - {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, - {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, - {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, - {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, - {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, - {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, - {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, - {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, - {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, - {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, - {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e"}, - {file = "rpds_py-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d"}, - {file = "rpds_py-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c"}, - {file = "rpds_py-0.18.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594"}, - {file = "rpds_py-0.18.0-cp38-none-win32.whl", hash = "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e"}, - {file = "rpds_py-0.18.0-cp38-none-win_amd64.whl", hash = "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, - {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, - {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, - {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, - {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, - {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, - {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, - {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, - {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, - {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "ruamel-yaml" +version = "0.18.6" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"}, + {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, ] [[package]] name = "ruff" -version = "0.4.1" +version = "0.4.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2d9ef6231e3fbdc0b8c72404a1a0c46fd0dcea84efca83beb4681c318ea6a953"}, - {file = "ruff-0.4.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9485f54a7189e6f7433e0058cf8581bee45c31a25cd69009d2a040d1bd4bfaef"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2921ac03ce1383e360e8a95442ffb0d757a6a7ddd9a5be68561a671e0e5807e"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eec8d185fe193ad053eda3a6be23069e0c8ba8c5d20bc5ace6e3b9e37d246d3f"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa27d9d72a94574d250f42b7640b3bd2edc4c58ac8ac2778a8c82374bb27984"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f1ee41580bff1a651339eb3337c20c12f4037f6110a36ae4a2d864c52e5ef954"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0926cefb57fc5fced629603fbd1a23d458b25418681d96823992ba975f050c2b"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6e37f2e3cd74496a74af9a4fa67b547ab3ca137688c484749189bf3a686ceb"}, - {file = "ruff-0.4.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd703a5975ac1998c2cc5e9494e13b28f31e66c616b0a76e206de2562e0843c"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b92f03b4aa9fa23e1799b40f15f8b95cdc418782a567d6c43def65e1bbb7f1cf"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1c859f294f8633889e7d77de228b203eb0e9a03071b72b5989d89a0cf98ee262"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b34510141e393519a47f2d7b8216fec747ea1f2c81e85f076e9f2910588d4b64"}, - {file = "ruff-0.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6e68d248ed688b9d69fd4d18737edcbb79c98b251bba5a2b031ce2470224bdf9"}, - {file = "ruff-0.4.1-py3-none-win32.whl", hash = "sha256:b90506f3d6d1f41f43f9b7b5ff845aeefabed6d2494307bc7b178360a8805252"}, - {file = "ruff-0.4.1-py3-none-win_amd64.whl", hash = "sha256:c7d391e5936af5c9e252743d767c564670dc3889aff460d35c518ee76e4b26d7"}, - {file = "ruff-0.4.1-py3-none-win_arm64.whl", hash = "sha256:a1eaf03d87e6a7cd5e661d36d8c6e874693cb9bc3049d110bc9a97b350680c43"}, - {file = "ruff-0.4.1.tar.gz", hash = "sha256:d592116cdbb65f8b1b7e2a2b48297eb865f6bdc20641879aa9d7b9c11d86db79"}, + {file = "ruff-0.4.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ef995583a038cd4a7edf1422c9e19118e2511b8ba0b015861b4abd26ec5367c5"}, + {file = "ruff-0.4.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:602ebd7ad909eab6e7da65d3c091547781bb06f5f826974a53dbe563d357e53c"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f9ced5cbb7510fd7525448eeb204e0a22cabb6e99a3cb160272262817d49786"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04a80acfc862e0e1630c8b738e70dcca03f350bad9e106968a8108379e12b31f"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be47700ecb004dfa3fd4dcdddf7322d4e632de3c06cd05329d69c45c0280e618"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1ff930d6e05f444090a0139e4e13e1e2e1f02bd51bb4547734823c760c621e79"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f13410aabd3b5776f9c5699f42b37a3a348d65498c4310589bc6e5c548dc8a2f"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cf5cc02d3ae52dfb0c8a946eb7a1d6ffe4d91846ffc8ce388baa8f627e3bd50"}, + {file = "ruff-0.4.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea3424793c29906407e3cf417f28fc33f689dacbbadfb52b7e9a809dd535dcef"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1fa8561489fadf483ffbb091ea94b9c39a00ed63efacd426aae2f197a45e67fc"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4d5b914818d8047270308fe3e85d9d7f4a31ec86c6475c9f418fbd1624d198e0"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4f02284335c766678778475e7698b7ab83abaf2f9ff0554a07b6f28df3b5c259"}, + {file = "ruff-0.4.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3a6a0a4f4b5f54fff7c860010ab3dd81425445e37d35701a965c0248819dde7a"}, + {file = "ruff-0.4.6-py3-none-win32.whl", hash = "sha256:9018bf59b3aa8ad4fba2b1dc0299a6e4e60a4c3bc62bbeaea222679865453062"}, + {file = "ruff-0.4.6-py3-none-win_amd64.whl", hash = "sha256:a769ae07ac74ff1a019d6bd529426427c3e30d75bdf1e08bb3d46ac8f417326a"}, + {file = "ruff-0.4.6-py3-none-win_arm64.whl", hash = "sha256:735a16407a1a8f58e4c5b913ad6102722e80b562dd17acb88887685ff6f20cf6"}, + {file = "ruff-0.4.6.tar.gz", hash = "sha256:a797a87da50603f71e6d0765282098245aca6e3b94b7c17473115167d8dfb0b7"}, ] [[package]] @@ -3502,13 +3971,13 @@ files = [ [[package]] name = "scp" -version = "0.14.5" +version = "0.15.0" description = "scp module for paramiko" optional = false python-versions = "*" files = [ - {file = "scp-0.14.5-py2.py3-none-any.whl", hash = "sha256:d224535dd8ed00294f52b0e0e18fde7a6fb7a3d06b97ede9e3f750fa7bf75c09"}, - {file = "scp-0.14.5.tar.gz", hash = "sha256:64f0015899b3d212cb8088e7d40ebaf0686889ff0e243d5c1242efe8b50f053e"}, + {file = "scp-0.15.0-py2.py3-none-any.whl", hash = "sha256:9e7f721e5ac563c33eb0831d0f949c6342f1c28c3bdc3b02f39d77b5ea20df7e"}, + {file = "scp-0.15.0.tar.gz", hash = "sha256:f1b22e9932123ccf17eebf19e0953c6e9148f589f93d91b872941a696305c83f"}, ] [package.dependencies] @@ -3516,19 +3985,18 @@ paramiko = "*" [[package]] name = "setuptools" -version = "69.5.1" +version = "70.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, - {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, + {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, + {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "singledispatch" @@ -3567,15 +4035,26 @@ files = [ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "social-auth-app-django" -version = "5.4.0" +version = "5.4.1" description = "Python Social Authentication, Django integration." optional = false python-versions = ">=3.8" files = [ - {file = "social-auth-app-django-5.4.0.tar.gz", hash = "sha256:09ac02a063cb313eed5e9ef2f9ac4477c8bf5bbd685925ff3aba43f9072f1bbb"}, - {file = "social_auth_app_django-5.4.0-py3-none-any.whl", hash = "sha256:28c65b2e2092f30cdb3cf912eeaa6988b49fdf4001b29bd89e683673d700a38e"}, + {file = "social-auth-app-django-5.4.1.tar.gz", hash = "sha256:2a43cde559dd34fdc7132417b6c52c780fa99ec2332dee9f405b4763f371c367"}, + {file = "social_auth_app_django-5.4.1-py3-none-any.whl", hash = "sha256:7519f186c63c50f2d364457b236f051338d194bcface55e318a6a705c5213477"}, ] [package.dependencies] @@ -3584,13 +4063,13 @@ social-auth-core = ">=4.4.1" [[package]] name = "social-auth-core" -version = "4.5.3" +version = "4.5.4" description = "Python social authentication made simple." optional = false python-versions = ">=3.8" files = [ - {file = "social-auth-core-4.5.3.tar.gz", hash = "sha256:9d9b51b7ce2ccd0b7139e6b7f52a32cb922726de819fb13babe35f12ae89852a"}, - {file = "social_auth_core-4.5.3-py3-none-any.whl", hash = "sha256:8d16e66eb97bb7be43a023d6efa16628cdc94cefd8d8053930c98a0f676867e7"}, + {file = "social-auth-core-4.5.4.tar.gz", hash = "sha256:d3dbeb0999ffd0e68aa4bd73f2ac698a18133fd11b3fc890e1366f18c8889fac"}, + {file = "social_auth_core-4.5.4-py3-none-any.whl", hash = "sha256:33cf970a623c442376f9d4a86fb187579e4438649daa5b5be993d05e74d7b2db"}, ] [package.dependencies] @@ -3656,6 +4135,23 @@ files = [ [package.dependencies] pbr = ">=2.0.0,<2.1.0 || >2.1.0" +[[package]] +name = "structlog" +version = "22.3.0" +description = "Structured Logging for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "structlog-22.3.0-py3-none-any.whl", hash = "sha256:b403f344f902b220648fa9f286a23c0cc5439a5844d271fec40562dbadbc70ad"}, + {file = "structlog-22.3.0.tar.gz", hash = "sha256:e7509391f215e4afb88b1b80fa3ea074be57a5a17d794bd436a5c949da023333"}, +] + +[package.extras] +dev = ["structlog[docs,tests,typing]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] +tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy", "rich", "twisted"] + [[package]] name = "svgwrite" version = "1.4.3" @@ -3693,20 +4189,6 @@ files = [ future = "*" six = "*" -[[package]] -name = "to-json-schema" -version = "1.0.1" -description = "" -optional = false -python-versions = "*" -files = [ - {file = "to_json_schema-1.0.1-py3-none-any.whl", hash = "sha256:5708663f1c81815e4ff01fce910ac32ee3964d0c6b3587fd4fff2e38d5c9aa7b"}, - {file = "to_json_schema-1.0.1.tar.gz", hash = "sha256:ec747bd5129256dd571105f66a7bc9a4546228cd5e5fbf5e06dc9776e255400e"}, -] - -[package.extras] -testing = ["pytest", "pytest-cov", "setuptools"] - [[package]] name = "toml" version = "0.10.2" @@ -3731,13 +4213,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.4" +version = "0.12.5" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, - {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, ] [[package]] @@ -3779,13 +4261,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "transitions" -version = "0.9.0" +version = "0.9.1" description = "A lightweight, object-oriented Python state machine implementation with many extensions." optional = false python-versions = "*" files = [ - {file = "transitions-0.9.0-py2.py3-none-any.whl", hash = "sha256:5687ee8c6a3200830e44f988d16b0045f53293f7a873002d7bff70852331a078"}, - {file = "transitions-0.9.0.tar.gz", hash = "sha256:2f54d11bdb225779d7e729011e93a9fb717668ce3dc65f8d4f5a5d7ba2f48e10"}, + {file = "transitions-0.9.1-py2.py3-none-any.whl", hash = "sha256:e76ad7bf44d46bd03bc50f269cebfa5affef28534c92b87b43e60b03d8925864"}, + {file = "transitions-0.9.1.tar.gz", hash = "sha256:3542c37108e93e2ae5f215208ec5732c94a772937854a102cd7345b967fee61b"}, ] [package.dependencies] @@ -3829,13 +4311,13 @@ docs = ["mkdocs (==1.2.4)", "mkdocs-material (==7.2.2)", "mkdocs-material-extens [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, + {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, ] [[package]] @@ -3862,20 +4344,19 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "1.26.18" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, + {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "vine" @@ -3890,40 +4371,43 @@ files = [ [[package]] name = "watchdog" -version = "4.0.0" +version = "4.0.1" description = "Filesystem events monitoring" optional = false python-versions = ">=3.8" files = [ - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, - {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, - {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, - {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, - {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, - {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, - {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, - {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, - {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, - {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, - {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, - {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, - {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, - {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da2dfdaa8006eb6a71051795856bedd97e5b03e57da96f98e375682c48850645"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e93f451f2dfa433d97765ca2634628b789b49ba8b504fdde5837cdcf25fdb53b"}, + {file = "watchdog-4.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef0107bbb6a55f5be727cfc2ef945d5676b97bffb8425650dadbb184be9f9a2b"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17e32f147d8bf9657e0922c0940bcde863b894cd871dbb694beb6704cfbd2fb5"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03e70d2df2258fb6cb0e95bbdbe06c16e608af94a3ffbd2b90c3f1e83eb10767"}, + {file = "watchdog-4.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123587af84260c991dc5f62a6e7ef3d1c57dfddc99faacee508c71d287248459"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:093b23e6906a8b97051191a4a0c73a77ecc958121d42346274c6af6520dec175"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:611be3904f9843f0529c35a3ff3fd617449463cb4b73b1633950b3d97fa4bfb7"}, + {file = "watchdog-4.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62c613ad689ddcb11707f030e722fa929f322ef7e4f18f5335d2b73c61a85c28"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d4925e4bf7b9bddd1c3de13c9b8a2cdb89a468f640e66fbfabaf735bd85b3e35"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cad0bbd66cd59fc474b4a4376bc5ac3fc698723510cbb64091c2a793b18654db"}, + {file = "watchdog-4.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a3c2c317a8fb53e5b3d25790553796105501a235343f5d2bf23bb8649c2c8709"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9904904b6564d4ee8a1ed820db76185a3c96e05560c776c79a6ce5ab71888ba"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:667f3c579e813fcbad1b784db7a1aaa96524bed53437e119f6a2f5de4db04235"}, + {file = "watchdog-4.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d10a681c9a1d5a77e75c48a3b8e1a9f2ae2928eda463e8d33660437705659682"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0144c0ea9997b92615af1d94afc0c217e07ce2c14912c7b1a5731776329fcfc7"}, + {file = "watchdog-4.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:998d2be6976a0ee3a81fb8e2777900c28641fb5bfbd0c84717d89bca0addcdc5"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7921319fe4430b11278d924ef66d4daa469fafb1da679a2e48c935fa27af193"}, + {file = "watchdog-4.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f0de0f284248ab40188f23380b03b59126d1479cd59940f2a34f8852db710625"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bca36be5707e81b9e6ce3208d92d95540d4ca244c006b61511753583c81c70dd"}, + {file = "watchdog-4.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ab998f567ebdf6b1da7dc1e5accfaa7c6992244629c0fdaef062f43249bd8dee"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dddba7ca1c807045323b6af4ff80f5ddc4d654c8bce8317dde1bd96b128ed253"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:4513ec234c68b14d4161440e07f995f231be21a09329051e67a2118a7a612d2d"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_i686.whl", hash = "sha256:4107ac5ab936a63952dea2a46a734a23230aa2f6f9db1291bf171dac3ebd53c6"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:6e8c70d2cd745daec2a08734d9f63092b793ad97612470a0ee4cbb8f5f705c57"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f27279d060e2ab24c0aa98363ff906d2386aa6c4dc2f1a374655d4e02a6c5e5e"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:f8affdf3c0f0466e69f5b3917cdd042f89c8c63aebdb9f7c078996f607cdb0f5"}, + {file = "watchdog-4.0.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ac7041b385f04c047fcc2951dc001671dee1b7e0615cde772e84b01fbf68ee84"}, + {file = "watchdog-4.0.1-py3-none-win32.whl", hash = "sha256:206afc3d964f9a233e6ad34618ec60b9837d0582b500b63687e34011e15bb429"}, + {file = "watchdog-4.0.1-py3-none-win_amd64.whl", hash = "sha256:7577b3c43e5909623149f76b099ac49a1a01ca4e167d1785c76eb52fa585745a"}, + {file = "watchdog-4.0.1-py3-none-win_ia64.whl", hash = "sha256:d7b9f5f3299e8dd230880b6c55504a1f69cf1e4316275d1b215ebdd8187ec88d"}, + {file = "watchdog-4.0.1.tar.gz", hash = "sha256:eebaacf674fa25511e8867028d281e602ee6500045b57f43b08778082f7f8b44"}, ] [package.extras] @@ -3988,18 +4472,18 @@ pyyaml = "*" [[package]] name = "zipp" -version = "3.18.1" +version = "3.19.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, - {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, + {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, + {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] all = [] @@ -4007,4 +4491,4 @@ all = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "ce0f0408b0e472c07f04abbe7ff402f9375ac8e3d977ace61e57f1742f9e0a3b" +content-hash = "1f7f6cc8e9da5151921c1c1374c16084b12b731aead2a6cc40744028e4689d49" diff --git a/pyproject.toml b/pyproject.toml old mode 100644 new mode 100755 index c4f5f6ee..ec219787 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,12 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "3.0.1" +version = "4.0.0b1" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" readme = "README.md" homepage = "https://github.com/nautobot/nautobot-app-device-onboarding" repository = "https://github.com/nautobot/nautobot-app-device-onboarding" -documentation = "https://docs.nautobot.com/projects/device-onboarding/en/latest/" keywords = ["nautobot", "nautobot-app", "nautobot-plugin"] classifiers = [ "Intended Audience :: Developers", @@ -30,7 +29,13 @@ include = [ python = ">=3.8,<3.12" napalm = ">=2.5.0, <5" zipp = "^3.4.0" -nautobot = "^2.0.3" +nautobot = "^2.2.3" +nautobot-ssot = "^2.6.0" +nautobot-plugin-nornir = "^2.0.0" +jdiff = "^0.0.6" +ntc-templates = "^5.1.0" +nautobot-secrets-providers = "^2.0.1" +python-tss-sdk = "*" [tool.poetry.group.dev.dependencies] bandit = "*" @@ -57,8 +62,6 @@ mkdocs-version-annotations = "1.0.0" mkdocstrings = "0.22.0" mkdocstrings-python = "1.5.2" towncrier = "~23.6.0" -to-json-schema = "*" -jsonschema = "*" [tool.poetry.extras] all = [ @@ -87,6 +90,9 @@ exclude = ''' ) ''' +[tool.coverage.report] +show_missing = true + [tool.pylint.master] # Include the pylint_django plugin to avoid spurious warnings about Django patterns load-plugins="pylint_django, pylint_nautobot" @@ -100,10 +106,20 @@ no-docstring-rgx="^(_|test_|Meta$)" # Line length is enforced by Black, so pylint doesn't need to check it. # Pylint and Black disagree about how to format multi-line arrays; Black wins. disable = """, + arguments-differ, line-too-long, duplicate-code, - too-many-lines, + logging-fstring-interpolation, + too-few-public-methods, too-many-ancestors, + too-many-arguments, + too-many-branches, + too-many-lines, + too-many-locals, + too-many-public-methods, + too-many-statements, + unused-argument, + unused-import, """ [tool.pylint.miscellaneous] @@ -160,7 +176,7 @@ requires = ["poetry_core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.towncrier] -package = "nautobot_device_onboarding" +package = "nautobot" directory = "changes" filename = "docs/admin/release_notes/version_X.Y.md" template = "development/towncrier_template.j2" diff --git a/tasks.py b/tasks.py index 3d188312..4d592625 100644 --- a/tasks.py +++ b/tasks.py @@ -48,8 +48,8 @@ def is_truthy(arg): namespace.configure( { "nautobot_device_onboarding": { - "nautobot_ver": "2.2.2", - "project_name": "nautobot-device-onboarding", + "nautobot_ver": "2.2.3", + "project_name": "nautobot-device-onboarding-2", "python_ver": "3.11", "local": False, "compose_dir": os.path.join(os.path.dirname(__file__), "development"), @@ -149,27 +149,15 @@ def docker_compose(context, command, **kwargs): def run_command(context, command, **kwargs): """Wrapper to run a command locally or inside the nautobot container.""" if is_truthy(context.nautobot_device_onboarding.local): - if "command_env" in kwargs: - kwargs["env"] = { - **kwargs.get("env", {}), - **kwargs.pop("command_env"), - } context.run(command, **kwargs) else: # Check if nautobot is running, no need to start another nautobot container to run a command docker_compose_status = "ps --services --filter status=running" results = docker_compose(context, docker_compose_status, hide="out") if "nautobot" in results.stdout: - compose_command = "exec" + compose_command = f"exec nautobot {command}" else: - compose_command = "run --rm --entrypoint=''" - - if "command_env" in kwargs: - command_env = kwargs.pop("command_env") - for key, value in command_env.items(): - compose_command += f' --env="{key}={value}"' - - compose_command += f" -- nautobot {command}" + compose_command = f"run --rm --entrypoint '{command}' nautobot" pty = kwargs.pop("pty", True) @@ -339,22 +327,15 @@ def logs(context, service="", follow=False, tail=0): # ------------------------------------------------------------------------------ # ACTIONS # ------------------------------------------------------------------------------ -@task( - help={ - "file": "Python file to execute", - "env": "Environment variables to pass to the command", - "plain": "Flag to run nbshell in plain mode (default: False)", - }, -) -def nbshell(context, file="", env={}, plain=False): +@task(help={"file": "Python file to execute"}) +def nbshell(context, file=""): """Launch an interactive nbshell session.""" command = [ "nautobot-server", "nbshell", - "--plain" if plain else "", f"< '{file}'" if file else "", ] - run_command(context, " ".join(command), pty=not bool(file), command_env=env) + run_command(context, " ".join(command), pty=not bool(file)) @task @@ -693,7 +674,7 @@ def pylint(context): def autoformat(context): """Run code autoformatting.""" black(context, autoformat=True) - ruff(context, fix=True) + ruff(context, action="both", fix=True) @task( @@ -784,7 +765,9 @@ def unittest( @task def unittest_coverage(context): """Report on code test coverage as measured by 'invoke unittest'.""" - command = "coverage report --skip-covered --include 'nautobot_device_onboarding/*' --omit *migrations*" + command = ( + "coverage report --skip-covered --include 'nautobot_device_onboarding/*' --omit '*/migrations/*','*/tests/*'" + ) run_command(context, command) @@ -821,33 +804,8 @@ def tests(context, failfast=False, keepdb=False, lint_only=False): pylint(context) print("Running mkdocs...") build_and_check_docs(context) - print("Checking app config schema...") - validate_app_config(context) if not lint_only: print("Running unit tests...") unittest(context, failfast=failfast, keepdb=keepdb) unittest_coverage(context) print("All tests have passed!") - - -@task -def generate_app_config_schema(context): - """Generate the app config schema from the current app config. - - WARNING: Review and edit the generated file before committing. - - Its content is inferred from: - - - The current configuration in `PLUGINS_CONFIG` - - `NautobotAppConfig.default_settings` - - `NautobotAppConfig.required_settings` - """ - start(context, service="nautobot") - nbshell(context, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "generate"}) - - -@task -def validate_app_config(context): - """Validate the app config based on the app config schema.""" - start(context, service="nautobot") - nbshell(context, plain=True, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "validate"}) From 3823ee09d1abd54bc027cfca81519432d76373a5 Mon Sep 17 00:00:00 2001 From: David Cates Date: Thu, 6 Jun 2024 14:10:51 -0600 Subject: [PATCH 03/81] SSoT Logic for Onboarding 4.0 contributions Co-Authored-By: David Cates <57967713+Dav-C@users.noreply.github.com> --- .../diffsync/__init__.py | 1 + .../diffsync/adapters/__init__.py | 1 + .../adapters/sync_devices_adapters.py | 395 +++++++++++ .../adapters/sync_network_data_adapters.py | 658 ++++++++++++++++++ .../diffsync/models/sync_devices_models.py | 387 ++++++++++ .../models/sync_network_data_models.py | 566 +++++++++++++++ .../migrations/0001_initial.py | 5 +- .../0001_squash__0001_0004_0005_0006.py | 2 +- .../0004_migrate_to_extras_role_part_1.py | 1 - nautobot_device_onboarding/nautobot_keeper.py | 11 +- nautobot_device_onboarding/netdev_keeper.py | 11 +- .../onboarding/onboarding.py | 4 +- .../tests/fixtures/onboarding_csv_fixture.csv | 4 + .../onboarding_csv_fixture_bad_data.csv | 10 + .../fixtures/onboarding_csv_fixture_empty.csv | 0 .../tests/fixtures/sync_devices_fixture.py | 85 +++ .../fixtures/sync_network_data_fixture.py | 161 +++++ .../tests/test_basic.py | 3 +- .../tests/test_diffsync_utils.py | 137 ++++ nautobot_device_onboarding/tests/test_jobs.py | 187 +++++ .../tests/test_nautobot_keeper.py | 7 +- .../tests/test_onboarding.py | 218 +++--- .../tests/test_sync_devices_adapters.py | 152 ++++ .../tests/test_sync_devices_models.py | 148 ++++ .../tests/test_sync_network_data_adapters.py | 353 ++++++++++ nautobot_device_onboarding/tests/utils.py | 362 ++++++++++ .../utils/diffsync_utils.py | 104 +++ nautobot_device_onboarding/utils/helper.py | 87 +++ 28 files changed, 3904 insertions(+), 156 deletions(-) create mode 100644 nautobot_device_onboarding/diffsync/__init__.py create mode 100644 nautobot_device_onboarding/diffsync/adapters/__init__.py create mode 100644 nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py create mode 100644 nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py create mode 100644 nautobot_device_onboarding/diffsync/models/sync_devices_models.py create mode 100644 nautobot_device_onboarding/diffsync/models/sync_network_data_models.py create mode 100644 nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture.csv create mode 100644 nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_bad_data.csv create mode 100644 nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_empty.csv create mode 100644 nautobot_device_onboarding/tests/fixtures/sync_devices_fixture.py create mode 100644 nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py create mode 100644 nautobot_device_onboarding/tests/test_diffsync_utils.py create mode 100644 nautobot_device_onboarding/tests/test_jobs.py create mode 100644 nautobot_device_onboarding/tests/test_sync_devices_adapters.py create mode 100644 nautobot_device_onboarding/tests/test_sync_devices_models.py create mode 100644 nautobot_device_onboarding/tests/test_sync_network_data_adapters.py create mode 100644 nautobot_device_onboarding/tests/utils.py create mode 100644 nautobot_device_onboarding/utils/diffsync_utils.py create mode 100644 nautobot_device_onboarding/utils/helper.py diff --git a/nautobot_device_onboarding/diffsync/__init__.py b/nautobot_device_onboarding/diffsync/__init__.py new file mode 100644 index 00000000..74a66330 --- /dev/null +++ b/nautobot_device_onboarding/diffsync/__init__.py @@ -0,0 +1 @@ +"""Diffsync Definitions for SSoT Network Integration.""" diff --git a/nautobot_device_onboarding/diffsync/adapters/__init__.py b/nautobot_device_onboarding/diffsync/adapters/__init__.py new file mode 100644 index 00000000..125a53f3 --- /dev/null +++ b/nautobot_device_onboarding/diffsync/adapters/__init__.py @@ -0,0 +1 @@ +"""Adapter classes for loading DiffSyncModels with data from a Network or Nautobot.""" diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py new file mode 100644 index 00000000..08c446d8 --- /dev/null +++ b/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py @@ -0,0 +1,395 @@ +"""DiffSync adapters.""" + +from collections import defaultdict +from typing import DefaultDict, Dict, FrozenSet, Hashable, Tuple, Type + +import diffsync +import netaddr +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from django.db.models import Model +from nautobot.dcim.models import Device, DeviceType, Manufacturer, Platform + +from nautobot_device_onboarding.diffsync.models import sync_devices_models +from nautobot_device_onboarding.nornir_plays.command_getter import sync_devices_command_getter +from nautobot_device_onboarding.utils import diffsync_utils + +ParameterSet = FrozenSet[Tuple[str, Hashable]] + + +class SyncDevicesNautobotAdapter(diffsync.DiffSync): + """Adapter for loading Nautobot data.""" + + manufacturer = sync_devices_models.SyncDevicesManufacturer + platform = sync_devices_models.SyncDevicesPlatform + device = sync_devices_models.SyncDevicesDevice + device_type = sync_devices_models.SyncDevicesDeviceType + + top_level = ["manufacturer", "platform", "device_type", "device"] + + # This dictionary acts as an ORM cache. + _cache: DefaultDict[str, Dict[ParameterSet, Model]] + _cache_hits: DefaultDict[str, int] = defaultdict(int) + + def __init__(self, job, sync, *args, **kwargs): + """Initialize the SyncDevicesNautobotAdapter.""" + super().__init__(*args, **kwargs) + self.job = job + self.sync = sync + self.invalidate_cache() + + def invalidate_cache(self, zero_out_hits=True): + """Invalidates all the objects in the ORM cache.""" + self._cache = defaultdict(dict) + if zero_out_hits: + self._cache_hits = defaultdict(int) + + def get_from_orm_cache(self, parameters: Dict, model_class: Type[Model]): + """Retrieve an object from the ORM or the cache.""" + parameter_set = frozenset(parameters.items()) + content_type = ContentType.objects.get_for_model(model_class) + model_cache_key = f"{content_type.app_label}.{content_type.model}" + if cached_object := self._cache[model_cache_key].get(parameter_set): + self._cache_hits[model_cache_key] += 1 + return cached_object + # As we are using `get` here, this will error if there is not exactly one object that corresponds to the + # parameter set. We intentionally pass these errors through. + self._cache[model_cache_key][parameter_set] = model_class.objects.get(**dict(parameter_set)) + return self._cache[model_cache_key][parameter_set] + + def load_manufacturers(self): + """Load manufacturer data from Nautobot.""" + for manufacturer in Manufacturer.objects.all(): + if self.job.debug: + self.job.logger.debug("Loading Manufacturer data from Nautobot...") + onboarding_manufacturer = self.manufacturer(diffsync=self, name=manufacturer.name) + self.add(onboarding_manufacturer) + if self.job.debug: + self.job.logger.debug(f"Manufacturer: {manufacturer.name} loaded.") + + def load_platforms(self): + """Load platform data from Nautobot.""" + if self.job.debug: + self.job.logger.debug("Loading Platform data from Nautobot...") + for platform in Platform.objects.all(): + onboarding_platform = self.platform( + diffsync=self, + name=platform.name, + network_driver=platform.network_driver if platform.network_driver else "", + manufacturer__name=platform.manufacturer.name if platform.manufacturer else None, + ) + self.add(onboarding_platform) + if self.job.debug: + self.job.logger.debug(f"Platform: {platform.name} loaded.") + + def load_device_types(self): + """Load device type data from Nautobot.""" + if self.job.debug: + self.job.logger.debug("Loading DeviceType data from Nautobot...") + for device_type in DeviceType.objects.all(): + onboarding_device_type = self.device_type( + diffsync=self, + model=device_type.model, + part_number=device_type.model, + manufacturer__name=device_type.manufacturer.name, + ) + self.add(onboarding_device_type) + if self.job.debug: + self.job.logger.debug(f"DeviceType: {device_type.model} loaded.") + + def load_devices(self): + """Load device data from Nautobot.""" + if self.job.debug: + self.job.logger.debug("Loading Device data from Nautobot...") + + for device in Device.objects.filter(primary_ip4__host__in=self.job.ip_addresses): + interface_list = [] + # Only interfaces with the device's primary ip should be considered for diff calculations + # Ultimately, only the first matching interface is used but this list could support multiple + # interface syncs in the future. + for interface in device.interfaces.all(): + if device.primary_ip4 in interface.ip_addresses.all(): + interface_list.append(interface.name) + if interface_list: + interface_list.sort() + interfaces = [interface_list[0]] + else: + interfaces = [] + onboarding_device = self.device( + diffsync=self, + device_type__model=device.device_type.model, + location__name=device.location.name, + name=device.name, + platform__name=device.platform.name if device.platform else "", + primary_ip4__host=device.primary_ip4.host if device.primary_ip4 else "", + primary_ip4__status__name=device.primary_ip4.status.name if device.primary_ip4 else "", + role__name=device.role.name, + status__name=device.status.name, + secrets_group__name=device.secrets_group.name if device.secrets_group else "", + interfaces=interfaces, + mask_length=device.primary_ip4.mask_length if device.primary_ip4 else None, + serial=device.serial, + ) + self.add(onboarding_device) + if self.job.debug: + self.job.logger.debug(f"Device: {device.name} loaded.") + + def load(self): + """Load nautobot data.""" + self.load_manufacturers() + self.load_platforms() + self.load_device_types() + self.load_devices() + + +class SyncDevicesNetworkAdapter(diffsync.DiffSync): + """Adapter for loading device data from a network.""" + + manufacturer = sync_devices_models.SyncDevicesManufacturer + platform = sync_devices_models.SyncDevicesPlatform + device = sync_devices_models.SyncDevicesDevice + device_type = sync_devices_models.SyncDevicesDeviceType + + top_level = ["manufacturer", "platform", "device_type", "device"] + + def __init__(self, job, sync, *args, **kwargs): + """Initialize the SyncDevicesNetworkAdapter.""" + super().__init__(*args, **kwargs) + self.job = job + self.sync = sync + self.device_data = None + self.failed_ip_addresses = [] + + def _validate_ip_addresses(self, ip_addresses): + """Validate the format of each IP Address in a list of IP Addresses.""" + # Validate IP Addresses + validation_successful = True + for ip_address in ip_addresses: + try: + netaddr.IPAddress(ip_address) + except netaddr.AddrFormatError: + self.job.logger.error(f"[{ip_address}] is not a valid IP Address ") + validation_successful = False + if validation_successful: + return True + raise netaddr.AddrConversionError + + def _handle_failed_devices(self, device_data): + """ + Handle result data from failed devices. + + If a device fails to return expected data, log the result + and remove it from the data to be loaded into the diffsync store. + """ + self.device_data = None + self.failed_ip_addresses = [] + for ip_address in device_data: + if not device_data[ip_address]: + self.job.logger.error(f"{ip_address}: Connection or data error, this device will not be synced.") + self.failed_ip_addresses.append(ip_address) + for ip_address in self.failed_ip_addresses: + del device_data[ip_address] + self.device_data = device_data + + def execute_command_getter(self): + """Start the CommandGetterDO job to query devices for data.""" + if not self.job.processed_csv_data: + if self.job.platform: + if not self.job.platform.network_driver: + self.job.logger.error( + f"The selected platform, {self.job.platform} " + "does not have a network driver, please update the Platform." + ) + raise Exception("Platform.network_driver missing") # pylint: disable=broad-exception-raised + + result = sync_devices_command_getter( + self.job.job_result, self.job.logger.getEffectiveLevel(), self.job.job_result.task_kwargs + ) + if self.job.debug: + self.job.logger.debug(f"Command Getter Result: {result}") + data_type_check = diffsync_utils.check_data_type(result) + if self.job.debug: + self.job.logger.debug(f"CommandGetter data type check resut: {data_type_check}") + if data_type_check: + self._handle_failed_devices(device_data=result) + else: + self.job.logger.error( + "Data returned from CommandGetter is not the correct type. " + "No devices will be onboarded, check the CommandGetter job logs." + ) + raise ValidationError("Unexpected data returend from CommandGetter.") + + def _add_ip_address_to_failed_list(self, ip_address): + """If an a model fails to load, add the ip address to the failed list for logging.""" + if ip_address not in self.failed_ip_addresses: + self.failed_ip_addresses.append(ip_address) + + def load_manufacturers(self): + """Load manufacturers into the DiffSync store.""" + for ip_address in self.device_data: + if self.job.debug: + self.job.logger.debug(f"loading manufacturer data for {ip_address}") + onboarding_manufacturer = None + try: + onboarding_manufacturer = self.manufacturer( + diffsync=self, + name=self.device_data[ip_address]["manufacturer"], + ) + except KeyError as err: + self.job.logger.error( + f"{ip_address}: Unable to load Manufacturer due to a missing key in returned data, {err.args}" + ) + if onboarding_manufacturer: + try: + self.add(onboarding_manufacturer) + except diffsync.ObjectAlreadyExists: + pass + + def load_platforms(self): + """Load platforms into the DiffSync store.""" + for ip_address in self.device_data: + if self.job.debug: + self.job.logger.debug(f"loading platform data for {ip_address}") + onboarding_platform = None + try: + onboarding_platform = self.platform( + diffsync=self, + name=self.device_data[ip_address]["platform"], + manufacturer__name=self.device_data[ip_address]["manufacturer"], + network_driver=self.device_data[ip_address]["network_driver"], + ) + except KeyError as err: + self.job.logger.error( + f"{ip_address}: Unable to load Platform due to a missing key in returned data, {err.args}" + ) + if onboarding_platform: + try: + self.add(onboarding_platform) + except diffsync.ObjectAlreadyExists: + pass + + def load_device_types(self): + """Load device types into the DiffSync store.""" + for ip_address in self.device_data: + if self.job.debug: + self.job.logger.debug(f"loading device_type data for {ip_address}") + onboarding_device_type = None + try: + onboarding_device_type = self.device_type( + diffsync=self, + model=self.device_data[ip_address]["device_type"], + part_number=self.device_data[ip_address]["device_type"], + manufacturer__name=self.device_data[ip_address]["manufacturer"], + ) + except KeyError as err: + self.job.logger.error( + f"{ip_address}: Unable to load DeviceType due to a missing key in returned data, {err.args}" + ) + if onboarding_device_type: + try: + self.add(onboarding_device_type) + except diffsync.ObjectAlreadyExists: + pass + + def _fields_missing_data(self, device_data, ip_address, platform): + """Verify that all of the fields returned from a device actually contain data.""" + fields_missing_data = [] + required_fields_from_device = ["device_type", "hostname", "mgmt_interface", "mask_length", "serial"] + if platform: # platform is only retruned with device data if not provided on the job form/csv + required_fields_from_device.append("platform") + for field in required_fields_from_device: + data = device_data[ip_address] + if not data.get(field): + fields_missing_data.append(field) + return fields_missing_data + + def load_devices(self): + """Load devices into the DiffSync store.""" + for ip_address in self.device_data: + if self.job.debug: + self.job.logger.debug(f"loading device data for {ip_address}") + platform = None # If an excption is caught below, the platform must still be set. + onboarding_device = None + try: + location = diffsync_utils.retrieve_submitted_value( + job=self.job, ip_address=ip_address, query_string="location" + ) + platform = diffsync_utils.retrieve_submitted_value( + job=self.job, ip_address=ip_address, query_string="platform" + ) + primary_ip4__status = diffsync_utils.retrieve_submitted_value( + job=self.job, ip_address=ip_address, query_string="ip_address_status" + ) + device_role = diffsync_utils.retrieve_submitted_value( + job=self.job, ip_address=ip_address, query_string="device_role" + ) + device_status = diffsync_utils.retrieve_submitted_value( + job=self.job, ip_address=ip_address, query_string="device_status" + ) + secrets_group = diffsync_utils.retrieve_submitted_value( + job=self.job, ip_address=ip_address, query_string="secrets_group" + ) + + onboarding_device = self.device( + diffsync=self, + device_type__model=self.device_data[ip_address]["device_type"], + location__name=location.name, + name=self.device_data[ip_address]["hostname"], + platform__name=platform.name if platform else self.device_data[ip_address]["platform"], + primary_ip4__host=ip_address, + primary_ip4__status__name=primary_ip4__status.name, + role__name=device_role.name, + status__name=device_status.name, + secrets_group__name=secrets_group.name, + interfaces=[self.device_data[ip_address]["mgmt_interface"]], + mask_length=int(self.device_data[ip_address]["mask_length"]), + serial=self.device_data[ip_address]["serial"], + ) + except KeyError as err: + self.job.logger.error( + f"{ip_address}: Unable to load Device due to a missing key in returned data, {err.args}, {err}" + ) + if ip_address not in self.failed_ip_addresses: + self.failed_ip_addresses.append(ip_address) + except ValueError as err: + self.job.logger.error( + f"{ip_address}: Unable to load Device due to invalid data type in data return, {err}" + ) + + fields_missing_data = self._fields_missing_data( + device_data=self.device_data, ip_address=ip_address, platform=platform + ) + if fields_missing_data: + onboarding_device = None + self.job.logger.error( + f"Unable to onbaord {ip_address}, returned data missing for {fields_missing_data}" + ) + else: + if onboarding_device: + try: + self.add(onboarding_device) + if self.job.debug: + self.job.logger.debug(f"Device: {self.device_data[ip_address]['hostname']} loaded.") + except diffsync.ObjectAlreadyExists: + self.job.logger.error( + f"Device: {self.device_data[ip_address]['hostname']} has already been loaded! " + f"Duplicate devices will not be synced. " + f"[Serial Number: {self.device_data[ip_address]['serial']}, " + f"IP Address: {ip_address}]" + ) + else: + self._add_ip_address_to_failed_list(ip_address=ip_address) + if self.job.debug: + self.job.logger.debug(f"{ip_address} was added to the failed ip_address list") + + def load(self): + """Load network data.""" + self._validate_ip_addresses(self.job.ip_addresses) + self.execute_command_getter() + self.load_manufacturers() + self.load_platforms() + self.load_device_types() + self.load_devices() + + if self.failed_ip_addresses: + self.job.logger.warning(f"Failed IP Addresses: {self.failed_ip_addresses}") diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py new file mode 100644 index 00000000..e80794c2 --- /dev/null +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -0,0 +1,658 @@ +"""DiffSync adapters.""" + +import datetime + +import diffsync +from diffsync.enum import DiffSyncModelFlags +from django.conf import settings +from django.core.exceptions import ValidationError +from nautobot.dcim.models import Interface +from nautobot.ipam.models import VLAN, VRF, IPAddress +from nautobot_ssot.contrib import NautobotAdapter +from netaddr import EUI, mac_unix_expanded + +from nautobot_device_onboarding.diffsync.models import sync_network_data_models +from nautobot_device_onboarding.nornir_plays.command_getter import sync_network_data_command_getter +from nautobot_device_onboarding.utils import diffsync_utils + +app_settings = settings.PLUGINS_CONFIG["nautobot_device_onboarding"] + + +class FilteredNautobotAdapter(NautobotAdapter): + """ + Allow Nautobot data to be filtered by the Job form inputs. + + Must be used with FilteredNautobotModel. + """ + + def _load_objects(self, diffsync_model): # pylint: disable=protected-access + """Given a diffsync model class, load a list of models from the database and return them.""" + parameter_names = self._get_parameter_names(diffsync_model) + for database_object in diffsync_model._get_queryset(diffsync=self): # pylint: disable=protected-access + self._load_single_object(database_object, diffsync_model, parameter_names) + + +class SyncNetworkDataNautobotAdapter(FilteredNautobotAdapter): + """Adapter for loading Nautobot data.""" + + device = sync_network_data_models.SyncNetworkDataDevice + interface = sync_network_data_models.SyncNetworkDataInterface + ip_address = sync_network_data_models.SyncNetworkDataIPAddress + ipaddress_to_interface = sync_network_data_models.SyncNetworkDataIPAddressToInterface + vlan = sync_network_data_models.SyncNetworkDataVLAN + vrf = sync_network_data_models.SyncNetworkDataVRF + tagged_vlans_to_interface = sync_network_data_models.SyncNetworkDataTaggedVlansToInterface + untagged_vlan_to_interface = sync_network_data_models.SyncNetworkDataUnTaggedVlanToInterface + lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface + vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface + + primary_ips = None + + top_level = [ + "ip_address", + "vlan", + "vrf", + "device", + "ipaddress_to_interface", + "untagged_vlan_to_interface", + "tagged_vlans_to_interface", + "lag_to_interface", + "vrf_to_interface", + ] + + def _cache_primary_ips(self, device_queryset): + """ + Create a cache of primary ip address for devices. + + If the primary ip address of a device is unset due to the deletion + of an interface, this cache is used to reset it in sync_complete(). + """ + self.primary_ips = {} + for device in device_queryset: + self.primary_ips[device.id] = device.primary_ip.id + + def load_param_mac_address(self, parameter_name, database_object): + """Convert interface mac_address to string.""" + if database_object.mac_address: + return str(database_object.mac_address) + return "" + + def load_ip_addresses(self): + """Load IP addresses into the DiffSync store. + + Only IP Addresses that were returned by the CommandGetter job should be loaded. + """ + ip_address_hosts = set() + for _, device_data in self.job.command_getter_result.items(): + # for interface in device_data["interfaces"]: + for _, interface_data in device_data["interfaces"].items(): + for ip_address in interface_data["ip_addresses"]: + if ip_address: + ip_address_hosts.add(ip_address["ip_address"]) + if "" in ip_address_hosts: + ip_address_hosts.remove("") # do not attempt to filter ip addresses with empty strings + for ip_address in IPAddress.objects.filter( + host__in=ip_address_hosts, + parent__namespace__name=self.job.namespace.name, + ): + network_ip_address = self.ip_address( + diffsync=self, + host=ip_address.host, + mask_length=ip_address.mask_length, + type=ip_address.type, + ip_version=ip_address.ip_version, + status__name=ip_address.status.name, + ) + try: + network_ip_address.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_ip_address) + except diffsync.exceptions.ObjectAlreadyExists: + self.job.logger.warning( + f"{network_ip_address} is already loaded to the DiffSync store. This is a duplicate IP Address." + ) + return ip_address_hosts + + def load_vlans(self): + """ + Load Vlans into the Diffsync store. + + Only Vlans that were returned by the CommandGetter job should be synced. + """ + for vlan in VLAN.objects.all(): + network_vlan = self.vlan( + diffsync=self, + name=vlan.name, + vid=vlan.vid, + location__name=vlan.location.name if vlan.location else "", + ) + try: + network_vlan.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_vlan) + except diffsync.exceptions.ObjectAlreadyExists: + pass + + def load_tagged_vlans_to_interface(self): + """ + Load Tagged VLAN interface assignments into the Diffsync store. + + Only Vlan assignments that were returned by the CommandGetter job should be loaded. + """ + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + tagged_vlans = [] + for vlan in interface.tagged_vlans.all(): + vlan_dict = {} + vlan_dict["name"] = vlan.name + vlan_dict["id"] = str(vlan.vid) + tagged_vlans.append(vlan_dict) + + network_tagged_vlans_to_interface = self.tagged_vlans_to_interface( + diffsync=self, + device__name=interface.device.name, + name=interface.name, + tagged_vlans=tagged_vlans, + ) + network_tagged_vlans_to_interface.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_tagged_vlans_to_interface) + + def load_untagged_vlan_to_interface(self): + """ + Load UnTagged VLAN interface assignments into the Diffsync store. + + Only UnTagged Vlan assignments that were returned by the CommandGetter job should be synced. + """ + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + untagged_vlan = {} + if interface.untagged_vlan: + untagged_vlan["name"] = interface.untagged_vlan.name + untagged_vlan["id"] = str(interface.untagged_vlan.vid) + + network_untagged_vlan_to_interface = self.untagged_vlan_to_interface( + diffsync=self, + device__name=interface.device.name, + name=interface.name, + untagged_vlan=untagged_vlan, + ) + network_untagged_vlan_to_interface.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_untagged_vlan_to_interface) + + def load_lag_to_interface(self): + """ + Load Lag interface assignments into the Diffsync store. + + Only Lag assignments that were returned by the CommandGetter job should be synced. + """ + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + network_lag_to_interface = self.lag_to_interface( + diffsync=self, + device__name=interface.device.name, + name=interface.name, + lag__interface__name=interface.lag.name if interface.lag else "", + ) + network_lag_to_interface.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_lag_to_interface) + + def load_vrfs(self): + """ + Load Vrfs into the Diffsync store. + + Only Vrfs that were returned by the CommandGetter job should be synced. + """ + for vrf in VRF.objects.all(): + network_vrf = self.vrf( + diffsync=self, + name=vrf.name, + namespace__name=vrf.namespace.name, + ) + try: + network_vrf.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_vrf) + except diffsync.exceptions.ObjectAlreadyExists: + continue + + def load_vrf_to_interface(self): + """ + Load Vrf to interface assignments into the Diffsync store. + + Only Vrf assignments that were returned by the CommandGetter job should be synced. + """ + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + vrf = {} + if interface.vrf: + vrf["name"] = interface.vrf.name + + network_vrf_to_interface = self.vrf_to_interface( + diffsync=self, + device__name=interface.device.name, + name=interface.name, + vrf=vrf, + ) + network_vrf_to_interface.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_vrf_to_interface) + + def load(self): + """Generic implementation of the load function.""" + if not hasattr(self, "top_level") or not self.top_level: + raise ValueError("'top_level' needs to be set on the class.") + + self._cache_primary_ips(device_queryset=self.job.devices_to_load) + for model_name in self.top_level: + if model_name == "ip_address": + self.load_ip_addresses() + elif model_name == "vlan": + if self.job.sync_vlans: + self.load_vlans() + elif model_name == "vrf": + if self.job.sync_vrfs: + self.load_vrfs() + elif model_name == "tagged_vlans_to_interface": + if self.job.sync_vlans: + self.load_tagged_vlans_to_interface() + elif model_name == "untagged_vlan_to_interface": + if self.job.sync_vlans: + self.load_untagged_vlan_to_interface() + elif model_name == "lag_to_interface": + self.load_lag_to_interface() + elif model_name == "vrf_to_interface": + if self.job.sync_vrfs: + self.load_vrf_to_interface() + else: + diffsync_model = self._get_diffsync_class(model_name) + self._load_objects(diffsync_model) + + def sync_complete(self, source, diff, *args, **kwargs): + """ + Assign the primary ip address to a device and update the management interface setting. + + Syncing interfaces may result in the deletion of the original management interface. If + this happens, the primary IP Address for the device should be set and the management only + option on the appropriate interface should be set to True. + + This method only runs if data was changed. + """ + if self.job.debug: + self.job.logger.debug("Sync Complete method called, checking for missing primary ip addresses...") + for device in self.job.devices_to_load.all(): # refresh queryset after sync is complete + if not device.primary_ip: + ip_address = "" + try: + ip_address = IPAddress.objects.get(id=self.primary_ips[device.id]) + device.primary_ip4 = ip_address + device.validated_save() + self.job.logger.info(f"Assigning {ip_address} as primary IP Address for Device: {device.name}") + except Exception as err: # pylint: disable=broad-exception-caught + self.job.logger.error( + f"Unable to set Primary IP for {device.name}, {err.args}. " + "Please check the primary IP Address assignment for this device." + ) + if ip_address: + try: + interface = Interface.objects.get(device=device, ip_addresses__in=[ip_address]) + interface.mgmt_only = True + interface.validated_save() + self.job.logger.info( + f"Management only set for interface: {interface.name} on device: {device.name}" + ) + except Exception as err: # pylint: disable=broad-exception-caught + self.job.logger.error( + "Failed to set management only on the " + f"management interface for {device.name}, {err}, {err.args}" + ) + else: + self.job.logger.error( + f"Failed to set management only on the managmeent interface for {device.name}" + ) + return super().sync_complete(source, diff, *args, **kwargs) + + +class MacUnixExpandedUppercase(mac_unix_expanded): + """Mac Unix Expanded Uppercase.""" + + word_fmt = "%.2X" + + +class SyncNetworkDataNetworkAdapter(diffsync.DiffSync): + """Adapter for loading Network data.""" + + def __init__(self, *args, job, sync=None, **kwargs): + """Instantiate this class, but do not load data immediately from the local system.""" + super().__init__(*args, **kwargs) + self.job = job + self.sync = sync + + device = sync_network_data_models.SyncNetworkDataDevice + interface = sync_network_data_models.SyncNetworkDataInterface + ip_address = sync_network_data_models.SyncNetworkDataIPAddress + ipaddress_to_interface = sync_network_data_models.SyncNetworkDataIPAddressToInterface + vlan = sync_network_data_models.SyncNetworkDataVLAN + vrf = sync_network_data_models.SyncNetworkDataVRF + tagged_vlans_to_interface = sync_network_data_models.SyncNetworkDataTaggedVlansToInterface + untagged_vlan_to_interface = sync_network_data_models.SyncNetworkDataUnTaggedVlanToInterface + lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface + vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface + + top_level = [ + "ip_address", + "vlan", + "vrf", + "device", + "ipaddress_to_interface", + "untagged_vlan_to_interface", + "tagged_vlans_to_interface", + "lag_to_interface", + "vrf_to_interface", + ] + + def _handle_failed_devices(self, device_data): + """ + Handle result data from failed devices. + + If a device fails to return expected data, log the result + and remove it from the data to be loaded into the diffsync store. + """ + failed_devices = [] + + for hostname in device_data: + if device_data[hostname].get("failed"): + self.job.logger.error( + f"{hostname}: Connection or data error, this device will not be synced. " + f"{device_data[hostname].get('failed_reason')}" + ) + failed_devices.append(hostname) + for hostname in failed_devices: + del device_data[hostname] + if failed_devices: + self.job.logger.warning(f"Failed devices: {failed_devices}") + self.job.command_getter_result = device_data + self.job.devices_to_load = diffsync_utils.generate_device_queryset_from_command_getter_result(device_data) + + def _handle_general_load_exception(self, error, hostname, data, model_type): + """If a diffsync model fails to load, log the error.""" + self.job.logger.error(f"Failed to load {model_type} model for {hostname}. {error}, {error.args}") + if self.job.debug: + self.job.logger.debug(f"HOSTNAME: {hostname}, DATA: {data}") + + def execute_command_getter(self): + """Query devices for data.""" + result = sync_network_data_command_getter( + self.job.job_result, self.job.logger.getEffectiveLevel(), self.job.job_result.task_kwargs + ) + # verify data returned is a dict + data_type_check = diffsync_utils.check_data_type(result) + if self.job.debug: + self.job.logger.debug(f"CommandGetter data type check resut: {data_type_check}") + if data_type_check: + self._handle_failed_devices(device_data=result) + else: + self.job.logger.error( + "Data returned from CommandGetter is not the correct type. No devices will be onboarded" + ) + raise ValidationError("Unexpected data returend from CommandGetter.") + + def _process_mac_address(self, mac_address): + """Convert a mac address to match the value stored by Nautobot.""" + if mac_address: + return str(EUI(mac_address, version=48, dialect=MacUnixExpandedUppercase)) + return "" + + def load_devices(self): + """Load devices into the DiffSync store.""" + for hostname, device_data in self.job.command_getter_result.items(): + try: + network_device = self.device( + diffsync=self, + name=hostname, + serial=device_data["serial"], + last_network_data_sync=datetime.datetime.now().date().isoformat(), + ) + self.add(network_device) + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception(error=err, hostname=hostname, data=device_data, model_type="device") + continue + # for interface in device_data["interfaces"]: + for interface_name, interface_data in device_data["interfaces"].items(): + network_interface = self.load_interface(hostname, interface_name, interface_data) + network_device.add_child(network_interface) + + # def _get_vlan_name(self, interface_data): + # """Given interface data returned from a device, process and return the vlan name.""" + # vlan_name = "" + # if self.job.sync_vlans: + # vlan_name = interface_data["untagged_vlan"]["name"] if interface_data["untagged_vlan"] else "" + # return vlan_name + + def load_interface(self, hostname, interface_name, interface_data): + """Load an interface into the DiffSync store.""" + network_interface = self.interface( + diffsync=self, + name=interface_name, + device__name=hostname, + status__name=self.job.interface_status.name, + type=interface_data["type"], + mac_address=self._process_mac_address(mac_address=interface_data["mac_address"]), + mtu=interface_data["mtu"] if interface_data["mtu"] else 1500, + description=interface_data["description"], + enabled=interface_data["link_status"], + mode=interface_data["802.1Q_mode"], + # untagged_vlan__name=self._get_vlan_name(interface_data=interface_data), + ) + self.add(network_interface) + return network_interface + + def load_ip_addresses(self): + """Load IP addresses into the DiffSync store.""" + for hostname, device_data in self.job.command_getter_result.items(): # pylint: disable=too-many-nested-blocks + if self.job.debug: + self.job.logger.debug(f"Loading IP Addresses from {hostname}") + # for interface in device_data["interfaces"]: + for interface_name, interface_data in device_data["interfaces"].items(): + if interface_data["ip_addresses"]: + for ip_address in interface_data["ip_addresses"]: + if ip_address["ip_address"]: # the ip_address and mask_length may be empty, skip these + if self.job.debug: + self.job.logger.debug(f"Loading {ip_address} from {interface_name} on {hostname}") + try: + network_ip_address = self.ip_address( + diffsync=self, + host=ip_address["ip_address"], + mask_length=int(ip_address["prefix_length"]), + type="host", + ip_version=4, + status__name=self.job.ip_address_status.name, + ) + self.add(network_ip_address) + except diffsync.exceptions.ObjectAlreadyExists: + self.job.logger.warning( + f"{network_ip_address} is already loaded to the " + "DiffSync store. This is a duplicate IP Address." + ) + continue + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="ip_address" + ) + continue + + def load_vlans(self): + """Load vlans into the Diffsync store.""" + location_names = {} + for device in self.job.devices_to_load: + location_names[device.name] = device.location.name + + for hostname, device_data in self.job.command_getter_result.items(): # pylint: disable=too-many-nested-blocks + if self.job.debug: + self.job.logger.debug(f"Loading Vlans from {hostname}") + # for interface in device_data["interfaces"]: + for _, interface_data in device_data["interfaces"].items(): + # add tagged vlans + for tagged_vlan in interface_data["tagged_vlans"]: + try: + network_vlan = self.vlan( + diffsync=self, + name=tagged_vlan["name"], + vid=tagged_vlan["id"], + location__name=location_names.get(hostname, ""), + ) + self.add(network_vlan) + except diffsync.exceptions.ObjectAlreadyExists: + continue + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="vlan" + ) + continue + # check for untagged vlan and add if necessary + if interface_data["untagged_vlan"]: + try: + network_vlan = self.vlan( + diffsync=self, + name=interface_data["untagged_vlan"]["name"], + vid=interface_data["untagged_vlan"]["id"], + location__name=location_names.get(hostname, ""), + ) + self.add(network_vlan) + except diffsync.exceptions.ObjectAlreadyExists: + continue + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="vlan" + ) + continue + + def load_vrfs(self): + """Load vrfs into the Diffsync store.""" + for hostname, device_data in self.job.command_getter_result.items(): # pylint: disable=too-many-nested-blocks + if self.job.debug: + self.job.logger.debug(f"Loading Vrfs from {hostname}") + # for interface in device_data["interfaces"]: + for _, interface_data in device_data["interfaces"].items(): + if interface_data["vrf"]: + try: + network_vrf = self.vrf( + diffsync=self, + name=interface_data["vrf"]["name"], + namespace__name=self.job.namespace.name, + ) + self.add(network_vrf) + except diffsync.exceptions.ObjectAlreadyExists: + continue + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="vrf" + ) + continue + + def load_ip_address_to_interfaces(self): + """Load ip address interface assignments into the Diffsync store.""" + for hostname, device_data in self.job.command_getter_result.items(): # pylint: disable=too-many-nested-blocks + for interface_name, interface_data in device_data["interfaces"].items(): + for ip_address in interface_data["ip_addresses"]: + if ip_address["ip_address"]: # the ip_address and mask_length may be empty, skip these + try: + network_ip_address_to_interface = self.ipaddress_to_interface( + diffsync=self, + interface__device__name=hostname, + interface__name=interface_name, + ip_address__host=ip_address["ip_address"], + ip_address__mask_length=( + int(ip_address["prefix_length"]) if ip_address["prefix_length"] else None + ), + ) + self.add(network_ip_address_to_interface) + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="ip_address to interface" + ) + continue + + def load_tagged_vlans_to_interface(self): + """Load tagged vlan to interface assignments into the Diffsync store.""" + for hostname, device_data in self.job.command_getter_result.items(): + # for interface in device_data["interfaces"]: + for interface_name, interface_data in device_data["interfaces"].items(): + try: + network_tagged_vlans_to_interface = self.tagged_vlans_to_interface( + diffsync=self, + device__name=hostname, + name=interface_name, + tagged_vlans=interface_data["tagged_vlans"], + ) + self.add(network_tagged_vlans_to_interface) + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="tagged vlan to interface" + ) + continue + + def load_untagged_vlan_to_interface(self): + """Load untagged vlan to interface assignments into the Diffsync store.""" + for hostname, device_data in self.job.command_getter_result.items(): + # for interface in device_data["interfaces"]: + for interface_name, interface_data in device_data["interfaces"].items(): + try: + network_untagged_vlan_to_interface = self.untagged_vlan_to_interface( + diffsync=self, + device__name=hostname, + name=interface_name, + untagged_vlan=interface_data["untagged_vlan"], + ) + self.add(network_untagged_vlan_to_interface) + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="untagged vlan to interface" + ) + continue + + def load_lag_to_interface(self): + """Load lag interface assignments into the Diffsync store.""" + for hostname, device_data in self.job.command_getter_result.items(): + # for interface in device_data["interfaces"]: + for interface_name, interface_data in device_data["interfaces"].items(): + try: + network_lag_to_interface = self.lag_to_interface( + diffsync=self, + device__name=hostname, + name=interface_name, + lag__interface__name=interface_data["lag"] if interface_data["lag"] else "", + ) + self.add(network_lag_to_interface) + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="lag to interface" + ) + continue + + def load_vrf_to_interface(self): + """Load Vrf to interface assignments into the Diffsync store.""" + for hostname, device_data in self.job.command_getter_result.items(): + # for interface in device_data["interfaces"]: + for interface_name, interface_data in device_data["interfaces"].items(): + try: + network_vrf_to_interface = self.vrf_to_interface( + diffsync=self, + device__name=hostname, + name=interface_name, + vrf=interface_data["vrf"], + ) + self.add(network_vrf_to_interface) + except Exception as err: # pylint: disable=broad-exception-caught + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="vrf to interface" + ) + continue + + def load(self): + """Load network data.""" + self.execute_command_getter() + self.load_ip_addresses() + if self.job.sync_vlans: + self.load_vlans() + if self.job.sync_vrfs: + self.load_vrfs() + self.load_devices() + self.load_ip_address_to_interfaces() + if self.job.sync_vlans: + self.load_tagged_vlans_to_interface() + self.load_untagged_vlan_to_interface() + self.load_lag_to_interface() + if self.job.sync_vrfs: + self.load_vrf_to_interface() diff --git a/nautobot_device_onboarding/diffsync/models/sync_devices_models.py b/nautobot_device_onboarding/diffsync/models/sync_devices_models.py new file mode 100644 index 00000000..96015e64 --- /dev/null +++ b/nautobot_device_onboarding/diffsync/models/sync_devices_models.py @@ -0,0 +1,387 @@ +"""Diffsync models.""" + +from typing import Optional + +from diffsync import DiffSyncModel +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError +from nautobot.apps.choices import InterfaceTypeChoices +from nautobot.dcim.models import Device, DeviceType, Interface, Manufacturer, Platform +from nautobot.extras.models import Role, SecretsGroup, Status +from nautobot.ipam.models import IPAddressToInterface +from nautobot_ssot.contrib import NautobotModel + +from nautobot_device_onboarding.utils import diffsync_utils + + +class SyncDevicesDevice(DiffSyncModel): + """Diffsync model for device data.""" + + _modelname = "device" + _identifiers = ( + "location__name", + "name", + "serial", + ) + _attributes = ( + "device_type__model", + "mask_length", + "primary_ip4__host", + "primary_ip4__status__name", + "platform__name", + "role__name", + "secrets_group__name", + "status__name", + "interfaces", + ) + + name: str + location__name: str + serial: str + + device_type__model: Optional[str] + mask_length: Optional[int] + primary_ip4__host: Optional[str] + primary_ip4__status__name: Optional[str] + platform__name: Optional[str] + role__name: Optional[str] + secrets_group__name: Optional[str] + status__name: Optional[str] + + interfaces: Optional[list] + + @classmethod + def _get_or_create_device(cls, diffsync, ids, attrs): + """Attempt to get a Device, create a new one if necessary.""" + device = None + try: + # Only Devices with a primary ip address are loaded from Nautobot when syncing. + # If a device is found in Nautobot with a matching name and location as the + # device being created, but the primary ip address doesn't match an ip address entered, + # (or doesn't exist) the matching device will be updated or skipped based on user preference. + + location = diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="location" + ) + platform = Platform.objects.get(name=attrs["platform__name"]) + device = Device.objects.get(name=ids["name"], location=location) + update_devices_without_primary_ip = diffsync_utils.retrieve_submitted_value( + job=diffsync.job, + ip_address=attrs["primary_ip4__host"], + query_string="update_devices_without_primary_ip", + ) + if update_devices_without_primary_ip: + diffsync.job.logger.warning( + f"Device {device.name} at location {location.name} already exists in Nautobot " + "but the primary ip address either does not exist, or doesn't match an entered ip address. " + "This device will be updated. This update may result in multiple IP Address assignments " + "to an interface on the device." + ) + device = cls._update_device_with_attrs(device, platform, ids, attrs, diffsync) + else: + diffsync.job.logger.warning( + f"Device {device.name} at location {location.name} already exists in Nautobot " + "but the primary ip address either does not exist, or doesn't match an entered ip address. " + "IP Address, this device will be skipped." + ) + return None + + except ObjectDoesNotExist: + # Create Device + device = Device( + location=location, + status=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="device_status" + ), + role=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="device_role" + ), + device_type=DeviceType.objects.get(model=attrs["device_type__model"]), + name=ids["name"], + platform=platform, + secrets_group=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="secrets_group" + ), + serial=ids["serial"], + ) + device.validated_save() + return device + + @classmethod + def _get_or_create_interface(cls, diffsync, device, ip_address, interface_name): + """Attempt to get a Device Interface, create a new one if necessary.""" + device_interface = None + try: + device_interface = Interface.objects.get( + name=interface_name, + device=device, + ) + except ObjectDoesNotExist: + try: + device_interface = Interface( + name=interface_name, + mgmt_only=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=ip_address, query_string="set_mgmt_only" + ), + status=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=ip_address, query_string="interface_status" + ), + type=InterfaceTypeChoices.TYPE_OTHER, + device=device, + ) + device_interface.validated_save() + except Exception as err: + diffsync.job.logger.error(f"Device Interface could not be created, {err}") + return device_interface + + @classmethod + def _get_or_create_ip_address_to_interface(cls, diffsync, interface, ip_address): + """Attempt to get a Device Interface, create a new one if necessary.""" + interface_assignment = None + try: + interface_assignment = IPAddressToInterface.objects.get( + ip_address=ip_address, + interface=interface, + ) + except ObjectDoesNotExist: + try: + interface_assignment = IPAddressToInterface( + ip_address=ip_address, + interface=interface, + ) + interface_assignment.validated_save() + except Exception as err: + diffsync.job.logger.error(f"{ip_address} failed to assign to assign to interface {err}") + return interface_assignment + + @classmethod + def _update_device_with_attrs(cls, device, platform, ids, attrs, diffsync): + """Update a Nautobot device instance with attrs.""" + device.location = diffsync_utils.retrieve_submitted_value( + job=diffsync.job, + ip_address=attrs["primary_ip4__host"], + query_string="location", + ) + device.status = diffsync_utils.retrieve_submitted_value( + job=diffsync.job, + ip_address=attrs["primary_ip4__host"], + query_string="device_status", + ) + device.role = diffsync_utils.retrieve_submitted_value( + job=diffsync.job, + ip_address=attrs["primary_ip4__host"], + query_string="device_role", + ) + device.device_type = DeviceType.objects.get(model=attrs["device_type__model"]) + device.platform = platform + device.secrets_group = diffsync_utils.retrieve_submitted_value( + job=diffsync.job, + ip_address=attrs["primary_ip4__host"], + query_string="secrets_group", + ) + device.serial = ids["serial"] + + return device + + def _remove_old_interface_assignment(self, device, ip_address): + """Remove a device's primary IP address from an interface.""" + try: + old_interface = Interface.objects.get( + device=device, + ip_addresses__in=[ip_address], + ) + old_interface_assignment = IPAddressToInterface.objects.get( + interface=old_interface, + ip_address=ip_address, + ) + old_interface_assignment.delete() + if self.diffsync.job.debug: + self.diffsync.job.logger.debug(f"Interface assignment deleted: {old_interface_assignment}") + except MultipleObjectsReturned: + self.diffsync.job.logger.warning( + f"{ip_address} is assigned to multiple interfaces. The primary IP Address for this " + "device will be assigned to an interface but duplicate assignments will remain." + ) + except ObjectDoesNotExist: + pass + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create a new nautobot device using data scraped from a device.""" + if diffsync.job.debug: + diffsync.job.logger.debug(f"Creating device {ids} with {attrs}") + + # Get or create Device, Interface and IP Address + device = cls._get_or_create_device(diffsync, ids, attrs) + if device: + ip_address = diffsync_utils.get_or_create_ip_address( + host=attrs["primary_ip4__host"], + mask_length=attrs["mask_length"], + namespace=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="namespace" + ), + default_ip_status=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="ip_address_status" + ), + default_prefix_status=diffsync_utils.retrieve_submitted_value( + job=diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="ip_address_status" + ), + job=diffsync.job, + ) + interface = cls._get_or_create_interface( + diffsync=diffsync, + device=device, + ip_address=attrs["primary_ip4__host"], + interface_name=attrs["interfaces"][0], + ) + cls._get_or_create_ip_address_to_interface(diffsync=diffsync, ip_address=ip_address, interface=interface) + # Assign primary IP Address to Device + device.primary_ip4 = ip_address + + try: + device.validated_save() + except ValidationError as err: + diffsync.job.logger.error(f"Failed to create or update Device: {ids['name']}, {err}") + raise ValidationError(err) + else: + diffsync.job.logger.error(f"Failed create or update Device: {ids['name']}") + + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update an existing nautobot device using data scraped from a device.""" + device = Device.objects.get(name=self.name, location__name=self.location__name) + + if self.diffsync.job.debug: + self.diffsync.job.logger.debug(f"Updating {device.name} with attrs: {attrs}") + if attrs.get("device_type__model"): + device.device_type = DeviceType.objects.get(model=attrs.get("device_type__model")) + if attrs.get("platform__name"): + device.platform = Platform.objects.get(name=attrs.get("platform__name")) + if attrs.get("role__name"): + device.role = Role.objects.get(name=attrs.get("role__name")) + if attrs.get("status__name"): + device.status = Status.objects.get(name=attrs.get("status__name")) + if attrs.get("secrets_group__name"): + device.secrets_group = SecretsGroup.objects.get(name=attrs.get("secrets_group__name")) + + if attrs.get("interfaces"): + # Update both the interface and primary ip address + if attrs.get("primary_ip4__host"): + # If the primary ip address is being updated, the mask length must be included + if not attrs.get("mask_length"): + attrs["mask_length"] = device.primary_ip4.mask_length + + ip_address = diffsync_utils.get_or_create_ip_address( + host=attrs["primary_ip4__host"], + mask_length=attrs["mask_length"], + namespace=diffsync_utils.retrieve_submitted_value( + job=self.diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="namespace" + ), + default_ip_status=diffsync_utils.retrieve_submitted_value( + job=self.diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="ip_address_status" + ), + default_prefix_status=diffsync_utils.retrieve_submitted_value( + job=self.diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="ip_address_status" + ), + job=self.diffsync.job, + ) + new_interface = self._get_or_create_interface( + diffsync=self.diffsync, + device=device, + ip_address=attrs["primary_ip4__host"], + interface_name=attrs["interfaces"][0], + ) + self._get_or_create_ip_address_to_interface( + diffsync=self.diffsync, ip_address=ip_address, interface=new_interface + ) + device.primary_ip4 = ip_address + # Update the interface only + else: + # Remove the primary IP Address from the old managment interface + self._remove_old_interface_assignment(device=device, ip_address=device.primary_ip4) + + new_interface = self._get_or_create_interface( + diffsync=self.diffsync, + device=device, + ip_address=self.primary_ip4__host, + interface_name=attrs["interfaces"][0], + ) + self._get_or_create_ip_address_to_interface( + diffsync=self.diffsync, ip_address=device.primary_ip4, interface=new_interface + ) + else: + # Update the primary ip address only + # This edge case is unlikely to occur. A device with primary_ip that doesn't mach what was entered + # on the job form should be filtered out of the sync and later caught by _get_or_create_device() + if attrs.get("primary_ip4__host"): + if not attrs.get("mask_length"): + attrs["mask_length"] = device.primary_ip4.mask_length + + new_ip_address = diffsync_utils.get_or_create_ip_address( + host=attrs["primary_ip4__host"], + mask_length=attrs["mask_length"], + namespace=diffsync_utils.retrieve_submitted_value( + job=self.diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="namespace" + ), + default_ip_status=diffsync_utils.retrieve_submitted_value( + job=self.diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="ip_address_status" + ), + default_prefix_status=diffsync_utils.retrieve_submitted_value( + job=self.diffsync.job, ip_address=attrs["primary_ip4__host"], query_string="ip_address_status" + ), + job=self.diffsync.job, + ) + self._remove_old_interface_assignment(device=device, ip_address=device.primary_ip4) + existing_interface = self._get_or_create_interface( + diffsync=self.diffsync, + device=device, + ip_address=new_ip_address, + interface_name=self.get_attrs()["interfaces"][0], + ) + self._get_or_create_ip_address_to_interface( + diffsync=self.diffsync, ip_address=new_ip_address, interface=existing_interface + ) + device.primary_ip4 = new_ip_address + try: + device.validated_save() + except ValidationError as err: + self.diffsync.job.logger.error(f"Device {device.name} failed to update, {err}") + return super().update(attrs) + + +class SyncDevicesDeviceType(NautobotModel): + """Diffsync model for device type data.""" + + _modelname = "device_type" + _model = DeviceType + _identifiers = ("model", "manufacturer__name") + _attributes = ("part_number",) + + model: str + manufacturer__name: str + + part_number: str + + +class SyncDevicesManufacturer(NautobotModel): + """Diffsync model for manufacturer data.""" + + _modelname = "manufacturer" + _model = Manufacturer + _identifiers = ("name",) + + name: str + + +class SyncDevicesPlatform(NautobotModel): + """Diffsync model for platform data.""" + + _modelname = "platform" + _model = Platform + _identifiers = ("name",) + _attributes = ("network_driver", "manufacturer__name") + + name: str + + network_driver: Optional[str] + manufacturer__name: Optional[str] diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py new file mode 100644 index 00000000..122a72c1 --- /dev/null +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -0,0 +1,566 @@ +"""Diffsync models.""" + +from typing import List, Optional + +try: + from typing import Annotated # Python>=3.9 +except ImportError: + from typing_extensions import Annotated # Python<3.9 + +from diffsync import DiffSync, DiffSyncModel +from diffsync import exceptions as diffsync_exceptions +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError +from nautobot.dcim.choices import InterfaceTypeChoices +from nautobot.dcim.models import Device, Interface, Location +from nautobot.extras.models import Status +from nautobot.ipam.models import VLAN, VRF, IPAddress, IPAddressToInterface +from nautobot_ssot.contrib import CustomFieldAnnotation, NautobotModel + +from nautobot_device_onboarding.utils import diffsync_utils + + +class FilteredNautobotModel(NautobotModel): + """ + Allow Nautobot data to be filtered by the Job form inputs. + + Must be used with FilteredNautobotAdapter. + """ + + @classmethod + def _get_queryset(cls, diffsync: "DiffSync"): + """Get the queryset used to load the models data from Nautobot.""" + parameter_names = list(cls._identifiers) + list(cls._attributes) + # Here we identify any foreign keys (i.e. fields with '__' in them) so that we can load them directly in the + # first query if this function hasn't been overridden. + prefetch_related_parameters = [parameter.split("__")[0] for parameter in parameter_names if "__" in parameter] + qs = cls.get_queryset(diffsync=diffsync) + return qs.prefetch_related(*prefetch_related_parameters) + + @classmethod + def get_queryset(cls, diffsync: "DiffSync"): + """Get the queryset used to load the models data from Nautobot.""" + # Replace return with a filtered queryset. + # Access the job form inputs with diffsync ex: diffsync.job.location.name + return cls._model.objects.all() + + +class SyncNetworkDataDevice(FilteredNautobotModel): + """Shared data model representing a Device.""" + + _modelname = "device" + _model = Device + _identifiers = ( + "name", + "serial", + ) + _attributes = ("last_network_data_sync",) + _children = {"interface": "interfaces"} + + name: str + serial: str + + last_network_data_sync: Annotated[ + Optional[str], CustomFieldAnnotation(key="last_network_data_sync", name="last_network_data_sync") + ] + + interfaces: List["SyncNetworkDataInterface"] = [] + + @classmethod + def _get_queryset(cls, diffsync: "DiffSync"): + """Get the queryset used to load the models data from Nautobot. + + job.command_getter_result contains the result from the CommandGetter job. + Only devices that actually responded with data should be considered for the sync. + """ + return diffsync.job.devices_to_load + + @classmethod + def create(cls, diffsync, ids, attrs): + """ + Do not create new devices. + + Network devices need to exist in Nautobot prior to syncing data and + need to be included in the queryset generated based on job form inputs. + """ + diffsync.job.logger.error( + f"Network device {ids} is not included in the Nautobot devices " + "selected for syncing. This device either does not exist in Nautobot " + "or was not included based on filter criteria provided on the job form." + ) + return None + + def delete(self): + """Prevent device deletion.""" + self.diffsync.job.logger.error(f"{self} will not be deleted.") + return None + + +class SyncNetworkDataInterface(FilteredNautobotModel): + """Shared data model representing an Interface.""" + + _modelname = "interface" + _model = Interface + _identifiers = ( + "device__name", + "name", + ) + _attributes = ( + "status__name", + "type", + "mac_address", + "mtu", + # "parent_interface__name", + "mode", + "enabled", + "description", + ) + + device__name: str + name: str + + status__name: Optional[str] + type: Optional[str] + mac_address: Optional[str] + mtu: Optional[str] + parent_interface__name: Optional[str] + lag__name: Optional[str] + mode: Optional[str] + enabled: Optional[bool] + description: Optional[str] + + +class SyncNetworkDataIPAddress(DiffSyncModel): + """Shared data model representing an IPAddress.""" + + _modelname = "ip_address" + _identifiers = ("host",) + _attributes = ("type", "ip_version", "mask_length", "status__name") + + host: str + + mask_length: int + type: str + ip_version: int + status__name: str + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create a new IPAddress object.""" + diffsync_utils.get_or_create_ip_address( + host=ids["host"], + mask_length=attrs["mask_length"], + namespace=diffsync.job.namespace, + default_ip_status=diffsync.job.ip_address_status, + default_prefix_status=diffsync.job.default_prefix_status, + job=diffsync.job, + ) + return super().create(diffsync, ids, attrs) + + def update(self, attrs): + """Update an existing IPAddress object.""" + try: + ip_address = IPAddress.objects.get(host=self.host, parent__namespace=self.diffsync.job.namespace) + except ObjectDoesNotExist as err: + self.job.logger.error(f"{self} failed to update, {err}") + if attrs.get("mask_length"): + ip_address.mask_length = attrs["mask_length"] + if attrs.get("status__name"): + ip_address.status = Status.objects.get(name=attrs["status__name"]) + if attrs.get("ip_version"): + ip_address.ip_version = attrs["ip_version"] + try: + ip_address.validated_save() + except ValidationError as err: + self.job.logger.error(f"{self} failed to update, {err}") + + return super().update(attrs) + + +class SyncNetworkDataIPAddressToInterface(FilteredNautobotModel): + """Shared data model representing an IPAddressToInterface.""" + + _modelname = "ipaddress_to_interface" + _model = IPAddressToInterface + _identifiers = ("interface__device__name", "interface__name", "ip_address__host") + + interface__device__name: str + interface__name: str + ip_address__host: str + + @classmethod + def _get_queryset(cls, diffsync: "DiffSync"): + """Get the queryset used to load the models data from Nautobot.""" + return IPAddressToInterface.objects.filter(interface__device__in=diffsync.job.devices_to_load) + + +class SyncNetworkDataVLAN(DiffSyncModel): + """Shared data model representing a VLAN.""" + + _model = VLAN + _modelname = "vlan" + _identifiers = ("vid", "name", "location__name") + + vid: int + name: str + location__name: str + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create a new VLAN.""" + location = None + try: + location = Location.objects.get(name=ids["location__name"]) + except ObjectDoesNotExist: + diffsync.job.logger.warning( + f"While creating VLAN {ids['vid']} - {ids['name']}, " + f"unable to find a Location with name: {ids['location__name']}. " + "This VLAN will be created without a Location" + ) + except MultipleObjectsReturned: + diffsync.job.logger.warning( + f"While creating VLAN {ids['vid']} - {ids['name']}, " + f"Multiple Locations were found with name: {ids['location__name']}. " + "This VLAN will be created without a Location" + ) + try: + vlan = VLAN( + name=ids["name"], + vid=ids["vid"], + location=location, + status=Status.objects.get(name="Active"), # TODO: this can't be hardcoded, add a form input + ) + vlan.validated_save() + except ValidationError as err: + diffsync.job.logger.error(f"VLAN {vlan} failed to create, {err}") + + return super().create(diffsync, ids, attrs) + + +class SyncNetworkDataTaggedVlansToInterface(DiffSyncModel): + """Shared data model representing a TaggedVlanToInterface.""" + + _modelname = "tagged_vlans_to_interface" + _identifiers = ("device__name", "name") + _attributes = ("tagged_vlans",) + + device__name: str + name: str + + tagged_vlans: Optional[list] + + @classmethod + def _get_and_assign_tagged_vlans(cls, diffsync, attrs, interface): + """Loop through the tagged vlans for an interface and assign them.""" + for network_vlan in attrs["tagged_vlans"]: + try: + nautobot_vlan = VLAN.objects.get( + name=network_vlan["name"], vid=network_vlan["id"], location=interface.device.location + ) + interface.tagged_vlans.add(nautobot_vlan) + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign tagged vlan to {interface.device}:{interface}, unable to locate a vlan " + f"with attributes [name: {network_vlan['name']}, vid: {network_vlan['id']} " + f"location: {interface.device.location}]" + ) + raise diffsync_exceptions.ObjectNotCreated + + @classmethod + def create(cls, diffsync, ids, attrs): + """Assign tagged vlans to an interface.""" + if attrs.get("tagged_vlans"): + try: + interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign tagged vlans {attrs['tagged_vlans']}. An interface with " + f"attributes: [device__name: {ids['device__name']} name: {ids['name']}] was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + cls._get_and_assign_tagged_vlans(diffsync, attrs, interface) + if interface: + try: + interface.validated_save() + except ValidationError as err: + diffsync.job.logger.error( + f"Failed to assign tagged vlans {attrs['tagged_vlans']} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotCreated + return super().create(diffsync, ids, attrs) + + def update(self, attrs): + """Update tagged vlans.""" + if attrs.get("tagged_vlans"): + try: + interface = Interface.objects.get(**self.get_identifiers()) + interface.tagged_vlans.clear() + except ObjectDoesNotExist: + self.diffsync.job.logger.error( + f"Failed to assign tagged vlans {attrs['tagged_vlans']}. An interface with " + f"attributes: [{self.get_identifiers}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated + self._get_and_assign_tagged_vlans(self.diffsync, attrs, interface) + try: + interface.validated_save() + except ValidationError as err: + self.diffsync.job.logger.error( + f"Failed to assign tagged vlans {attrs['tagged_vlans']} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotUpdated + return super().update(attrs) + + +class SyncNetworkDataUnTaggedVlanToInterface(DiffSyncModel): + """Shared data model representing a UnTaggedVlanToInterface.""" + + _modelname = "untagged_vlan_to_interface" + _identifiers = ("device__name", "name") + _attributes = ("untagged_vlan",) + + device__name: str + name: str + + untagged_vlan: Optional[dict] + + @classmethod + def _get_and_assign_untagged_vlan(cls, diffsync, attrs, interface): + """Assign an untagged vlan to an interface.""" + try: + vlan = VLAN.objects.get( + name=attrs["untagged_vlan"]["name"], + vid=attrs["untagged_vlan"]["id"], + location=interface.device.location, + ) + interface.untagged_vlan = vlan + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign untagged vlan to {interface.device}:{interface}, unable to locate a vlan with " + f"attributes [name: {attrs['untagged_vlan']['name']}, vid: {attrs['untagged_vlan']['id']} " + f"location: {interface.device.location}]" + ) + raise diffsync_exceptions.ObjectNotCreated + + @classmethod + def create(cls, diffsync, ids, attrs): + """Assign an untagged vlan to an interface.""" + if attrs.get("untagged_vlan"): + try: + interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign untagged vlan {attrs['untagged_vlan']}. An interface with " + f"attributes: [device__name: {ids['device__name']} name: {ids['name']}] was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + cls._get_and_assign_untagged_vlan(diffsync, attrs, interface) + try: + interface.validated_save() + except ValidationError as err: + diffsync.job.logger.error( + f"Failed to assign untagged vlan {attrs['untagged_vlan']} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotCreated + return super().create(diffsync, ids, attrs) + + def update(self, attrs): + """Update the untagged vlan on an interface.""" + if attrs.get("untagged_vlan"): + try: + interface = Interface.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist: + self.diffsync.job.logger.error( + f"Failed to assign untagged vlan {attrs['untagged_vlan']}. An interface with " + f"attributes: [{self.get_identifiers}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated + self._get_and_assign_untagged_vlan(self.diffsync, attrs, interface) + try: + interface.validated_save() + except ValidationError as err: + self.diffsync.job.logger.error( + f"Failed to assign untagged vlans {attrs['untagged_vlan']} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotUpdated + return super().update(attrs) + + +class SyncNetworkDataLagToInterface(DiffSyncModel): + """Shared data model representing a LagToInterface.""" + + _modelname = "lag_to_interface" + _identifiers = ("device__name", "name") + _attributes = ("lag__interface__name",) + + device__name: str + name: str + + lag__interface__name: Optional[str] + + # TODO: move the create and update method locgic to a single utility function + @classmethod + def create(cls, diffsync, ids, attrs): + """Assign a lag to an interface.""" + if attrs["lag__interface__name"]: + try: + interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign lag {attrs['lag__interface__name']}. An interface with " + f"attributes: [device__name: {ids['device__name']} name: {ids['name']}] was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + if interface: + try: + lag_interface = Interface.objects.get( + name=attrs["lag__interface__name"], device=interface.device, type=InterfaceTypeChoices.TYPE_LAG + ) + interface.lag = lag_interface + interface.validated_save() + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign lag to {interface.device}:{interface}, unable to locate a lag interface " + f"with attributes [name: {attrs['lag__interface__name']}, device: {interface.device.name} " + f"type: {InterfaceTypeChoices.TYPE_LAG}]" + ) + raise diffsync_exceptions.ObjectNotCreated + except ValidationError as err: + diffsync.job.logger.error( + f"Failed to assign lag {lag_interface} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotCreated + return super().create(diffsync, ids, attrs) + + def update(self, attrs): + """Update and interface lag.""" + if attrs.get("lag__interface__name"): + try: + interface = Interface.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist: + self.diffsync.job.logger.error( + f"Failed to assign untagged lag {attrs['lag__interface__name']}. " + f"An interface with attributes: [{self.get_identifiers}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated + try: + lag_interface = Interface.objects.get( + name=attrs["lag__interface__name"], device=interface.device, type=InterfaceTypeChoices.TYPE_LAG + ) + interface.lag = lag_interface + interface.validated_save() + except ObjectDoesNotExist: + self.diffsync.job.logger.error( + f"Failed to assign lag to {interface}, unable to locate a lag interface " + f"with attributes [name: {attrs['lag__interface__name']}, device: {interface.device.name} " + f"type: {InterfaceTypeChoices.TYPE_LAG}]" + ) + raise diffsync_exceptions.ObjectNotUpdated + except ValidationError as err: + self.diffsync.job.logger.error( + f"Failed to assign lag {lag_interface} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotUpdated + + return super().update(attrs) + + +class SyncNetworkDataVRF(FilteredNautobotModel): + """Shared data model representing a VRF.""" + + _modelname = "vrf" + _model = VRF + _identifiers = ("name", "namespace__name") + + name: str + namespace__name: str + + +class SyncNetworkDataVrfToInterface(DiffSyncModel): + """Shared data model representing a VrfToInterface.""" + + _modelname = "vrf_to_interface" + _identifiers = ("device__name", "name") + _attributes = ("vrf",) + + device__name: str + name: str + + vrf: Optional[dict] + + @classmethod + def _get_and_assign_vrf(cls, diffsync, attrs, interface): + """Assign a vrf to an interface.""" + try: + vrf = VRF.objects.get( + name=attrs["vrf"]["name"], + rd=None, + namespace=diffsync.job.namespace, + ) + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign vrf to {interface.device}:{interface}, unable to locate a vrf with attributes " + f"[name: {attrs['vrf']['name']}" + f"namespace: {diffsync.job.namespace}]" + ) + raise diffsync_exceptions.ObjectNotCreated + except MultipleObjectsReturned: + diffsync.job.logger.error( + f"Failed to assign vrf to {interface.device}:{interface}, there are multipple vrfs with attributes " + f"[name: {attrs['vrf']['name']}" + f"namespace: {diffsync.job.namespace}]. " + "Unsure which to assign." + ) + raise diffsync_exceptions.ObjectNotCreated + try: + vrf.devices.add(interface.device) + vrf.validated_save() + except Exception as err: + diffsync.logger.error(f"Failed to assign device: {interface.device} to vrf: {vrf}, {err}") + raise diffsync_exceptions.ObjectNotCreated + interface.vrf = vrf + + @classmethod + def create(cls, diffsync, ids, attrs): + """Assign a vrf to an interface.""" + if attrs.get("vrf"): + try: + interface = Interface.objects.get(device__name=ids["device__name"], name=ids["name"]) + except ObjectDoesNotExist: + diffsync.job.logger.error( + f"Failed to assign vrf {attrs['vrf']}. An interface with attributes: " + f"[device__name: {ids['device__name']} name: {ids['name']}] was not found." + ) + raise diffsync_exceptions.ObjectNotCreated + cls._get_and_assign_vrf(diffsync, attrs, interface) + try: + interface.validated_save() + except ValidationError as err: + diffsync.job.logger.error( + f"Failed to assign vrf {attrs['vrf']} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotCreated + return super().create(diffsync, ids, attrs) + + def update(self, attrs): + """Update the vrf on an interface.""" + if attrs.get("vrf"): + try: + interface = Interface.objects.get(**self.get_identifiers()) + except ObjectDoesNotExist: + self.diffsync.job.logger.error( + f"Failed to assign vrf {attrs['vrf']['name']}. " + f"An interface with attributes: [{self.get_identifiers}] was not found." + ) + raise diffsync_exceptions.ObjectNotUpdated + self._get_and_assign_vrf(self.diffsync, attrs, interface) + try: + interface.validated_save() + except ValidationError as err: + self.diffsync.job.logger.error( + f"Failed to assign vrf {attrs['vrf']} to {interface} on {interface.device}, {err}" + ) + raise diffsync_exceptions.ObjectNotUpdated + return super().update(attrs) + + +# TODO: Cable Model diff --git a/nautobot_device_onboarding/migrations/0001_initial.py b/nautobot_device_onboarding/migrations/0001_initial.py index db85e40b..0c555c5a 100644 --- a/nautobot_device_onboarding/migrations/0001_initial.py +++ b/nautobot_device_onboarding/migrations/0001_initial.py @@ -1,9 +1,10 @@ # Generated by Django 3.1.3 on 2021-02-22 03:40 -from django.db import migrations, models -import django.db.models.deletion import uuid +import django.db.models.deletion +from django.db import migrations, models + class Migration(migrations.Migration): initial = True diff --git a/nautobot_device_onboarding/migrations/0001_squash__0001_0004_0005_0006.py b/nautobot_device_onboarding/migrations/0001_squash__0001_0004_0005_0006.py index 8e3cb92d..5e9ccf3f 100644 --- a/nautobot_device_onboarding/migrations/0001_squash__0001_0004_0005_0006.py +++ b/nautobot_device_onboarding/migrations/0001_squash__0001_0004_0005_0006.py @@ -2,8 +2,8 @@ import uuid -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models from nautobot.extras.models import RoleField diff --git a/nautobot_device_onboarding/migrations/0004_migrate_to_extras_role_part_1.py b/nautobot_device_onboarding/migrations/0004_migrate_to_extras_role_part_1.py index 5f531fe2..7daeb497 100644 --- a/nautobot_device_onboarding/migrations/0004_migrate_to_extras_role_part_1.py +++ b/nautobot_device_onboarding/migrations/0004_migrate_to_extras_role_part_1.py @@ -1,5 +1,4 @@ from django.db import migrations, models - from nautobot.extras.models import RoleField diff --git a/nautobot_device_onboarding/nautobot_keeper.py b/nautobot_device_onboarding/nautobot_keeper.py index 062bb52f..4f8e4265 100644 --- a/nautobot_device_onboarding/nautobot_keeper.py +++ b/nautobot_device_onboarding/nautobot_keeper.py @@ -1,20 +1,17 @@ """Nautobot Keeper.""" -import logging import ipaddress +import logging from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from nautobot.apps.choices import PrefixTypeChoices from nautobot.dcim.choices import InterfaceTypeChoices -from nautobot.dcim.models import Manufacturer, Device, Interface, DeviceType -from nautobot.extras.models import Role -from nautobot.dcim.models import Platform -from nautobot.dcim.models import Location -from nautobot.extras.models import Status +from nautobot.dcim.models import Device, DeviceType, Interface, Location, Manufacturer, Platform +from nautobot.extras.models import Role, Status from nautobot.extras.models.customfields import CustomField -from nautobot.ipam.models import IPAddress, Prefix, Namespace +from nautobot.ipam.models import IPAddress, Namespace, Prefix from nautobot_device_onboarding.constants import NETMIKO_TO_NAPALM_STATIC from nautobot_device_onboarding.exceptions import OnboardException diff --git a/nautobot_device_onboarding/netdev_keeper.py b/nautobot_device_onboarding/netdev_keeper.py index 89f64471..f289f9ab 100644 --- a/nautobot_device_onboarding/netdev_keeper.py +++ b/nautobot_device_onboarding/netdev_keeper.py @@ -6,18 +6,15 @@ from django.conf import settings from napalm import get_network_driver -from napalm.base.exceptions import ConnectionException, CommandErrorException +from napalm.base.exceptions import CommandErrorException, ConnectionException from napalm.base.netmiko_helpers import netmiko_args -from netmiko import SSHDetect -from netmiko import NetMikoAuthenticationException -from netmiko import NetMikoTimeoutException -from paramiko.ssh_exception import SSHException - from nautobot.dcim.models import Platform +from netmiko import NetMikoAuthenticationException, NetMikoTimeoutException, SSHDetect +from paramiko.ssh_exception import SSHException -from nautobot_device_onboarding.onboarding.onboarding import StandaloneOnboarding from nautobot_device_onboarding.constants import NETMIKO_TO_NAPALM_STATIC from nautobot_device_onboarding.exceptions import OnboardException +from nautobot_device_onboarding.onboarding.onboarding import StandaloneOnboarding logger = logging.getLogger("rq.worker") diff --git a/nautobot_device_onboarding/onboarding/onboarding.py b/nautobot_device_onboarding/onboarding/onboarding.py index bd67d96b..1c06a233 100644 --- a/nautobot_device_onboarding/onboarding/onboarding.py +++ b/nautobot_device_onboarding/onboarding/onboarding.py @@ -3,7 +3,7 @@ from nautobot_device_onboarding.nautobot_keeper import NautobotKeeper -class Onboarding: # pylint: disable=too-few-public-methods +class Onboarding: """Generic onboarding class.""" def __init__(self): @@ -16,7 +16,7 @@ def run(self, onboarding_kwargs): raise NotImplementedError -class StandaloneOnboarding(Onboarding): # pylint: disable=too-few-public-methods +class StandaloneOnboarding(Onboarding): """Standalone onboarding class.""" def run(self, onboarding_kwargs): diff --git a/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture.csv b/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture.csv new file mode 100644 index 00000000..80ebf507 --- /dev/null +++ b/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture.csv @@ -0,0 +1,4 @@ +ip_address_host,location_parent_name,location_name,namespace,port,timeout,set_mgmt_only,update_devices_without_primary_ip,device_role_name,device_status_name,interface_status_name,ip_address_status_name,secrets_group_name,platform_name +10.1.1.10,Site A Parent,Site A,Global,22,30,TRUE,TRUE,Network,Active,Active,Active,test secrets group,cisco_ios +10.1.1.11,Site B Parent,Site B,Global,22,30,FALSE,FALSE,Network,Active,Active,Active,test secrets group,cisco_ios +10.1.1.12,,Site A Parent,Global,22,30,FALSE,FALSE,Network,Active,Active,Active,test secrets group,cisco_ios diff --git a/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_bad_data.csv b/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_bad_data.csv new file mode 100644 index 00000000..71eac735 --- /dev/null +++ b/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_bad_data.csv @@ -0,0 +1,10 @@ +ip_address_host,location_parent_name,location_name,namespace,port,timeout,set_mgmt_only,update_devices_without_primary_ip,device_role_name,device_status_name,interface_status_name,ip_address_status_name,secrets_group_name,platform_name +10.1.1.10,Site C Parent,Site A,Global,22,30,TRUE,TRUE,Network,Active,Active,Active,test secrets group,cisco_ios +10.1.1.11,Site A Parent,Site C,Global,22,30,TRUE,TRUE,Network,Active,Active,Active,test secrets group,cisco_ios +10.1.1.12,Site A Parent,Site A,BadNamespace,22,30,TRUE,TRUE,Network,Active,Active,Active,test secrets group,cisco_ios +10.1.1.13,Site A Parent,Site A,Global,22,30,TRUE,TRUE,BadRole,Active,Active,Active,test secrets group,cisco_ios +10.1.1.14,Site A Parent,Site A,Global,22,30,TRUE,TRUE,Network,BadStatus,Active,Active,test secrets group,cisco_ios +10.1.1.15,Site A Parent,Site A,Global,22,30,TRUE,TRUE,Network,Active,BadStatus,Active,test secrets group,cisco_ios +10.1.1.16,Site A Parent,Site A,Global,22,30,TRUE,TRUE,Network,Active,Active,BadStatus,test secrets group,cisco_ios +10.1.1.17,Site A Parent,Site A,Global,22,30,TRUE,TRUE,Network,Active,Active,Active,BadSecretsGroup,cisco_ios +10.1.1.18,Site A Parent,Site A,Global,22,30,TRUE,TRUE,Network,Active,Active,Active,test secrets group,BadPlatform \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_empty.csv b/nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_empty.csv new file mode 100644 index 00000000..e69de29b diff --git a/nautobot_device_onboarding/tests/fixtures/sync_devices_fixture.py b/nautobot_device_onboarding/tests/fixtures/sync_devices_fixture.py new file mode 100644 index 00000000..1c397754 --- /dev/null +++ b/nautobot_device_onboarding/tests/fixtures/sync_devices_fixture.py @@ -0,0 +1,85 @@ +"""Data fixture for use in testing.""" + +sync_devices_mock_data_single_device_valid = { + "10.1.1.10": { + "hostname": "test device 1", + "serial": "test-serial-abc", + "device_type": "CSR1000V17", + "mgmt_interface": "GigabitEthernet1", + "manufacturer": "Cisco", + "platform": "cisco_nxos", + "network_driver": "cisco_nxos", + "mask_length": 24, + }, +} +sync_devices_mock_data_single_device_alternate_valid = { + "192.1.1.10": { + "hostname": "test device 1", + "serial": "test-serial-abc", + "device_type": "CSR1000V17", + "mgmt_interface": "NewInterfaceName", + "manufacturer": "Cisco", + "platform": "cisco_nxos", + "network_driver": "cisco_nxos", + "mask_length": 24, + }, +} + +sync_devices_mock_data_valid = { + "10.1.1.10": { + "hostname": "demo-cisco-1", + "serial": "9ABUXU5882222", + "device_type": "CSR1000V2", + "mgmt_interface": "GigabitEthernet1", + "manufacturer": "Cisco", + "platform": "cisco_ios", + "network_driver": "cisco_ios", + "mask_length": 24, + }, + "10.1.1.11": { + "hostname": "demo-cisco-2", + "serial": "9ABUXU581111", + "device_type": "CSR1000V17", + "mgmt_interface": "GigabitEthernet1", + "manufacturer": "Cisco", + "platform": "cisco_ios", + "network_driver": "cisco_ios", + "mask_length": 16, + }, +} + +sync_devices_mock_data_invalid = { + "10.1.1.10": { + "hostname": "demo-cisco-1", + "serial": "", + "device_type": "CSR1000V2", + "mgmt_interface": "GigabitEthernet1", + "manufacturer": "Cisco", + "platform": "cisco_ios", + "network_driver": "cisco_ios", + "mask_length": 24, + }, + "10.1.1.11": { + "hostname": "demo-cisco-2", + "serial": "9ABUXU581111", + "device_type": "CSR1000V17", + "mgmt_interface": "GigabitEthernet1", + "manufacturer": "Cisco", + "platform": "cisco_xe", + "network_driver": "cisco_xe", + "mask_length": 16, + }, +} + +sync_devices_data_update = { + "10.1.1.10": { + "hostname": "test device 1", + "serial": "9ABUXU5882222", + "device_type": "Test model 2", + "mgmt_interface": "NewInterfaceName", + "manufacturer": "Cisco", + "platform": "cisco_xe", + "network_driver": "cisco_xe", + "mask_length": 24, + }, +} diff --git a/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py new file mode 100644 index 00000000..b56b4fdd --- /dev/null +++ b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py @@ -0,0 +1,161 @@ +"""Data fixture for use in testing.""" + +sync_network_mock_data_valid = { + "demo-cisco-1": { + "serial": "9ABUXU581111", + "interfaces": { + "GigabitEthernet1": { + "type": "100base-tx", + "ip_addresses": [ + {"ip_address": "10.1.1.10", "prefix_length": 16}, + ], + "mac_address": "d8b1.905c.7130", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "tagged", + "lag": "", + "untagged_vlan": {"name": "vlan60", "id": "60"}, + "tagged_vlans": [{"name": "vlan40", "id": "40"}], + "vrf": {"name": "vrf1"}, + }, + "GigabitEthernet2": { + "type": "100base-tx", + "ip_addresses": [ + {"ip_address": "10.1.1.1", "prefix_length": 24}, + ], + "mac_address": "d8b1.905c.7131", + "mtu": "1500", + "description": "uplink Po1", + "link_status": True, + "802.1Q_mode": "", + "lag": "Po2", + "untagged_vlan": {}, + "tagged_vlans": [], + "vrf": {}, + }, + "GigabitEthernet3": { + "type": "100base-tx", + "ip_addresses": [ + {"ip_address": "10.1.1.2", "prefix_length": 24}, + {"ip_address": "10.1.1.3", "prefix_length": 22}, + ], + "mac_address": "d8b1.905c.7132", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "tagged", + "lag": "Po1", + "untagged_vlan": {}, + "tagged_vlans": [{"name": "vlan40", "id": "40"}, {"name": "vlan50", "id": "50"}], + "vrf": {"name": "mgmt"}, + }, + "GigabitEthernet4": { + "type": "100base-tx", + "ip_addresses": [ + {"ip_address": "10.1.1.4", "prefix_length": 20}, + ], + "mac_address": "d8b1.905c.7133", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "", + "lag": "", + "untagged_vlan": {}, + "tagged_vlans": [], + "vrf": {}, + }, + "Po1": { + "type": "lag", + "ip_addresses": [], + "mac_address": "d8b1.905c.7134", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "", + "lag": "", + "untagged_vlan": {}, + "tagged_vlans": [], + "vrf": {"name": "mgmt"}, + }, + "Po2": { + "type": "lag", + "ip_addresses": [], + "mac_address": "d8b1.905c.7135", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "", + "lag": "", + "untagged_vlan": "", + "tagged_vlans": [], + "vrf": {"name": "mgmt"}, + }, + }, + }, + "demo-cisco-2": { + "serial": "9ABUXU5882222", + "interfaces": { + "GigabitEthernet1": { + "type": "100base-tx", + "ip_addresses": [ + {"ip_address": "10.1.1.11", "prefix_length": 24}, + ], + "mac_address": "d8b1.905c.5170", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "tagged", + "lag": "", + "untagged_vlan": {"name": "vlan60", "id": "60"}, + "tagged_vlans": [{"name": "vlan40", "id": "40"}], + "vrf": {"name": "mgmt"}, + }, + "GigabitEthernet2": { + "type": "100base-tx", + "ip_addresses": [ + {"ip_address": "10.1.1.12", "prefix_length": 24}, + ], + "mac_address": "d8b1.905c.5171", + "mtu": "1500", + "description": "uplink Po1", + "link_status": True, + "802.1Q_mode": "", + "lag": "Po1", + "untagged_vlan": {}, + "tagged_vlans": [], + "vrf": {}, + }, + "GigabitEthernet3": { + "type": "100base-tx", + "ip_addresses": [ + {"ip_address": "10.1.1.13", "prefix_length": 24}, + {"ip_address": "10.1.1.14", "prefix_length": 22}, + ], + "mac_address": "d8b1.905c.5172", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "tagged", + "lag": "Po1", + "untagged_vlan": {}, + "tagged_vlans": [{"name": "vlan40", "id": "40"}, {"name": "vlan50", "id": "50"}], + "vrf": {"name": "mgmt"}, + }, + "Po1": { + "type": "lag", + "ip_addresses": [], + "mac_address": "d8b1.905c.5173", + "mtu": "1500", + "description": "", + "link_status": True, + "802.1Q_mode": "", + "lag": "", + "untagged_vlan": {}, + "tagged_vlans": [], + "vrf": {"name": "mgmt"}, + }, + }, + }, +} +failed_device = {"demo-cisco-3": {"failed": True, "failed_reason": "Authentication failure"}} diff --git a/nautobot_device_onboarding/tests/test_basic.py b/nautobot_device_onboarding/tests/test_basic.py index 30fc318e..2e5df1de 100644 --- a/nautobot_device_onboarding/tests/test_basic.py +++ b/nautobot_device_onboarding/tests/test_basic.py @@ -1,7 +1,8 @@ """Basic tests that do not require Django.""" -import unittest import os +import unittest + import toml diff --git a/nautobot_device_onboarding/tests/test_diffsync_utils.py b/nautobot_device_onboarding/tests/test_diffsync_utils.py new file mode 100644 index 00000000..0e756b2f --- /dev/null +++ b/nautobot_device_onboarding/tests/test_diffsync_utils.py @@ -0,0 +1,137 @@ +"""Test Cisco Support adapter.""" + +from unittest.mock import MagicMock + +from nautobot.core.testing import TestCase +from nautobot.ipam.models import IPAddress, Prefix + +from nautobot_device_onboarding.tests import utils +from nautobot_device_onboarding.tests.fixtures import sync_network_data_fixture +from nautobot_device_onboarding.utils.diffsync_utils import ( + check_data_type, + generate_device_queryset_from_command_getter_result, + get_or_create_ip_address, + get_or_create_prefix, + retrieve_submitted_value, +) + + +class TestDiffSyncUtils(TestCase): + """Test Diffsync Utils functions.""" + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Nautobot Objectsself. + self.testing_objects = utils.sync_network_data_ensure_required_nautobot_objects() + self.command_getter_result = sync_network_data_fixture.sync_network_mock_data_valid + self.processed_csv_data = { + "10.1.1.10": { + "location": self.testing_objects["location"], + "namespace": self.testing_objects["namespace"], + "port": 22, + "timeout": 30, + "set_mgmt_only": True, + "update_devices_without_primary_ip": True, + "device_role": self.testing_objects["device_role"], + "device_status": self.testing_objects["status"], + "interface_status": self.testing_objects["status"], + "ip_address_status": self.testing_objects["status"], + "secrets_group": self.testing_objects["secrets_group"], + "platform": self.testing_objects["platform_1"], + }, + "10.1.1.11": { + "location": self.testing_objects["location"], + "namespace": self.testing_objects["namespace"], + "port": 22, + "timeout": 30, + "set_mgmt_only": True, + "update_devices_without_primary_ip": True, + "device_role": self.testing_objects["device_role"], + "device_status": self.testing_objects["status"], + "interface_status": self.testing_objects["status"], + "ip_address_status": self.testing_objects["status"], + "secrets_group": self.testing_objects["secrets_group"], + "platform": self.testing_objects["platform_2"], + }, + } + self.mock_job = MagicMock() + self.mock_job.location = self.testing_objects["location"] + self.mock_job.processed_csv_data = self.processed_csv_data + self.mock_job.location.name = "Site B" + self.mock_job.logger.error.return_value = None + self.mock_job.logger.warning.return_value = None + + def test_generate_device_queryset_from_command_getter_result(self): + """Test generating a queryset from data returned from command getter.""" + queryset = generate_device_queryset_from_command_getter_result(command_getter_result=self.command_getter_result) + hostnames_list = list(queryset.values_list("name", flat=True)) + self.assertEqual(2, queryset.count()) + self.assertIn("demo-cisco-1", hostnames_list) + self.assertIn("demo-cisco-2", hostnames_list) + + def test_check_data_type(self): + """Test argument data type is a dict""" + # test existing prefix + data_type_check_result = check_data_type(self.command_getter_result) + self.assertEqual(True, data_type_check_result) + + data_type_check_result = check_data_type("Bad Input") + self.assertEqual(False, data_type_check_result) + + def test_get_or_create_prefix(self): + """Test getting a prefix and creating one if necessary.""" + # test existing prefix + prefix = get_or_create_prefix( + host="1.1.1.10", + mask_length="24", + default_status=self.testing_objects["status"], + namespace=self.testing_objects["namespace"], + job=None, + ) + queryset = Prefix.objects.filter(prefix=f"{prefix.network}/{prefix.prefix_length}") + self.assertEqual(1, queryset.count()) + with self.assertRaises(Exception): + # test prefix failure + get_or_create_prefix( + host="192.1.1.10", + mask_length="24", + default_status="bad_status", + namespace=self.testing_objects["namespace"], + job=None, + ) + + def test_get_or_create_ip_address(self): + """Test getting an ip address and creating one if necessary.""" + ip_address = get_or_create_ip_address( + host="192.1.1.1", + mask_length=24, + namespace=self.testing_objects["namespace"], + default_ip_status=self.testing_objects["status"], + default_prefix_status=self.testing_objects["status"], + job=None, + ) + prefix_queryset = Prefix.objects.filter(prefix="192.1.1.0/24") + ip_address_queryset = IPAddress.objects.filter(address=ip_address.address) + self.assertEqual(1, prefix_queryset.count()) + self.assertEqual(1, ip_address_queryset.count()) + + with self.assertRaises(Exception): + # test ip_address failure + get_or_create_ip_address( + host="200.1.1.1", + mask_length=24, + namespace=self.testing_objects["namespace"], + default_ip_status="bad status", + default_prefix_status=self.testing_objects["status"], + job=None, + ) + + def test_retrieve_submitted_value(self): + """Test retrieving values from processed csv data.""" + + location = retrieve_submitted_value(job=self.mock_job, ip_address="10.1.1.10", query_string="location") + self.assertEqual(self.testing_objects["location"].name, location.name) + + self.mock_job.processed_csv_data = None + location = retrieve_submitted_value(job=self.mock_job, ip_address="10.1.1.10", query_string="location") + self.assertEqual(self.mock_job.location.name, location.name) diff --git a/nautobot_device_onboarding/tests/test_jobs.py b/nautobot_device_onboarding/tests/test_jobs.py new file mode 100644 index 00000000..04f4df4c --- /dev/null +++ b/nautobot_device_onboarding/tests/test_jobs.py @@ -0,0 +1,187 @@ +"""Test Jobs.""" + +from unittest.mock import patch + +from nautobot.apps.testing import create_job_result_and_run_job +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Device, Interface, Manufacturer, Platform +from nautobot.extras.choices import JobResultStatusChoices + +from nautobot_device_onboarding import jobs +from nautobot_device_onboarding.tests import utils +from nautobot_device_onboarding.tests.fixtures import sync_devices_fixture, sync_network_data_fixture + + +class SSOTSyncDevicesTestCase(TransactionTestCase): + """Test SSOTSyncDevices class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Nautobot Objects + self.testing_objects = utils.sync_devices_ensure_required_nautobot_objects__jobs_testing() + + @patch("nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters.sync_devices_command_getter") + def test_sync_devices__success(self, device_data): + """Test a successful run of the 'Sync Devices From Network' job""" + device_data.return_value = sync_devices_fixture.sync_devices_mock_data_valid + + job_form_inputs = { + "debug": True, + "dryrun": False, + "csv_file": None, + "location": self.testing_objects["location_1"].pk, + "namespace": self.testing_objects["namespace"].pk, + "ip_addresses": "10.1.1.10,10.1.1.11", + "port": 22, + "timeout": 30, + "set_mgmt_only": True, + "update_devices_without_primary_ip": True, + "device_role": self.testing_objects["device_role"].pk, + "device_status": self.testing_objects["status"].pk, + "interface_status": self.testing_objects["status"].pk, + "ip_address_status": self.testing_objects["status"].pk, + "secrets_group": self.testing_objects["secrets_group"].pk, + "platform": None, + "memory_profiling": False, + } + job_result = create_job_result_and_run_job( + module="nautobot_device_onboarding.jobs", name="SSOTSyncDevices", **job_form_inputs + ) + + self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS) + self.assertEqual(2, Device.objects.all().count()) + for returned_device_ip, data in device_data.return_value.items(): + device = Device.objects.get(serial=data["serial"]) + self.assertEqual(device.name, data["hostname"]) + self.assertEqual(device.serial, data["serial"]) + self.assertEqual(device.device_type.model, data["device_type"]) + self.assertEqual(device.device_type.manufacturer.name, data["manufacturer"]) + self.assertEqual(device.platform.name, data["platform"]) + self.assertEqual(device.platform.network_driver, data["network_driver"]) + self.assertEqual(device.primary_ip.host, returned_device_ip) + self.assertEqual(device.primary_ip.mask_length, data["mask_length"]) + + mgmt_interface = Interface.objects.get(device=device, name=data["mgmt_interface"]) + self.assertEqual(mgmt_interface.mgmt_only, True) + self.assertIn(returned_device_ip, list(mgmt_interface.ip_addresses.all().values_list("host", flat=True))) + + def test_process_csv_data(self): + """Test processing of CSV file used for onboarding jobs.""" + + manufacturer, _ = Manufacturer.objects.get_or_create(name="Cisco") + platform, _ = Platform.objects.get_or_create( + name="cisco_ios", network_driver="cisco_ios", manufacturer=manufacturer + ) + onboarding_job = jobs.SSOTSyncDevices() + with open("nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture.csv", "rb") as csv_file: + processed_csv_data = onboarding_job._process_csv_data(csv_file=csv_file) # pylint: disable=protected-access + self.assertEqual(processed_csv_data["10.1.1.10"]["location"], self.testing_objects["location_1"]) + self.assertEqual(processed_csv_data["10.1.1.10"]["namespace"], self.testing_objects["namespace"]) + self.assertEqual(processed_csv_data["10.1.1.10"]["port"], 22) + self.assertEqual(processed_csv_data["10.1.1.10"]["timeout"], 30) + self.assertEqual(processed_csv_data["10.1.1.10"]["set_mgmt_only"], True) + self.assertEqual(processed_csv_data["10.1.1.10"]["update_devices_without_primary_ip"], True) + self.assertEqual(processed_csv_data["10.1.1.10"]["device_role"], self.testing_objects["device_role"]) + self.assertEqual(processed_csv_data["10.1.1.10"]["device_status"], self.testing_objects["status"]) + self.assertEqual(processed_csv_data["10.1.1.10"]["interface_status"], self.testing_objects["status"]) + self.assertEqual(processed_csv_data["10.1.1.10"]["ip_address_status"], self.testing_objects["status"]) + self.assertEqual(processed_csv_data["10.1.1.10"]["secrets_group"], self.testing_objects["secrets_group"]) + self.assertEqual(processed_csv_data["10.1.1.10"]["platform"], platform) + + self.assertEqual(processed_csv_data["10.1.1.11"]["location"], self.testing_objects["location_2"]) + self.assertEqual(processed_csv_data["10.1.1.11"]["namespace"], self.testing_objects["namespace"]) + self.assertEqual(processed_csv_data["10.1.1.11"]["port"], 22) + self.assertEqual(processed_csv_data["10.1.1.11"]["timeout"], 30) + self.assertEqual(processed_csv_data["10.1.1.11"]["set_mgmt_only"], False) + self.assertEqual(processed_csv_data["10.1.1.11"]["update_devices_without_primary_ip"], False) + self.assertEqual(processed_csv_data["10.1.1.11"]["device_role"], self.testing_objects["device_role"]) + self.assertEqual(processed_csv_data["10.1.1.11"]["device_status"], self.testing_objects["status"]) + self.assertEqual(processed_csv_data["10.1.1.11"]["interface_status"], self.testing_objects["status"]) + self.assertEqual(processed_csv_data["10.1.1.11"]["ip_address_status"], self.testing_objects["status"]) + self.assertEqual(processed_csv_data["10.1.1.11"]["secrets_group"], self.testing_objects["secrets_group"]) + self.assertEqual(processed_csv_data["10.1.1.11"]["platform"], platform) + + def test_process_csv_data__bad_file(self): + """Test error checking of a bad CSV file used for onboarding jobs.""" + manufacturer, _ = Manufacturer.objects.get_or_create(name="Cisco") + Platform.objects.get_or_create(name="cisco_ios", network_driver="cisco_ios", manufacturer=manufacturer) + onboarding_job = jobs.SSOTSyncDevices() + with open("nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_bad_data.csv", "rb") as csv_file: + processed_csv_data = onboarding_job._process_csv_data(csv_file=csv_file) # pylint: disable=protected-access + self.assertEqual(processed_csv_data, None) + + def test_process_csv_data__empty_file(self): + """Test error checking of a bad CSV file used for onboarding jobs.""" + onboarding_job = jobs.SSOTSyncDevices() + with open("nautobot_device_onboarding/tests/fixtures/onboarding_csv_fixture_empty.csv", "rb") as csv_file: + processed_csv_data = onboarding_job._process_csv_data(csv_file=csv_file) # pylint: disable=protected-access + self.assertEqual(processed_csv_data, None) + + +class SSOTSyncNetworkDataTestCase(TransactionTestCase): + """Test SSOTSyncNetworkData class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Nautobot Objects + self.testing_objects = utils.sync_network_data_ensure_required_nautobot_objects() + + @patch("nautobot_device_onboarding.diffsync.adapters.sync_network_data_adapters.sync_network_data_command_getter") + def test_sync_network_data__success(self, device_data): + """Test a successful run of the 'Sync Network Data From Network' job""" + device_data.return_value = sync_network_data_fixture.sync_network_mock_data_valid + devices = ["demo-cisco-1", "demo-cisco-2"] + device_ids_to_sync = list(Device.objects.filter(name__in=devices).values_list("id", flat=True)) + + job_form_inputs = { + "debug": True, + "dryrun": False, + "sync_vlans": True, + "sync_vrfs": True, + "namespace": self.testing_objects["namespace"].pk, + "interface_status": self.testing_objects["status"].pk, + "ip_address_status": self.testing_objects["status"].pk, + "default_prefix_status": self.testing_objects["status"].pk, + "devices": device_ids_to_sync, + "location": None, + "device_role": None, + "platform": None, + "memory_profiling": False, + } + job_result = create_job_result_and_run_job( + module="nautobot_device_onboarding.jobs", name="SSOTSyncNetworkData", **job_form_inputs + ) + + self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS) + for returned_device_hostname, data in device_data.return_value.items(): + device = Device.objects.get(serial=data["serial"]) + self.assertEqual(device.name, returned_device_hostname) + for interface in device.interfaces.all(): + interface_data = data["interfaces"][interface.name] + self.assertEqual(interface.status, self.testing_objects["status"]) + self.assertEqual(interface.type, interface_data["type"]) + self.assertEqual(interface.mac_address, interface_data["mac_address"]) + self.assertEqual(interface.mtu, int(interface_data["mtu"])) + self.assertEqual(interface.description, interface_data["description"]) + self.assertEqual(interface.enabled, interface_data["link_status"]) + self.assertEqual(interface.mode, interface_data["802.1Q_mode"]) + + for ip_address in interface_data["ip_addresses"]: + self.assertIn( + ip_address["ip_address"], list(interface.ip_addresses.all().values_list("host", flat=True)) + ) + + for tagged_vlan in interface_data["tagged_vlans"]: + self.assertIn( + int(tagged_vlan["id"]), list(interface.tagged_vlans.all().values_list("vid", flat=True)) + ) + + if interface_data["untagged_vlan"]: + self.assertEqual(interface.untagged_vlan.vid, int(interface_data["untagged_vlan"]["id"])) + + if interface_data["vrf"]: + self.assertEqual(interface.vrf.name, interface_data["vrf"]["name"]) diff --git a/nautobot_device_onboarding/tests/test_nautobot_keeper.py b/nautobot_device_onboarding/tests/test_nautobot_keeper.py index a548180d..5cfe8cd3 100644 --- a/nautobot_device_onboarding/tests/test_nautobot_keeper.py +++ b/nautobot_device_onboarding/tests/test_nautobot_keeper.py @@ -4,11 +4,12 @@ from django.contrib.contenttypes.models import ContentType from django.test import TestCase from nautobot.dcim.choices import InterfaceTypeChoices -from nautobot.dcim.models import Location, LocationType, Manufacturer, DeviceType, Device, Interface, Platform -from nautobot.extras.models import Role, Status, CustomField -from nautobot.ipam.models import IPAddress +from nautobot.dcim.models import Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform from nautobot.extras.choices import CustomFieldTypeChoices +from nautobot.extras.models import CustomField, Role, Status from nautobot.extras.models.secrets import SecretsGroup +from nautobot.ipam.models import IPAddress + from nautobot_device_onboarding.exceptions import OnboardException from nautobot_device_onboarding.nautobot_keeper import NautobotKeeper diff --git a/nautobot_device_onboarding/tests/test_onboarding.py b/nautobot_device_onboarding/tests/test_onboarding.py index 019d2690..e2513064 100644 --- a/nautobot_device_onboarding/tests/test_onboarding.py +++ b/nautobot_device_onboarding/tests/test_onboarding.py @@ -1,20 +1,21 @@ """Unit tests for nautobot_device_onboarding.netdev_keeper module and its classes.""" -from unittest import mock - -from nautobot.apps.testing import TransactionTestCase, create_job_result_and_run_job -from nautobot.extras.models import JobLogEntry, Status -from nautobot.dcim.models import Device, Location, LocationType, Platform -from nautobot.ipam.models import Namespace +# from unittest import mock from django.conf import settings -from django.contrib.contenttypes.models import ContentType +# from django.test import TestCase +# from django.contrib.contenttypes.models import ContentType + + +# from nautobot.dcim.models import Device, Location, LocationType, Platform +# from nautobot.extras.models import Status + PLUGIN_SETTINGS = settings.PLUGINS_CONFIG["nautobot_device_onboarding"] -class NapalmMock: # pylint: disable=too-few-public-methods +class NapalmMock: """Base napalm mock class for tests.""" def __init__(self, *args, **kwargs): @@ -23,8 +24,26 @@ def __init__(self, *args, **kwargs): def open(self): """Mock test open ssh connection.""" - def close(self): - """Mock test close ssh connection.""" + +class NapalmMockNxos(NapalmMock): + """Mock napalm for nxos tests.""" + + def get_facts(self): + """Mock test get napalm facts.""" + return { + "uptime": 4066631, + "vendor": "Cisco", + "hostname": "nxos-spine1", + "fqdn": "nxos-spine1.domain.net", + "os_version": "7.3(1)D1(1) [build 7.3(1)D1(0.10)]", + "serial_number": "TM6017D760B", + "model": "NX-OSv Chassis", + "interface_list": ["mgmt0"], + } + + def get_interfaces_ip(self): + """Mock test get interface ip facts.""" + return {"mgmnt0": {"ipv4": {"1.1.1.1": {"prefix_length": 32}}}} class NapalmMockEos(NapalmMock): @@ -45,31 +64,10 @@ def get_facts(self): def get_interfaces_ip(self): """Mock test get napalm interfaces on eos.""" - return {"Vlan100": {"ipv4": {"1.1.1.1": {"prefix_length": 32}}}} - - -class NapalmMockNxos(NapalmMock): - """Mock napalm for nxos tests.""" - - def get_facts(self): - """Mock test get napalm facts.""" - return { - "uptime": 4066631, - "vendor": "Cisco", - "hostname": "nxos-spine1", - "fqdn": "nxos-spine1.domain.net", - "os_version": "7.3(1)D1(1) [build 7.3(1)D1(0.10)]", - "serial_number": "TM6017D760B", - "model": "NX-OSv Chassis", - "interface_list": ["mgmt0"], - } - - def get_interfaces_ip(self): - """Mock test get interface ip facts.""" - return {"mgmnt0": {"ipv4": {"2.2.2.2": {"prefix_length": 32}}}} + return {"Vlan100": {"ipv4": {"2.2.2.2": {"prefix_length": 32}}}} -class SSHDetectMock: # pylint: disable=too-few-public-methods +class SSHDetectMock: """SSHDetect mock class for tests.""" def __init__(self, *args, **kwargs): @@ -80,103 +78,59 @@ def autodetect(self): return self.driver -class OnboardingTestCase(TransactionTestCase): - """Test the OnboardingManager Class.""" - - def setUp(self): - """Prepare test objects.""" - super().setUp() - # Default objects are removed after each test. Recreate Namespace if needed - if not Namespace.objects.filter(name="Global").exists(): - Namespace.objects.create(name="Global") - - PLUGIN_SETTINGS["platform_map"] = {} # Reset platform map to default - status = Status.objects.get(name="Active") - location_type = LocationType.objects.create(name="site") - location_type.content_types.set([ContentType.objects.get_for_model(Device)]) - self.site = Location.objects.create(name="TEST_SITE", location_type=location_type, status=status) - self.eos_platform = Platform.objects.create(name="arista_eos", napalm_driver="eos") - - self.onboarding_task1 = { - "ip_address": "1.1.1.1", - "location": self.site.id, - "platform": self.eos_platform.id, - "port": 443, - "credentials": None, - "timeout": 10, - "device_type": None, - "role": None, - "continue_on_failure": False, - } - self.onboarding_task2 = { - "ip_address": "2.2.2.2", - "location": self.site.id, - "platform": None, - "port": 22, - "credentials": None, - "timeout": 10, - "device_type": None, - "role": None, - "continue_on_failure": False, - } +# class OnboardingTestCase(TestCase): +# """Test the OnboardingManager Class.""" + +# def setUp(self): +# """Prepare test objects.""" +# PLUGIN_SETTINGS["platform_map"] = {} # Reset platform map to default +# status = Status.objects.get(name="Active") +# location_type = LocationType.objects.create(name="site") +# location_type.content_types.set([ContentType.objects.get_for_model(Device)]) +# self.site = Location.objects.create(name="TEST_SITE", location_type=location_type, status=status) +# self.eos_platform = Platform.objects.create(name="arista_eos", napalm_driver="eos") + +# self.onboarding_task1 = OnboardingTask.objects.create(ip_address="1.1.1.1", location=self.site) +# self.onboarding_task2 = OnboardingTask.objects.create( +# ip_address="2.2.2.2", location=self.site, platform=self.eos_platform, port=443 +# ) + +# # Patch socket as it would be able to verify connectivity +# self.patcher = mock.patch("nautobot_device_onboarding.netdev_keeper.socket") +# self.patcher.start() + +# def tearDown(self): +# """Disable patch on socket.""" +# self.patcher.stop() + +# @mock.patch("nautobot_device_onboarding.netdev_keeper.SSHDetect") +# @mock.patch("nautobot_device_onboarding.netdev_keeper.get_network_driver") +# def test_onboarding_nxos(self, mock_napalm, mock_ssh_detect): +# """Test device onboarding nxos.""" + +# mock_napalm.return_value = NapalmMockNxos +# mock_ssh_detect.return_value = SSHDetectMock("cisco_nxos") + +# # Run onboarding +# on_manager = OnboardingManager(self.onboarding_task1, "user", "pass", "secret") + +# self.assertEqual(on_manager.created_device.name, "nxos-spine1") +# self.assertEqual(on_manager.created_device.platform.name, "cisco_nxos") +# self.assertEqual(on_manager.created_device.platform.napalm_driver, "nxos_ssh") +# self.assertEqual(str(on_manager.created_device.primary_ip4), "1.1.1.1/32") + +# @mock.patch("nautobot_device_onboarding.netdev_keeper.SSHDetect") +# @mock.patch("nautobot_device_onboarding.netdev_keeper.get_network_driver") +# def test_onboarding_eos(self, mock_napalm, mock_ssh_detect): +# """Test device onboarding eos.""" + +# mock_napalm.return_value = NapalmMockEos +# mock_ssh_detect.return_value = SSHDetectMock("arista_eos") + +# # Run onboarding +# on_manager = OnboardingManager(self.onboarding_task2, "user", "pass", "secret") - # Patch socket as it would be able to verify connectivity - self.patcher = mock.patch("nautobot_device_onboarding.netdev_keeper.socket") - self.patcher.start() - - def tearDown(self): - """Disable patch on socket.""" - super().tearDown() - self.patcher.stop() - - @mock.patch("nautobot_device_onboarding.netdev_keeper.get_network_driver") - def test_onboarding_eos(self, mock_napalm): - """Test device onboarding eos.""" - - mock_napalm.return_value = NapalmMockEos - - job_result = create_job_result_and_run_job( - module="nautobot_device_onboarding.jobs", - name="OnboardingTask", - **self.onboarding_task1, - ) - # Get Job log messages - job_logs = list(JobLogEntry.objects.filter(job_result=job_result)) - job_logs = [log.message for log in job_logs] - - created_device = Device.objects.get(name="arista-device") - - self.assertEqual(job_result.status, "SUCCESS", (job_result.status, job_logs)) - self.assertIn("Successfully onboarded arista-device with a management IP of 1.1.1.1", job_logs, job_logs) - self.assertEqual(created_device.name, "arista-device") - self.assertEqual(created_device.platform.name, "arista_eos") - self.assertEqual(created_device.platform.napalm_driver, "eos") - self.assertEqual(str(created_device.primary_ip4), "1.1.1.1/32") - - @mock.patch("nautobot_device_onboarding.netdev_keeper.SSHDetect") - @mock.patch("nautobot_device_onboarding.netdev_keeper.get_network_driver") - def test_onboarding_nxos(self, mock_napalm, mock_ssh_detect): - """Test device onboarding nxos.""" - - mock_napalm.return_value = NapalmMockNxos - mock_ssh_detect.return_value = SSHDetectMock("cisco_nxos") - - # Run onboarding - job_result = create_job_result_and_run_job( - module="nautobot_device_onboarding.jobs", - name="OnboardingTask", - **self.onboarding_task2, - ) - - # Get Job log messages - job_logs = list(JobLogEntry.objects.filter(job_result=job_result)) - job_logs = [log.message for log in job_logs] - - created_device = Device.objects.get(name="nxos-spine1") - - self.assertEqual(job_result.status, "SUCCESS", job_result.status) - self.assertIn("Successfully onboarded nxos-spine1 with a management IP of 2.2.2.2", job_logs, job_logs) - self.assertEqual(created_device.name, "nxos-spine1") - self.assertEqual(created_device.platform.name, "cisco_nxos") - self.assertEqual(created_device.platform.napalm_driver, "nxos_ssh") - self.assertEqual(str(created_device.primary_ip4), "2.2.2.2/32") +# self.assertEqual(on_manager.created_device.name, "arista-device") +# self.assertEqual(on_manager.created_device.platform.name, "arista_eos") +# self.assertEqual(on_manager.created_device.platform.napalm_driver, "eos") +# self.assertEqual(str(on_manager.created_device.primary_ip4), "2.2.2.2/32") diff --git a/nautobot_device_onboarding/tests/test_sync_devices_adapters.py b/nautobot_device_onboarding/tests/test_sync_devices_adapters.py new file mode 100644 index 00000000..790b4335 --- /dev/null +++ b/nautobot_device_onboarding/tests/test_sync_devices_adapters.py @@ -0,0 +1,152 @@ +"""Test Cisco Support adapter.""" + +from unittest.mock import patch + +from diffsync.exceptions import ObjectNotFound +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Device, DeviceType, Manufacturer, Platform +from nautobot.extras.models import JobResult + +from nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters import ( + SyncDevicesNautobotAdapter, + SyncDevicesNetworkAdapter, +) +from nautobot_device_onboarding.jobs import SSOTSyncDevices +from nautobot_device_onboarding.tests import utils +from nautobot_device_onboarding.tests.fixtures import sync_devices_fixture + + +class SyncDevicesNetworkAdapaterTestCase(TransactionTestCase): + """Test SyncDevicesNetworkAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Job + self.job = SSOTSyncDevices() + self.job.job_result = JobResult.objects.create( + name=self.job.class_path, user=None, task_name="fake task", worker="default" + ) + self.sync_devices_adapter = SyncDevicesNetworkAdapter(job=self.job, sync=None) + + # Setup Nautobot Objects + self.testing_objects = utils.sync_devices_ensure_required_nautobot_objects() + + @patch("nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters.sync_devices_command_getter") + def test_load(self, device_data): + """Test loading data returned from command getter into the diffsync store.""" + + # Mock return from command_getter + device_data.return_value = sync_devices_fixture.sync_devices_mock_data_valid + + self.job.debug = True + self.job.ip_addresses = "" + self.job.location = self.testing_objects["location"] + self.job.namespace = self.testing_objects["namespace"] + self.job.port = 22 + self.job.timeout = 30 + self.job.update_devices_without_primary_ip = True + self.job.device_role = self.testing_objects["device_role"] + self.job.device_status = self.testing_objects["status"] + self.job.interface_status = self.testing_objects["status"] + self.job.ip_address_status = self.testing_objects["status"] + self.job.secrets_group = self.testing_objects["secrets_group"] + self.job.platform = None + + self.sync_devices_adapter.load() + + returned_device_data = self.sync_devices_adapter.device_data + + for device_ip, data in returned_device_data.items(): + unique_id = f"{self.testing_objects['location'].name}__{data['hostname']}__{data['serial']}" + diffsync_device = self.sync_devices_adapter.get("device", unique_id) + self.assertEqual(data["device_type"], diffsync_device.device_type__model) + self.assertEqual(self.testing_objects["location"].name, diffsync_device.location__name) + self.assertEqual(data["hostname"], diffsync_device.name) + self.assertEqual(data["platform"], diffsync_device.platform__name) + self.assertEqual(device_ip, diffsync_device.primary_ip4__host) + self.assertEqual(self.testing_objects["status"].name, diffsync_device.primary_ip4__status__name) + self.assertEqual(self.testing_objects["device_role"].name, diffsync_device.role__name) + self.assertEqual(self.testing_objects["status"].name, diffsync_device.status__name) + self.assertEqual(self.testing_objects["secrets_group"].name, diffsync_device.secrets_group__name) + self.assertEqual([data["mgmt_interface"]], diffsync_device.interfaces) + self.assertEqual(data["mask_length"], diffsync_device.mask_length) + self.assertEqual(data["serial"], diffsync_device.serial) + + +class SyncDevicesNautobotAdapterTestCase(TransactionTestCase): + """Test SyncDevicesNautobotAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Job + self.job = SSOTSyncDevices() + self.job.job_result = JobResult.objects.create( + name=self.job.class_path, user=None, task_name="fake task", worker="default" + ) + self.sync_devices_adapter = SyncDevicesNautobotAdapter(job=self.job, sync=None) + + # Setup Nautobot Objects + self.testing_objects = utils.sync_devices_ensure_required_nautobot_objects() + + def test_load(self): + """Test loading Nautobot data into the diffsync store.""" + + self.job.debug = True + self.job.ip_addresses = ["10.1.1.10", "10.1.1.11", "192.1.1.10"] + self.job.location = self.testing_objects["location"] + self.job.namespace = self.testing_objects["namespace"] + self.job.port = 22 + self.job.timeout = 30 + self.job.update_devices_without_primary_ip = True + self.job.device_role = self.testing_objects["device_role"] + self.job.device_status = self.testing_objects["status"] + self.job.interface_status = self.testing_objects["status"] + self.job.ip_address_status = self.testing_objects["status"] + self.job.secrets_group = self.testing_objects["secrets_group"] + self.job.platform = None + + self.sync_devices_adapter.load() + + for manufacturer in Manufacturer.objects.all(): + unique_id = manufacturer.name + diffsync_obj = self.sync_devices_adapter.get("manufacturer", unique_id) + self.assertEqual(manufacturer.name, diffsync_obj.name) + + for platform in Platform.objects.all(): + unique_id = platform.name + diffsync_obj = self.sync_devices_adapter.get("platform", unique_id) + self.assertEqual(platform.name, diffsync_obj.name) + self.assertEqual(platform.network_driver, diffsync_obj.network_driver) + self.assertEqual(platform.manufacturer.name, diffsync_obj.manufacturer__name) + + for device_type in DeviceType.objects.all(): + unique_id = f"{device_type.model}__{device_type.manufacturer.name}" + diffsync_obj = self.sync_devices_adapter.get("device_type", unique_id) + self.assertEqual(device_type.model, diffsync_obj.model) + self.assertEqual(device_type.manufacturer.name, diffsync_obj.manufacturer__name) + self.assertEqual(device_type.part_number, diffsync_obj.part_number) + + for device in Device.objects.filter(primary_ip4__host__in=self.job.ip_addresses): + unique_id = f"{device.location.name}__{device.name}__{device.serial}" + diffsync_obj = self.sync_devices_adapter.get("device", unique_id) + self.assertEqual(device.location.name, diffsync_obj.location__name) + self.assertEqual(device.name, diffsync_obj.name) + self.assertEqual(device.serial, diffsync_obj.serial) + self.assertEqual(device.primary_ip.host, diffsync_obj.primary_ip4__host) + self.assertEqual(device.primary_ip.status.name, diffsync_obj.primary_ip4__status__name) + self.assertEqual(device.platform.name, diffsync_obj.platform__name) + self.assertEqual(device.role.name, diffsync_obj.role__name) + self.assertEqual(device.secrets_group.name, diffsync_obj.secrets_group__name) + self.assertEqual(device.status.name, diffsync_obj.status__name) + self.assertEqual([device.interfaces.all().first().name], diffsync_obj.interfaces) + + with self.assertRaises(ObjectNotFound): + # Devices with a primary IP that was not entered into the job form + # should not be included in the sync + device = self.testing_objects["device_2"] + unique_id = f"{device.location.name}__{device.name}__{device.serial}" + diffsync_obj = self.sync_devices_adapter.get("device", unique_id) diff --git a/nautobot_device_onboarding/tests/test_sync_devices_models.py b/nautobot_device_onboarding/tests/test_sync_devices_models.py new file mode 100644 index 00000000..6d8aa1d5 --- /dev/null +++ b/nautobot_device_onboarding/tests/test_sync_devices_models.py @@ -0,0 +1,148 @@ +"""Test Jobs.""" + +from unittest.mock import patch + +from nautobot.apps.testing import create_job_result_and_run_job +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Device, Interface +from nautobot.extras.choices import JobResultStatusChoices + +from nautobot_device_onboarding.tests import utils +from nautobot_device_onboarding.tests.fixtures import sync_devices_fixture + + +class SyncDevicesDeviceTestCase(TransactionTestCase): + """Test SyncDevicesDevice class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Nautobot Objects + self.testing_objects = utils.sync_devices_ensure_required_nautobot_objects() + + @patch("nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters.sync_devices_command_getter") + def test_device_update__missing_primary_ip__success(self, device_data): + """Test updating a device that does not have a primary ip with the 'Sync Devices From Network' job""" + device_data.return_value = sync_devices_fixture.sync_devices_data_update + + job_form_inputs = { + "debug": True, + "dryrun": False, + "csv_file": None, + "location": self.testing_objects["location"].pk, + "namespace": self.testing_objects["namespace"].pk, + "ip_addresses": "10.1.1.10", + "port": 22, + "timeout": 30, + "set_mgmt_only": True, + "update_devices_without_primary_ip": True, + "device_role": self.testing_objects["device_role_backup"].pk, + "device_status": self.testing_objects["status_planned"].pk, + "interface_status": self.testing_objects["status"].pk, + "ip_address_status": self.testing_objects["status"].pk, + "secrets_group": self.testing_objects["secrets_group_alternate"].pk, + "platform": None, + "memory_profiling": False, + } + self.testing_objects["device_1"].primary_ip4 = None # test existing device with missing primary ip + self.testing_objects["device_1"].validated_save() + job_result = create_job_result_and_run_job( + module="nautobot_device_onboarding.jobs", name="SSOTSyncDevices", **job_form_inputs + ) + device = Device.objects.get(serial="9ABUXU5882222") + self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS) + self.assertEqual(device.primary_ip4.host, "10.1.1.10") + self.assertEqual(device.name, device_data.return_value["10.1.1.10"]["hostname"]) + self.assertEqual(device.serial, device_data.return_value["10.1.1.10"]["serial"]) + self.assertEqual(device.device_type.model, device_data.return_value["10.1.1.10"]["device_type"]) + self.assertEqual(device.platform.name, device_data.return_value["10.1.1.10"]["platform"]) + self.assertEqual(device.status.name, self.testing_objects["status_planned"].name) + self.assertEqual(device.role.name, self.testing_objects["device_role_backup"].name) + self.assertEqual(device.secrets_group.name, self.testing_objects["secrets_group_alternate"].name) + + mgmt_interface = Interface.objects.get( + device=device, name=device_data.return_value["10.1.1.10"]["mgmt_interface"] + ) + self.assertIn("10.1.1.10", list(mgmt_interface.ip_addresses.all().values_list("host", flat=True))) + + @patch("nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters.sync_devices_command_getter") + def test_device_update__primary_ip_and_interface__success(self, device_data): + """Test updating the primary ip and interface name with the 'Sync Devices From Network' job""" + device_data.return_value = sync_devices_fixture.sync_devices_mock_data_single_device_valid + # update returned interface to force this value to be updated + device_data.return_value["10.1.1.10"]["mgmt_interface"] = "NewInterfaceName" + + job_form_inputs = { + "debug": True, + "dryrun": False, + "csv_file": None, + "location": self.testing_objects["location"].pk, + "namespace": self.testing_objects["namespace"].pk, + "ip_addresses": "10.1.1.15", + "port": 22, + "timeout": 30, + "set_mgmt_only": True, + "update_devices_without_primary_ip": True, + "device_role": self.testing_objects["device_role"].pk, + "device_status": self.testing_objects["status"].pk, + "interface_status": self.testing_objects["status"].pk, + "ip_address_status": self.testing_objects["status"].pk, + "secrets_group": self.testing_objects["secrets_group"].pk, + "platform": None, + "memory_profiling": False, + } + job_result = create_job_result_and_run_job( + module="nautobot_device_onboarding.jobs", name="SSOTSyncDevices", **job_form_inputs + ) + device = Device.objects.get(serial="test-serial-abc") + self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS) + self.assertEqual(device.name, device_data.return_value["10.1.1.10"]["hostname"]) + self.assertEqual(device.serial, device_data.return_value["10.1.1.10"]["serial"]) + self.assertEqual(device.device_type.model, device_data.return_value["10.1.1.10"]["device_type"]) + self.assertEqual(device.platform.name, device_data.return_value["10.1.1.10"]["platform"]) + self.assertEqual(device.status.name, self.testing_objects["status"].name) + self.assertEqual(device.role.name, self.testing_objects["device_role"].name) + self.assertEqual(device.secrets_group.name, self.testing_objects["secrets_group"].name) + + mgmt_interface = Interface.objects.get( + device=device, name=device_data.return_value["10.1.1.10"]["mgmt_interface"] + ) + self.assertIn("10.1.1.10", list(mgmt_interface.ip_addresses.all().values_list("host", flat=True))) + + @patch("nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters.sync_devices_command_getter") + def test_device_update__interface_only__success(self, device_data): + """Test updating only the primary ip of a device with the 'Sync Devices From Network' job""" + device_data.return_value = sync_devices_fixture.sync_devices_mock_data_single_device_alternate_valid + + job_form_inputs = { + "debug": True, + "dryrun": False, + "csv_file": None, + "location": self.testing_objects["location"].pk, + "namespace": self.testing_objects["namespace"].pk, + "ip_addresses": "192.1.1.10", + "port": 22, + "timeout": 30, + "set_mgmt_only": True, + "update_devices_without_primary_ip": True, + "device_role": self.testing_objects["device_role_backup"].pk, + "device_status": self.testing_objects["status_planned"].pk, + "interface_status": self.testing_objects["status"].pk, + "ip_address_status": self.testing_objects["status"].pk, + "secrets_group": self.testing_objects["secrets_group_alternate"].pk, + "platform": None, + "memory_profiling": False, + } + job_result = create_job_result_and_run_job( + module="nautobot_device_onboarding.jobs", name="SSOTSyncDevices", **job_form_inputs + ) + self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS) + device = Device.objects.get(serial="test-serial-abc") + mgmt_interface = Interface.objects.get( + device=device, name=device_data.return_value["192.1.1.10"]["mgmt_interface"] + ) + self.assertIn("192.1.1.10", list(mgmt_interface.ip_addresses.all().values_list("host", flat=True))) + + old_mgmt_interface = Interface.objects.get(device=device, name="GigabitEthernet1") + self.assertNotIn("192.1.1.10", list(old_mgmt_interface.ip_addresses.all().values_list("host", flat=True))) diff --git a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py new file mode 100644 index 00000000..7ac5b055 --- /dev/null +++ b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py @@ -0,0 +1,353 @@ +"""Test Cisco Support adapter.""" + +from unittest.mock import MagicMock, patch + +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Device, Interface +from nautobot.extras.models import JobResult +from nautobot.ipam.models import VLAN, VRF, IPAddress + +from nautobot_device_onboarding.diffsync.adapters.sync_network_data_adapters import ( + SyncNetworkDataNautobotAdapter, + SyncNetworkDataNetworkAdapter, +) +from nautobot_device_onboarding.jobs import SSOTSyncDevices +from nautobot_device_onboarding.tests import utils +from nautobot_device_onboarding.tests.fixtures import sync_network_data_fixture + + +class SyncNetworkDataNetworkAdapterTestCase(TransactionTestCase): + """Test SyncNetworkDataNetworkAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Nautobot Objects + self.testing_objects = utils.sync_network_data_ensure_required_nautobot_objects() + + # Setup Job + self.job = SSOTSyncDevices() + self.job.job_result = JobResult.objects.create( + name=self.job.class_path, user=None, task_name="fake task", worker="default" + ) + self.job.command_getter_result = sync_network_data_fixture.sync_network_mock_data_valid + + # Form inputs + self.job.interface_status = self.testing_objects["status"] + self.job.ip_address_status = self.testing_objects["status"] + self.job.location = self.testing_objects["location"] + self.job.namespace = self.testing_objects["namespace"] + self.job.sync_vlans = True + self.job.sync_vrfs = True + self.job.debug = True + self.job.devices_to_load = None + + self.sync_network_data_adapter = SyncNetworkDataNetworkAdapter(job=self.job, sync=None) + + def test_handle_failed_devices(self): + """Devices that failed to returned pardsed data should be removed from results.""" + # Add a failed device to the mock returned data + self.job.command_getter_result.update(sync_network_data_fixture.failed_device) + + self.sync_network_data_adapter._handle_failed_devices( # pylint: disable=protected-access + device_data=self.job.command_getter_result + ) + self.assertNotIn("demo-cisco-xe3", self.job.command_getter_result.keys()) + + @patch("nautobot_device_onboarding.diffsync.adapters.sync_network_data_adapters.sync_network_data_command_getter") + def test_execute_command_getter(self, command_getter_result): + """Test execute command getter.""" + command_getter_result.return_value = sync_network_data_fixture.sync_network_mock_data_valid + command_getter_result.update(sync_network_data_fixture.failed_device) + self.sync_network_data_adapter.execute_command_getter() + self.assertIn( + self.testing_objects["device_1"].name, list(self.job.devices_to_load.values_list("name", flat=True)) + ) + self.assertIn( + self.testing_objects["device_2"].name, list(self.job.devices_to_load.values_list("name", flat=True)) + ) + + def test_load_devices(self): + """Test loading device data returned from command getter into the diffsync store.""" + self.sync_network_data_adapter.load_devices() + + # test loaded devices + for hostname, device_data in self.job.command_getter_result.items(): + unique_id = f"{hostname}__{device_data['serial']}" + diffsync_obj = self.sync_network_data_adapter.get("device", unique_id) + self.assertEqual(hostname, diffsync_obj.name) + self.assertEqual(device_data["serial"], diffsync_obj.serial) + + # test child interfaces which are loaded along with devices + for hostname, device_data in self.job.command_getter_result.items(): + for interface_name, interface_data in device_data["interfaces"].items(): + unique_id = f"{hostname}__{interface_name}" + diffsync_obj = self.sync_network_data_adapter.get("interface", unique_id) + self.assertEqual(hostname, diffsync_obj.device__name) + self.assertEqual(interface_name, diffsync_obj.name) + self.assertEqual(self.testing_objects["status"].name, diffsync_obj.status__name) + self.assertEqual( + self.sync_network_data_adapter._process_mac_address( # pylint: disable=protected-access + mac_address=interface_data["mac_address"] + ), + diffsync_obj.mac_address, + ) + self.assertEqual(interface_data["802.1Q_mode"], diffsync_obj.mode) + self.assertEqual(interface_data["link_status"], diffsync_obj.enabled) + self.assertEqual(interface_data["description"], diffsync_obj.description) + + def test_load_ip_addresses(self): + """Test loading ip address data returned from command getter into the diffsync store.""" + self.sync_network_data_adapter.load_ip_addresses() + + for _, device_data in self.job.command_getter_result.items(): + for _, interface_data in device_data["interfaces"].items(): + if interface_data["ip_addresses"]: + for ip_address in interface_data["ip_addresses"]: + if ip_address["ip_address"]: + unique_id = ip_address["ip_address"] + diffsync_obj = self.sync_network_data_adapter.get("ip_address", unique_id) + self.assertEqual(ip_address["ip_address"], diffsync_obj.host) + self.assertEqual(4, diffsync_obj.ip_version) + self.assertEqual(int(ip_address["prefix_length"]), diffsync_obj.mask_length) + self.assertEqual(self.job.ip_address_status.name, diffsync_obj.status__name) + + def test_load_vlans(self): + """Test loading vlan data returned from command getter into the diffsync store.""" + self.job.devices_to_load = Device.objects.filter(name__in=["demo-cisco-1", "demo-cisco-2"]) + self.sync_network_data_adapter.load_vlans() + + for _, device_data in self.job.command_getter_result.items(): + for _, interface_data in device_data["interfaces"].items(): + for tagged_vlan in interface_data["tagged_vlans"]: + unique_id = f"{tagged_vlan['id']}__{tagged_vlan['name']}__{self.job.location.name}" + diffsync_obj = self.sync_network_data_adapter.get("vlan", unique_id) + self.assertEqual(int(tagged_vlan["id"]), diffsync_obj.vid) + self.assertEqual(tagged_vlan["name"], diffsync_obj.name) + self.assertEqual(self.job.location.name, diffsync_obj.location__name) + if interface_data["untagged_vlan"]: + unique_id = f"{interface_data['untagged_vlan']['id']}__{interface_data['untagged_vlan']['name']}__{self.job.location.name}" + diffsync_obj = self.sync_network_data_adapter.get("vlan", unique_id) + self.assertEqual(int(interface_data["untagged_vlan"]["id"]), diffsync_obj.vid) + self.assertEqual(interface_data["untagged_vlan"]["name"], diffsync_obj.name) + self.assertEqual(self.job.location.name, diffsync_obj.location__name) + + def test_load_vrfs(self): + """Test loading vrf data returned from command getter into the diffsync store.""" + self.sync_network_data_adapter.load_vrfs() + for _, device_data in self.job.command_getter_result.items(): + for _, interface_data in device_data["interfaces"].items(): + if interface_data["vrf"]: + unique_id = f"{interface_data['vrf']['name']}__{self.job.namespace.name}" + diffsync_obj = self.sync_network_data_adapter.get("vrf", unique_id) + self.assertEqual(interface_data["vrf"]["name"], diffsync_obj.name) + self.assertEqual(self.job.namespace.name, diffsync_obj.namespace__name) + + def test_load_ip_address_to_interfaces(self): + """Test loading ip address interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_ip_address_to_interfaces() + for hostname, device_data in self.job.command_getter_result.items(): + for interface_name, interface_data in device_data["interfaces"].items(): + for ip_address in interface_data["ip_addresses"]: + if ip_address["ip_address"]: + unique_id = f"{hostname}__{interface_name}__{ip_address['ip_address']}" + diffsync_obj = self.sync_network_data_adapter.get("ipaddress_to_interface", unique_id) + self.assertEqual(hostname, diffsync_obj.interface__device__name) + self.assertEqual(interface_name, diffsync_obj.interface__name) + self.assertEqual(ip_address["ip_address"], diffsync_obj.ip_address__host) + + def test_load_tagged_vlans_to_interface(self): + """Test loading tagged vlan interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_tagged_vlans_to_interface() + for hostname, device_data in self.job.command_getter_result.items(): + for interface_name, interface_data in device_data["interfaces"].items(): + unique_id = f"{hostname}__{interface_name}" + diffsync_obj = self.sync_network_data_adapter.get("tagged_vlans_to_interface", unique_id) + self.assertEqual(hostname, diffsync_obj.device__name) + self.assertEqual(interface_name, diffsync_obj.name) + self.assertEqual(interface_data["tagged_vlans"], diffsync_obj.tagged_vlans) + + def test_load_untagged_vlan_to_interface(self): + """Test loading untagged vlan interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_untagged_vlan_to_interface() + for hostname, device_data in self.job.command_getter_result.items(): + for interface_name, interface_data in device_data["interfaces"].items(): + unique_id = f"{hostname}__{interface_name}" + diffsync_obj = self.sync_network_data_adapter.get("untagged_vlan_to_interface", unique_id) + self.assertEqual(hostname, diffsync_obj.device__name) + self.assertEqual(interface_name, diffsync_obj.name) + if interface_data["untagged_vlan"]: + self.assertEqual(interface_data["untagged_vlan"], diffsync_obj.untagged_vlan) + else: + self.assertEqual({}, diffsync_obj.untagged_vlan) + + def test_load_lag_to_interface(self): + """Test loading lag interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_lag_to_interface() + for hostname, device_data in self.job.command_getter_result.items(): + for interface_name, interface_data in device_data["interfaces"].items(): + unique_id = f"{hostname}__{interface_name}" + diffsync_obj = self.sync_network_data_adapter.get("lag_to_interface", unique_id) + self.assertEqual(hostname, diffsync_obj.device__name) + self.assertEqual(interface_name, diffsync_obj.name) + self.assertEqual(interface_data["lag"], diffsync_obj.lag__interface__name) + + def test_load_vrf_to_interface(self): + """Test loading vrf interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_vrf_to_interface() + for hostname, device_data in self.job.command_getter_result.items(): + for interface_name, interface_data in device_data["interfaces"].items(): + unique_id = f"{hostname}__{interface_name}" + diffsync_obj = self.sync_network_data_adapter.get("vrf_to_interface", unique_id) + self.assertEqual(hostname, diffsync_obj.device__name) + self.assertEqual(interface_name, diffsync_obj.name) + self.assertEqual(interface_data["vrf"], diffsync_obj.vrf) + + +class SyncNetworkDataNautobotAdapterTestCase(TransactionTestCase): + """Test SyncNetworkDataNautobotAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=invalid-name + """Initialize test case.""" + # Setup Nautobot Objects + self.testing_objects = utils.sync_network_data_ensure_required_nautobot_objects() + + # Setup Job + self.job = SSOTSyncDevices() + self.job.job_result = JobResult.objects.create( + name=self.job.class_path, user=None, task_name="fake task", worker="default" + ) + self.job.command_getter_result = sync_network_data_fixture.sync_network_mock_data_valid + + # Form inputs + self.job.interface_status = self.testing_objects["status"] + self.job.ip_address_status = self.testing_objects["status"] + self.job.location = self.testing_objects["location"] + self.job.namespace = self.testing_objects["namespace"] + self.job.sync_vlans = True + self.job.sync_vrfs = True + self.job.debug = True + self.job.devices_to_load = Device.objects.filter(name__in=["demo-cisco-1", "demo-cisco-2"]) + + self.sync_network_data_adapter = SyncNetworkDataNautobotAdapter(job=self.job, sync=None) + + def test_cache_primary_ips(self): + """Test IP Cache.""" + self.sync_network_data_adapter._cache_primary_ips( # pylint: disable=protected-access + device_queryset=self.job.devices_to_load + ) + for device in self.job.devices_to_load: + self.assertEqual(self.sync_network_data_adapter.primary_ips[device.id], device.primary_ip.id) + + def test_load_param_mac_address(self): + """Test MAC address string converstion.""" + database_obj = MagicMock() + database_obj.mac_address = "0000.0000.0000" + mac_address = self.sync_network_data_adapter.load_param_mac_address( + parameter_name="mac_address", database_object=database_obj + ) + self.assertEqual(str, type(mac_address)) + + def test_load_ip_addresses(self): + """Test loading Nautobot ip into the diffsync store.""" + ip_address_hosts = self.sync_network_data_adapter.load_ip_addresses() + for ip_address in IPAddress.objects.filter( + host__in=ip_address_hosts, + parent__namespace__name=self.job.namespace.name, + ): + unique_id = f"{ip_address.host}" + diffsync_obj = self.sync_network_data_adapter.get("ip_address", unique_id) + self.assertEqual(ip_address.host, diffsync_obj.host) + self.assertEqual(ip_address.ip_version, diffsync_obj.ip_version) + self.assertEqual(ip_address.mask_length, diffsync_obj.mask_length) + self.assertEqual(self.job.ip_address_status.name, diffsync_obj.status__name) + + def test_load_vlans(self): + """Test loading Nautobot vlan data into the diffsync store.""" + self.sync_network_data_adapter.load_vlans() + + for vlan in VLAN.objects.all(): + unique_id = f"{vlan.vid}__{vlan.name}__{self.job.location.name}" + diffsync_obj = self.sync_network_data_adapter.get("vlan", unique_id) + self.assertEqual(int(vlan.vid), diffsync_obj.vid) + self.assertEqual(vlan.name, diffsync_obj.name) + self.assertEqual(self.job.location.name, diffsync_obj.location__name) + + def test_load_tagged_vlans_to_interface(self): + """Test loading Nautobot tagged vlan interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_tagged_vlans_to_interface() + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + tagged_vlans = [] + for vlan in interface.tagged_vlans.all(): + vlan_dict = {} + vlan_dict["name"] = vlan.name + vlan_dict["id"] = str(vlan.vid) + tagged_vlans.append(vlan_dict) + + unique_id = f"{interface.device.name}__{interface.name}" + diffsync_obj = self.sync_network_data_adapter.get("tagged_vlans_to_interface", unique_id) + self.assertEqual(interface.device.name, diffsync_obj.device__name) + self.assertEqual(interface.name, diffsync_obj.name) + self.assertEqual(tagged_vlans, diffsync_obj.tagged_vlans) + + def load_untagged_vlan_to_interface(self): + """Test loading Nautobot untagged vlan interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_untagged_vlan_to_interface() + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + untagged_vlan = {} + if interface.untagged_vlan: + untagged_vlan["name"] = interface.untagged_vlan.name + untagged_vlan["id"] = str(interface.untagged_vlan.vid) + + unique_id = f"{interface.device.name}__{interface.name}" + diffsync_obj = self.sync_network_data_adapter.get("untagged_vlans_to_interface", unique_id) + self.assertEqual(interface.device.name, diffsync_obj.device__name) + self.assertEqual(interface.name, diffsync_obj.name) + self.assertEqual(untagged_vlan, diffsync_obj.tagged_vlan) + + def test_load_lag_to_interface(self): + """Test loading Nautobot lag interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_lag_to_interface() + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + unique_id = f"{interface.device.name}__{interface.name}" + diffsync_obj = self.sync_network_data_adapter.get("lag_to_interface", unique_id) + self.assertEqual(interface.device.name, diffsync_obj.device__name) + self.assertEqual(interface.name, diffsync_obj.name) + self.assertEqual(interface.lag.name if interface.lag else "", diffsync_obj.lag__interface__name) + + def test_load_vrfs(self): + """Test loading Nautobot vrf data into the diffsync store.""" + self.sync_network_data_adapter.load_vrfs() + for vrf in VRF.objects.all(): + unique_id = f"{vrf.name}__{self.job.namespace.name}" + diffsync_obj = self.sync_network_data_adapter.get("vrf", unique_id) + self.assertEqual(vrf.name, diffsync_obj.name) + self.assertEqual(self.job.namespace.name, diffsync_obj.namespace__name) + + def test_load_vrf_to_interface(self): + """Test loading Nautobot vrf interface assignments into the Diffsync store.""" + self.sync_network_data_adapter.load_vrf_to_interface() + for interface in Interface.objects.filter(device__in=self.job.devices_to_load): + vrf = {} + if interface.vrf: + vrf["name"] = interface.vrf.name + unique_id = f"{interface.device.name}__{interface.name}" + diffsync_obj = self.sync_network_data_adapter.get("vrf_to_interface", unique_id) + self.assertEqual(interface.device.name, diffsync_obj.device__name) + self.assertEqual(interface.name, diffsync_obj.name) + self.assertEqual(vrf, diffsync_obj.vrf) + + def test_sync_complete(self): + """Test primary ip re-assignment if deleted during the sync.""" + self.sync_network_data_adapter._cache_primary_ips( # pylint: disable=protected-access + device_queryset=self.job.devices_to_load + ) + for device in self.job.devices_to_load: + device.primary_ip4 = None + device.validated_save() + self.sync_network_data_adapter.sync_complete(source=None, diff=None) + for device in self.job.devices_to_load.all(): + self.assertEqual(self.sync_network_data_adapter.primary_ips[device.id], device.primary_ip.id) diff --git a/nautobot_device_onboarding/tests/utils.py b/nautobot_device_onboarding/tests/utils.py new file mode 100644 index 00000000..14c55825 --- /dev/null +++ b/nautobot_device_onboarding/tests/utils.py @@ -0,0 +1,362 @@ +"""Testing utilites.""" + +from django.contrib.contenttypes.models import ContentType +from nautobot.dcim.choices import InterfaceModeChoices, InterfaceTypeChoices +from nautobot.dcim.models import Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform +from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices +from nautobot.extras.models import Role, Secret, SecretsGroup, SecretsGroupAssociation, Status +from nautobot.ipam.choices import IPAddressTypeChoices, PrefixTypeChoices +from nautobot.ipam.models import VLAN, VRF, IPAddress, IPAddressToInterface, Namespace, Prefix + + +def sync_network_data_ensure_required_nautobot_objects(): + """Ensure the requied Nautobot objects needed for testing exist.""" + testing_objects = {} + + status, _ = Status.objects.get_or_create(name="Active") + status.content_types.add(ContentType.objects.get_for_model(Device)) + status.content_types.add(ContentType.objects.get_for_model(Prefix)) + status.content_types.add(ContentType.objects.get_for_model(IPAddress)) + status.content_types.add(ContentType.objects.get_for_model(Location)) + status.content_types.add(ContentType.objects.get_for_model(Interface)) + status.content_types.add(ContentType.objects.get_for_model(Interface)) + status.content_types.add(ContentType.objects.get_for_model(VLAN)) + status.content_types.add(ContentType.objects.get_for_model(VRF)) + status.validated_save() + + username_secret, _ = Secret.objects.get_or_create( + name="username", provider="environment-variable", parameters={"variable": "DEVICE_USER"} + ) + password_secret, _ = Secret.objects.get_or_create( + name="password", provider="environment-variable", parameters={"variable": "DEVICE_PASS"} + ) + secrets_group, _ = SecretsGroup.objects.get_or_create(name="test secrets group") + SecretsGroupAssociation.objects.get_or_create( + secrets_group=secrets_group, + secret=username_secret, + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_USERNAME, + ) + SecretsGroupAssociation.objects.get_or_create( + secrets_group=secrets_group, + secret=password_secret, + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_PASSWORD, + ) + + namespace, _ = Namespace.objects.get_or_create(name="Global") + + prefix, _ = Prefix.objects.get_or_create( + prefix="10.1.1.0/24", + namespace=namespace, + type=PrefixTypeChoices.TYPE_NETWORK, + status=status, + ) + ip_address_1, _ = IPAddress.objects.get_or_create( + host="10.1.1.10", mask_length=24, type=IPAddressTypeChoices.TYPE_HOST, status=status + ) + ip_address_2, _ = IPAddress.objects.get_or_create( + host="10.1.1.11", mask_length=24, type=IPAddressTypeChoices.TYPE_HOST, status=status + ) + ip_address_3, _ = IPAddress.objects.get_or_create( + host="10.1.1.15", mask_length=24, type=IPAddressTypeChoices.TYPE_HOST, status=status + ) + location_type, _ = LocationType.objects.get_or_create(name="Site") + location_type.content_types.add(ContentType.objects.get_for_model(Device)) + location_type.content_types.add(ContentType.objects.get_for_model(VLAN)) + location_type.validated_save() + location, _ = Location.objects.get_or_create(name="Site A", location_type=location_type, status=status) + + device_role, _ = Role.objects.get_or_create(name="Network") + device_role.content_types.add(ContentType.objects.get_for_model(Device)) + device_role.validated_save() + + manufacturer, _ = Manufacturer.objects.get_or_create(name="Cisco") + + platform_1, _ = Platform.objects.get_or_create( + name="cisco_ios", network_driver="cisco_ios", manufacturer=manufacturer + ) + platform_2, _ = Platform.objects.get_or_create( + name="cisco_xe", network_driver="cisco_xe", manufacturer=manufacturer + ) + + vlan_1, _ = VLAN.objects.get_or_create(vid=40, name="vlan40", location=location, status=status) + vlan_2, _ = VLAN.objects.get_or_create(vid=50, name="vlan50", location=location, status=status) + vrf_1, _ = VRF.objects.get_or_create(name="mgmt", namespace=namespace) + vrf_2, _ = VRF.objects.get_or_create(name="vrf2", namespace=namespace) + + device_type, _ = DeviceType.objects.get_or_create(model="CSR1000V17", manufacturer=manufacturer) + device_1, _ = Device.objects.get_or_create( + name="demo-cisco-1", + serial="9ABUXU581111", + device_type=device_type, + status=status, + location=location, + role=device_role, + platform=platform_1, + secrets_group=secrets_group, + ) + device_2, _ = Device.objects.get_or_create( + name="demo-cisco-2", + serial="9ABUXU5882222", + device_type=device_type, + status=status, + location=location, + role=device_role, + platform=platform_2, + secrets_group=secrets_group, + ) + device_3, _ = Device.objects.get_or_create( + name="demo-cisco-3", + serial="9ABUXU5883333", + device_type=device_type, + status=status, + location=location, + role=device_role, + platform=platform_2, + secrets_group=secrets_group, + ) + interface_1, _ = Interface.objects.get_or_create( + device=device_1, name="GigabitEthernet1", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL + ) + interface_1.mode = InterfaceModeChoices.MODE_TAGGED + interface_1.tagged_vlans.add(vlan_1) + interface_1.validated_save() + interface_2, _ = Interface.objects.get_or_create( + device=device_2, name="GigabitEthernet1", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL + ) + interface_3, _ = Interface.objects.get_or_create( + device=device_3, name="GigabitEthernet1", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL + ) + IPAddressToInterface.objects.get_or_create(interface=interface_1, ip_address=ip_address_1) + device_1.primary_ip4 = ip_address_1 + device_1.validated_save() + + IPAddressToInterface.objects.get_or_create(interface=interface_2, ip_address=ip_address_2) + device_2.primary_ip4 = ip_address_2 + device_2.validated_save() + + IPAddressToInterface.objects.get_or_create(interface=interface_3, ip_address=ip_address_3) + device_3.primary_ip4 = ip_address_3 + device_3.validated_save() + + testing_objects["status"] = status + testing_objects["secrets_group"] = secrets_group + testing_objects["namespace"] = namespace + testing_objects["location"] = location + testing_objects["manufacturer"] = manufacturer + testing_objects["device_role"] = device_role + testing_objects["device_type"] = device_type + testing_objects["platform_1"] = platform_1 + testing_objects["platform_2"] = platform_2 + testing_objects["prefix"] = prefix + testing_objects["ip_address_1"] = ip_address_1 + testing_objects["ip_address_2"] = ip_address_2 + testing_objects["ip_address_3"] = ip_address_3 + testing_objects["device_1"] = device_1 + testing_objects["device_2"] = device_2 + testing_objects["device_3"] = device_3 + testing_objects["vlan_1"] = vlan_1 + testing_objects["vlan_2"] = vlan_2 + testing_objects["vrf_1"] = vrf_1 + testing_objects["vrf_2"] = vrf_2 + + return testing_objects + + +def sync_devices_ensure_required_nautobot_objects(): + """Ensure the requied Nautobot objects needed for testing exist.""" + testing_objects = {} + + status, _ = Status.objects.get_or_create(name="Active") + status.content_types.add(ContentType.objects.get_for_model(Device)) + status.content_types.add(ContentType.objects.get_for_model(Prefix)) + status.content_types.add(ContentType.objects.get_for_model(IPAddress)) + status.content_types.add(ContentType.objects.get_for_model(Location)) + status.content_types.add(ContentType.objects.get_for_model(Interface)) + status.content_types.add(ContentType.objects.get_for_model(Interface)) + status.validated_save() + + status_planned, _ = Status.objects.get_or_create(name="Planned") + status_planned.content_types.add(ContentType.objects.get_for_model(Device)) + status_planned.validated_save() + + username_secret, _ = Secret.objects.get_or_create( + name="username", provider="environment-variable", parameters={"variable": "DEVICE_USER"} + ) + password_secret, _ = Secret.objects.get_or_create( + name="password", provider="environment-variable", parameters={"variable": "DEVICE_PASS"} + ) + secrets_group, _ = SecretsGroup.objects.get_or_create(name="test secrets group") + secrets_group_alternate, _ = SecretsGroup.objects.get_or_create(name="alternate secrets group") + + secrets_group, _ = SecretsGroup.objects.get_or_create(name="test secrets group") + SecretsGroupAssociation.objects.get_or_create( + secrets_group=secrets_group, + secret=username_secret, + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_USERNAME, + ) + SecretsGroupAssociation.objects.get_or_create( + secrets_group=secrets_group, + secret=password_secret, + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_PASSWORD, + ) + + namespace, _ = Namespace.objects.get_or_create(name="Global") + + prefix, _ = Prefix.objects.get_or_create( + prefix="192.1.1.0/24", + namespace=namespace, + type=PrefixTypeChoices.TYPE_NETWORK, + status=status, + ) + ip_address_1, _ = IPAddress.objects.get_or_create( + host="192.1.1.10", mask_length=24, type=IPAddressTypeChoices.TYPE_HOST, status=status + ) + ip_address_2, _ = IPAddress.objects.get_or_create( + host="192.1.1.11", mask_length=24, type=IPAddressTypeChoices.TYPE_HOST, status=status + ) + + location_type, _ = LocationType.objects.get_or_create(name="Site") + location_type.content_types.add(ContentType.objects.get_for_model(Device)) + location_type.validated_save() + location, _ = Location.objects.get_or_create(name="Site A", location_type=location_type, status=status) + + device_role, _ = Role.objects.get_or_create(name="Network") + device_role.content_types.add(ContentType.objects.get_for_model(Device)) + device_role.validated_save() + + device_role_backup, _ = Role.objects.get_or_create(name="Backup") + device_role_backup.content_types.add(ContentType.objects.get_for_model(Device)) + device_role_backup.validated_save() + + manufacturer, _ = Manufacturer.objects.get_or_create(name="Cisco") + + platform, _ = Platform.objects.get_or_create( + name="cisco_nxos", network_driver="cisco_nxos", manufacturer=manufacturer + ) + + device_type, _ = DeviceType.objects.get_or_create( + model="CSR1000V17", part_number="CSR1000V17", manufacturer=manufacturer + ) + device_1, _ = Device.objects.get_or_create( + name="test device 1", + serial="test-serial-abc", + device_type=device_type, + status=status, + location=location, + role=device_role, + platform=platform, + secrets_group=secrets_group, + ) + device_2, _ = Device.objects.get_or_create( + name="test device 2", + serial="test-serial-123", + device_type=device_type, + status=status, + location=location, + role=device_role, + platform=platform, + secrets_group=secrets_group, + ) + interface_1, _ = Interface.objects.get_or_create( + device=device_1, name="GigabitEthernet1", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL + ) + IPAddressToInterface.objects.get_or_create(interface=interface_1, ip_address=ip_address_1) + device_1.primary_ip4 = ip_address_1 + device_1.validated_save() + + interface_2, _ = Interface.objects.get_or_create( + device=device_2, name="GigabitEthernet1", status=status, type=InterfaceTypeChoices.TYPE_VIRTUAL + ) + IPAddressToInterface.objects.get_or_create(interface=interface_2, ip_address=ip_address_2) + device_2.primary_ip4 = ip_address_2 + device_2.validated_save() + + testing_objects["status"] = status + testing_objects["status_planned"] = status_planned + testing_objects["secrets_group"] = secrets_group + testing_objects["secrets_group_alternate"] = secrets_group_alternate + testing_objects["namespace"] = namespace + testing_objects["location"] = location + testing_objects["manufacturer"] = manufacturer + testing_objects["device_role"] = device_role + testing_objects["device_role_backup"] = device_role_backup + testing_objects["device_type"] = device_type + testing_objects["platform"] = platform + testing_objects["prefix"] = prefix + testing_objects["ip_address_1"] = ip_address_1 + testing_objects["ip_address_2"] = ip_address_2 + testing_objects["device_1"] = device_1 + testing_objects["device_2"] = device_2 + + return testing_objects + + +def sync_devices_ensure_required_nautobot_objects__jobs_testing(): + """Ensure the requied Nautobot objects needed for testing exist.""" + testing_objects = {} + + status, _ = Status.objects.get_or_create(name="Active") + status.content_types.add(ContentType.objects.get_for_model(Device)) + status.content_types.add(ContentType.objects.get_for_model(Prefix)) + status.content_types.add(ContentType.objects.get_for_model(IPAddress)) + status.content_types.add(ContentType.objects.get_for_model(Location)) + status.content_types.add(ContentType.objects.get_for_model(Interface)) + status.content_types.add(ContentType.objects.get_for_model(Interface)) + status.validated_save() + + username_secret, _ = Secret.objects.get_or_create( + name="username", provider="environment-variable", parameters={"variable": "DEVICE_USER"} + ) + password_secret, _ = Secret.objects.get_or_create( + name="password", provider="environment-variable", parameters={"variable": "DEVICE_PASS"} + ) + secrets_group, _ = SecretsGroup.objects.get_or_create(name="test secrets group") + SecretsGroupAssociation.objects.get_or_create( + secrets_group=secrets_group, + secret=username_secret, + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_USERNAME, + ) + SecretsGroupAssociation.objects.get_or_create( + secrets_group=secrets_group, + secret=password_secret, + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_PASSWORD, + ) + + namespace, _ = Namespace.objects.get_or_create(name="Global") + + location_type__parent, _ = LocationType.objects.get_or_create(name="Region") + location_type, _ = LocationType.objects.get_or_create(name="Site") + location_type.content_types.add(ContentType.objects.get_for_model(Device)) + location_type.validated_save() + + location_1_parent, _ = Location.objects.get_or_create( + name="Site A Parent", location_type=location_type__parent, status=status + ) + location_1, _ = Location.objects.get_or_create( + name="Site A", parent=location_1_parent, location_type=location_type, status=status + ) + location_2_parent, _ = Location.objects.get_or_create( + name="Site B Parent", location_type=location_type__parent, status=status + ) + location_2, _ = Location.objects.get_or_create( + name="Site B", parent=location_2_parent, location_type=location_type, status=status + ) + + device_role, _ = Role.objects.get_or_create(name="Network") + device_role.content_types.add(ContentType.objects.get_for_model(Device)) + device_role.validated_save() + + testing_objects["status"] = status + testing_objects["secrets_group"] = secrets_group + testing_objects["namespace"] = namespace + testing_objects["location_1"] = location_1 + testing_objects["location_2"] = location_2 + testing_objects["device_role"] = device_role + + return testing_objects diff --git a/nautobot_device_onboarding/utils/diffsync_utils.py b/nautobot_device_onboarding/utils/diffsync_utils.py new file mode 100644 index 00000000..b623b15f --- /dev/null +++ b/nautobot_device_onboarding/utils/diffsync_utils.py @@ -0,0 +1,104 @@ +"""Utility functions for use with diffsync.""" + +import ipaddress + +from django.core.exceptions import ObjectDoesNotExist, ValidationError +from nautobot.apps.choices import PrefixTypeChoices +from nautobot.dcim.models import Device +from nautobot.ipam.models import IPAddress, Prefix + + +def generate_device_queryset_from_command_getter_result(command_getter_result): + """Generate a Nautobot device queryset based on data returned from Command Getter Nornir Task.""" + devices_to_sync_hostnames = [] + devices_to_sync_serial_numbers = [] + for hostname, device_data in command_getter_result.items(): + devices_to_sync_hostnames.append(hostname) + devices_to_sync_serial_numbers.append(device_data["serial"]) + device_queryset = Device.objects.filter(name__in=devices_to_sync_hostnames).filter( + serial__in=devices_to_sync_serial_numbers + ) + return device_queryset + + +def check_data_type(data): + """Verify data is of type dict.""" + data_type_check_result = True + if not isinstance(data, dict): + data_type_check_result = False + return data_type_check_result + + +def get_or_create_prefix(host, mask_length, default_status, namespace, job=None): + """Attempt to get a Nautobot Prefix, and create a new one if necessary.""" + prefix = None + new_network = ipaddress.ip_interface(f"{host}/{mask_length}") + try: + prefix = Prefix.objects.get( + prefix=f"{new_network.network}", + namespace=namespace, + ) + except ObjectDoesNotExist: + prefix = Prefix( + prefix=f"{new_network.network}", + namespace=namespace, + type=PrefixTypeChoices.TYPE_NETWORK, + status=default_status, + ) + try: + prefix.validated_save() + except ValidationError as err: + if job: + job.logger.error(f"Prefix {host} failed to create, {err}") + return prefix + + +def get_or_create_ip_address(host, mask_length, namespace, default_ip_status, default_prefix_status, job=None): + """Attempt to get a Nautobot IPAddress, and create a new one if necessary.""" + ip_address = None + + try: + ip_address = IPAddress.objects.get( + host=host, + parent__namespace=namespace, + ) + except ObjectDoesNotExist: + try: + ip_address = IPAddress( + address=f"{host}/{mask_length}", + namespace=namespace, + status=default_ip_status, + ) + ip_address.validated_save() + except ValidationError: + if job: + job.logger.warning( + f"No suitable parent Prefix exists for IP {host} in " + f"Namespace {namespace.name}, a new Prefix will be created." + ) + prefix = get_or_create_prefix(host, mask_length, default_prefix_status, namespace, job) + ip_address = IPAddress.objects.create( + address=f"{host}/{mask_length}", + status=default_ip_status, + parent=prefix, + ) + try: + ip_address.validated_save() + except ValidationError as err: + if job: + job.logger.error(f"IP Address {host} failed to create, {err}") + return ip_address + + +def retrieve_submitted_value(job, ip_address, query_string): + """ + Check for a submitted CSV file and retrieve a the appropriate user submitted value. + + If a user has submitted a CSV file, return the relevant value based on the data + that was parsed when the file was loaded. If a CSV file has not been submitted, + return the value input into the job form. + """ + if job.processed_csv_data: + return job.processed_csv_data[ip_address][query_string] + else: + return getattr(job, query_string) diff --git a/nautobot_device_onboarding/utils/helper.py b/nautobot_device_onboarding/utils/helper.py new file mode 100644 index 00000000..f4c28d77 --- /dev/null +++ b/nautobot_device_onboarding/utils/helper.py @@ -0,0 +1,87 @@ +"""General helper functions for the app.""" + +import socket + +import netaddr +from nautobot.dcim.filters import DeviceFilterSet +from nautobot.dcim.models import Device +from netaddr.core import AddrFormatError +from nornir_nautobot.exceptions import NornirNautobotException + +from nautobot_device_onboarding.exceptions import OnboardException + +FIELDS_PK = { + "location", + "role", +} + +FIELDS_NAME = {"tags"} + + +def get_job_filter(data=None): + """Helper function to return a the filterable list of OS's based on platform.name and a specific custom value.""" + if not data: + data = {} + query = {} + + # Translate instances from FIELDS set to list of primary keys + for field in FIELDS_PK: + if data.get(field): + query[field] = [str(data[field].id)] + + # Translate instances from FIELDS set to list of names + for field in FIELDS_NAME: + if data.get(field): + query[field] = [str(data[field].id)] + # Handle case where object is from single device run all. + if data.get("devices") and isinstance(data["devices"], Device): + query.update({"id": [str(data["devices"].pk)]}) + elif data.get("devices"): + query.update({"id": data["devices"].values_list("pk", flat=True)}) + base_qs = Device.objects.all() + # {'debug': False, 'namespace': , 'devices': ]>, 'location': None, 'device_role': None, 'tag': None, 'port': 22, 'timeout': 30} + devices_filtered = DeviceFilterSet(data=query, queryset=base_qs) + + if not devices_filtered.qs.exists(): + raise NornirNautobotException( + "`E3016:` The provided job parameters didn't match any devices detected. Please select the correct job parameters to correctly match devices." + ) + devices_no_platform = devices_filtered.qs.filter(platform__isnull=True) + if devices_no_platform.exists(): + raise NornirNautobotException( + f"`E3017:` The following device(s) {', '.join([device.name for device in devices_no_platform])} have no platform defined. Platform is required." + ) + + return devices_filtered.qs + + +def onboarding_task_fqdn_to_ip(address): + """Method to assure OT has FQDN resolved to IP address and rewritten into OT. + + If it is a DNS name, attempt to resolve the DNS address and assign the IP address to the + name. + + Returns: + None + + Raises: + OnboardException("fail-general"): + When a prefix was entered for an IP address + OnboardException("fail-dns"): + When a Name lookup via DNS fails to resolve an IP address + """ + try: + # If successful, this is an IP address and can pass + netaddr.IPAddress(address) + return address + # Raise an Exception for Prefix values + except ValueError as err: + raise OnboardException(f"fail-general - ERROR appears a prefix was entered: {address}") from err + # An AddrFormatError exception means that there is not an IP address in the field, and should continue on + except AddrFormatError: + try: + # Perform DNS Lookup + return socket.gethostbyname(address) + except socket.gaierror as err: + # DNS Lookup has failed, Raise an exception for unable to complete DNS lookup + raise OnboardException(f"fail-dns - ERROR failed to complete DNS lookup: {address}") from err From 0d7259a725ea798fe4025b6b79a522ad24362f3c Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Thu, 6 Jun 2024 14:13:24 -0600 Subject: [PATCH 04/81] Nornir and YAML DSL Onboarding 4.0 contributions Co-Authored-By: Jeff Kala <48843785+jeffkala@users.noreply.github.com> --- development/towncrier_template.j2 | 2 +- nautobot_device_onboarding/__init__.py | 8 +- .../app-config-schema.json | 1 - .../command_mappers/arista_eos.yml | 115 ++++ .../command_mappers/cisco_ios.yml | 119 ++++ .../command_mappers/cisco_nxos.yml | 119 ++++ .../command_mappers/cisco_wlc.yml | 28 + .../command_mappers/cisco_xe.yml | 119 ++++ .../command_mappers/juniper_junos.yml | 108 ++++ nautobot_device_onboarding/constants.py | 34 + nautobot_device_onboarding/jobs.py | 602 +++++++++++++++++- .../nornir_plays/command_getter.py | 293 +++++++++ .../nornir_plays/formatter.py | 219 +++++++ .../nornir_plays/processor.py | 117 ++++ .../nornir_plays/schemas.py | 193 ++++++ .../nornir_plays/transform.py | 39 ++ 16 files changed, 2101 insertions(+), 15 deletions(-) delete mode 100644 nautobot_device_onboarding/app-config-schema.json create mode 100755 nautobot_device_onboarding/command_mappers/arista_eos.yml create mode 100755 nautobot_device_onboarding/command_mappers/cisco_ios.yml create mode 100755 nautobot_device_onboarding/command_mappers/cisco_nxos.yml create mode 100755 nautobot_device_onboarding/command_mappers/cisco_wlc.yml create mode 100755 nautobot_device_onboarding/command_mappers/cisco_xe.yml create mode 100755 nautobot_device_onboarding/command_mappers/juniper_junos.yml mode change 100644 => 100755 nautobot_device_onboarding/jobs.py create mode 100755 nautobot_device_onboarding/nornir_plays/command_getter.py create mode 100755 nautobot_device_onboarding/nornir_plays/formatter.py create mode 100755 nautobot_device_onboarding/nornir_plays/processor.py create mode 100755 nautobot_device_onboarding/nornir_plays/schemas.py create mode 100755 nautobot_device_onboarding/nornir_plays/transform.py diff --git a/development/towncrier_template.j2 b/development/towncrier_template.j2 index b0f6e12f..d2ec61bd 100644 --- a/development/towncrier_template.j2 +++ b/development/towncrier_template.j2 @@ -1,6 +1,6 @@ {% if render_title %} -## [v{{ versiondata.version }} ({{ versiondata.date }})]({{ cookiecutter.repo_url }}/releases/tag/v{{ versiondata.version}}) +## v{{ versiondata.version }} ({{ versiondata.date }}) {% endif %} {% for section, _ in sections.items() %} diff --git a/nautobot_device_onboarding/__init__.py b/nautobot_device_onboarding/__init__.py index e7d46cc0..3af1124b 100644 --- a/nautobot_device_onboarding/__init__.py +++ b/nautobot_device_onboarding/__init__.py @@ -1,6 +1,7 @@ """App declaration for nautobot_device_onboarding.""" -# Metadata is inherited from Nautobot. If not including Nautobot in the environment, this should be added +# Metadata is inherited from Nautobot +# If not including Nautobot in the environment, this should be added from importlib import metadata from nautobot.apps import NautobotAppConfig @@ -15,10 +16,11 @@ class NautobotDeviceOnboardingConfig(NautobotAppConfig): verbose_name = "Device Onboarding" version = __version__ author = "Network to Code, LLC" - description = "Nautobot App that simplifies device onboarding (and re-onboarding) by collecting and populating common device 'facts' into Nautobot." + description = "Nautobot App that simplifies device onboarding (and re-onboarding) by \ + collecting and populating common device 'facts' into Nautobot." base_url = "nautobot-device-onboarding" required_settings = [] - min_version = "2.0.3" + min_version = "2.1.1" max_version = "2.9999" default_settings = { "create_platform_if_missing": True, diff --git a/nautobot_device_onboarding/app-config-schema.json b/nautobot_device_onboarding/app-config-schema.json deleted file mode 100644 index 27ba77dd..00000000 --- a/nautobot_device_onboarding/app-config-schema.json +++ /dev/null @@ -1 +0,0 @@ -true diff --git a/nautobot_device_onboarding/command_mappers/arista_eos.yml b/nautobot_device_onboarding/command_mappers/arista_eos.yml new file mode 100755 index 00000000..9fcd995d --- /dev/null +++ b/nautobot_device_onboarding/command_mappers/arista_eos.yml @@ -0,0 +1,115 @@ +--- +sync_devices: + hostname: + commands: + command: "show hostname" + parser: "textfsm" + jpath: "[*].hostname" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial_number" + device_type: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].model" + mgmt_interface: + commands: + - command: "show ip interface brief | json" + parser: "none" + jpath: "interfaces.*.{name: name, match_ip: interfaceAddress.ipAddr.address==`{{ obj }}`}[?match_ip].name" + mask_length: + commands: + - command: "show ip interface brief | json" + parser: "none" + jpath: "interfaces.*.interfaceAddress[?ipAddr.address==`{{ obj }}`].ipAddr.maskLen" + post_processor: "{{ obj[0] }}" +sync_network_data: + pre_processor: + vlan_map: + commands: + - command: "show vlan configured-ports | json" + parser: "none" + jpath: "vlans" + post_processor: "{{ obj | flatten_dict_from_value('name') | tojson }}" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial_number" + interfaces: + root_key: true + commands: + - command: "show interfaces | json" + parser: "none" + jpath: "interfaces.*.name" # when root_key=true this extracted value is what becomes interable in keys using __ under `current_key`. + post_processor: "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" + interfaces__type: + commands: + - command: "show interfaces | json" + parser: "none" + jpath: 'interfaces."{{ current_key }}".hardware' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | map_interface_type }}" + interfaces__ip_addresses: + commands: + - command: "show interfaces | json" + parser: "none" + # jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen},{ip_address: secondaryIps.address, prefix_length: secondaryIps.maskLen}][]' + jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen }][]' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | tojson }}" + interfaces__mtu: + commands: + - command: "show interfaces | json" + parser: "none" + jpath: 'interfaces."{{ current_key }}".[mtu]' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj[0] }}" + interfaces__mac_address: + commands: + - command: "show interfaces | json" + parser: "none" + jpath: 'interfaces."{{ current_key }}".physicalAddress' # yamllint disable-line rule:quoted-strings + interfaces__description: + commands: + - command: "show interfaces | json" + parser: "none" + jpath: 'interfaces."{{ current_key }}".description' # yamllint disable-line rule:quoted-strings + interfaces__link_status: + commands: + - command: "show interfaces | json" + parser: "none" + jpath: 'interfaces."{{ current_key }}".lineProtocolStatus' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | interface_status_to_bool }}" + interfaces__802.1Q_mode: + commands: + - command: "show interfaces switchport | json" + parser: "none" + jpath: 'switchports."{{ current_key }}".switchportInfo.mode' # yamllint disable-line rule:quoted-strings + iterable_type: "str" + interfaces__lag: + commands: + - command: "show interfaces | json" + parser: "none" + jpath: 'interfaces."{{ current_key }}".interfaceMembership' # yamllint disable-line rule:quoted-strings + post_processor: "{% if obj | length > 0 %}{{ obj.split()[-1] }}{% else %}{{ obj }}{% endif %}" + interfaces__vrf: + commands: + - command: "show ip interface | json" + parser: "none" + jpath: "interfaces.*.{name: name, vrf: vrf}[?name==`{{ current_key }}`].{name: vrf}" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" + interfaces__tagged_vlans: + commands: + - command: "show interfaces switchport | json" + parser: "none" + jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + interfaces__untagged_vlan: + commands: + - command: "show interfaces switchport | json" + parser: "none" + jpath: '{id: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId, name: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanName}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | key_exist_or_default('id') | tojson }}" + iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml new file mode 100755 index 00000000..93609a02 --- /dev/null +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -0,0 +1,119 @@ +--- +sync_devices: + hostname: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hostname" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial[]" + post_processor: "{{ obj | unique | first }}" + device_type: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hardware[]" + post_processor: "{{ obj | unique | first }}" + mgmt_interface: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].{name: interface, enabled: link_status}" + post_processor: "{{ (obj | selectattr('enabled', 'eq', 'up') | list | first ).name }}" + mask_length: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].prefix_length" + post_processor: "{{ obj | unique | first }}" +sync_network_data: + pre_processor: + vlan_map: + commands: + - command: "show vlan" + parser: "textfsm" + # Since we use the jdiff custom jmespath we have access to save keys with $ syntax. + jpath: "[*].[$vlan_id$,vlan_name]" + post_processor: "{{ obj | flatten_list_of_dict_from_value('vlan_name') | tojson }}" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial[]" + interfaces: + root_key: true + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[*].interface" # when root_key=true this extracted value is what becomes interable in keys using __ under `current_key`. + post_processor: "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" + interfaces__type: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].hardware_type" + post_processor: "{{ obj[0] | map_interface_type }}" + interfaces__ip_addresses: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{ip_address: ip_address, prefix_length: prefix_length}" + iterable_type: "list" + interfaces__mtu: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mtu" + interfaces__mac_address: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mac_address" + interfaces__description: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].description" + interfaces__link_status: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].link_status" + post_processor: "{{ obj[0] | interface_status_to_bool }}" + interfaces__802.1Q_mode: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}" + post_processor: "{{ obj | interface_mode_logic }}" + iterable_type: "str" + interfaces__lag: + commands: + - command: "show etherchannel summary" + parser: "textfsm" + jpath: "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}" + iterable_type: "str" + interfaces__vrf: + commands: + - command: "show ip interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{name:vrf}" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | key_exist_or_default('name') | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" + interfaces__tagged_vlans: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}" + post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + interfaces__untagged_vlan: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" + post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml new file mode 100755 index 00000000..d02336d0 --- /dev/null +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -0,0 +1,119 @@ +--- +sync_devices: + hostname: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hostname" + serial: + commands: + - command: "show inventory" + parser: "textfsm" + jpath: "[?name=='Chassis'].sn" + device_type: + commands: + - command: "show inventory" + parser: "textfsm" + jpath: "[?name=='Chassis'].descr" + mgmt_interface: + commands: + - command: "show ip interface brief vrf all" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].interface || [`mgmt0`]" + mask_length: + commands: + - command: "show ip interface vrf all" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].subnet" + # jpath: "*[].ROW_intf.{prefix: prefix, subnet:masklen} | [?prefix=='{{ obj }}'].subnet" + post_processor: "{% if '/' in obj[0] %}{{ obj[0].split('/')[1] }}{% else %}31{% endif %}" + # post_processor: "{{ obj[0] | string }}" +sync_network_data: + pre_processor: + vlan_map: + commands: + - command: "show vlan" + parser: "textfsm" + # Since we use the jdiff custom jmespath we have access to save keys with $ syntax. + jpath: "[*].[$vlan_id$,vlan_name]" + post_processor: "{{ obj | flatten_list_of_dict_from_value('vlan_name') | tojson }}" + serial: + commands: + - command: "show inventory" + parser: "textfsm" + jpath: "[?name=='Chassis'].sn" + # jpath: "TABLE_inv.ROW_inv[?name == 'Chassis'].serialnum" + interfaces: + root_key: true + commands: + - command: "show interface" + parser: "textfsm" + jpath: "[*].interface" # when root_key=true this extracted value is what becomes interable in keys using __ under `current_key`. + post_processor: "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" + interfaces__type: + commands: + - command: "show interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].hardware_type" + post_processor: "{{ obj[0] | map_interface_type }}" + interfaces__ip_addresses: + commands: + - command: "show ip interface vrf all" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{ip_address: ip_address, prefix_length: subnet}" + post_processor: "{% set result = [] %}{% for ip in obj %}{% set _=result.append({'ip_address': ip['ip_address'], 'prefix_length': ip['prefix_length'] | extract_prefix }) %}{% endfor %}{{ result | tojson }}" + iterable_type: "list" + interfaces__mtu: + commands: + - command: "show interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mtu" + interfaces__mac_address: + commands: + - command: "show interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mac_address" + interfaces__description: + commands: + - command: "show interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].description" + interfaces__link_status: + commands: + - command: "show interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].link_status" + post_processor: "{{ obj[0] | interface_status_to_bool }}" + interfaces__802.1Q_mode: + commands: + - command: "show interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mode" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | port_mode_to_nautobot }}{% else %}{{ obj }}{% endif %}" + iterable_type: "str" + interfaces__lag: + commands: + - command: "show port-channel summary" + parser: "textfsm" + jpath: "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}[]{% endif %}" + iterable_type: "str" + interfaces__vrf: + commands: + - command: "show vrf interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{name:name}" + iterable_type: "dict" + interfaces__tagged_vlans: + commands: + - command: "show interface switchport" + parser: "textfsm" + jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS}" + post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + interfaces__untagged_vlan: + commands: + - command: "show interface switchport" + parser: "textfsm" + jpath: "[?contains(INTERFACE, '{{ current_key }}')].NATIVE_VLAN" + post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_wlc.yml b/nautobot_device_onboarding/command_mappers/cisco_wlc.yml new file mode 100755 index 00000000..da258795 --- /dev/null +++ b/nautobot_device_onboarding/command_mappers/cisco_wlc.yml @@ -0,0 +1,28 @@ +--- +sync_devices: + hostname: + commands: + - command: "show sysinfo" + parser: "textfsm" + jpath: "[*].system_name" + serial: + commands: + - command: "show inventory" + parser: "textfsm" + jpath: "[*].sn" + device_type: + commands: + - command: "show inventory" + parser: "textfsm" + jpath: "[*].pid" + mgmt_interface: + commands: + - command: "show interface detailed management" + parser: "textfsm" + jpath: "[*].interface_name" + mask_length: + commands: + - command: "show interface detailed management" + parser: "textfsm" + jpath: "[*].netmask" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | netmask_to_cidr }}{% else %}{{ obj }}{% endif %}" diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml new file mode 100755 index 00000000..93609a02 --- /dev/null +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -0,0 +1,119 @@ +--- +sync_devices: + hostname: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hostname" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial[]" + post_processor: "{{ obj | unique | first }}" + device_type: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].hardware[]" + post_processor: "{{ obj | unique | first }}" + mgmt_interface: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].{name: interface, enabled: link_status}" + post_processor: "{{ (obj | selectattr('enabled', 'eq', 'up') | list | first ).name }}" + mask_length: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?ip_address=='{{ obj }}'].prefix_length" + post_processor: "{{ obj | unique | first }}" +sync_network_data: + pre_processor: + vlan_map: + commands: + - command: "show vlan" + parser: "textfsm" + # Since we use the jdiff custom jmespath we have access to save keys with $ syntax. + jpath: "[*].[$vlan_id$,vlan_name]" + post_processor: "{{ obj | flatten_list_of_dict_from_value('vlan_name') | tojson }}" + serial: + commands: + - command: "show version" + parser: "textfsm" + jpath: "[*].serial[]" + interfaces: + root_key: true + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[*].interface" # when root_key=true this extracted value is what becomes interable in keys using __ under `current_key`. + post_processor: "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" + interfaces__type: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].hardware_type" + post_processor: "{{ obj[0] | map_interface_type }}" + interfaces__ip_addresses: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{ip_address: ip_address, prefix_length: prefix_length}" + iterable_type: "list" + interfaces__mtu: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mtu" + interfaces__mac_address: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].mac_address" + interfaces__description: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].description" + interfaces__link_status: + commands: + - command: "show interfaces" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].link_status" + post_processor: "{{ obj[0] | interface_status_to_bool }}" + interfaces__802.1Q_mode: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}" + post_processor: "{{ obj | interface_mode_logic }}" + iterable_type: "str" + interfaces__lag: + commands: + - command: "show etherchannel summary" + parser: "textfsm" + jpath: "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}" + iterable_type: "str" + interfaces__vrf: + commands: + - command: "show ip interface" + parser: "textfsm" + jpath: "[?interface=='{{ current_key }}'].{name:vrf}" + post_processor: "{% if obj | length > 0 %}{{ obj[0] | key_exist_or_default('name') | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" + interfaces__tagged_vlans: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}" + post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + interfaces__untagged_vlan: + commands: + - command: "show interfaces switchport" + parser: "textfsm" + jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" + post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml new file mode 100755 index 00000000..94797deb --- /dev/null +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -0,0 +1,108 @@ +--- +sync_devices: + hostname: + commands: + - command: "show version | display json" + parser: "none" + jpath: '"software-information"[]."host-name"[].data' # yamllint disable-line rule:quoted-strings + serial: + commands: + - command: "show chassis hardware | display json" + parser: "none" + jpath: '"chassis-inventory"[]."chassis"[]."serial-number"[].data' # yamllint disable-line rule:quoted-strings + device_type: + commands: + - command: "show chassis hardware | display json" + parser: "none" + jpath: '"chassis-inventory"[]."chassis"[]."description"[].data' # yamllint disable-line rule:quoted-strings + mgmt_interface: + commands: + - command: "show interfaces terse | display json" + parser: "none" + jpath: '"interface-information"[]."physical-interface"[]."logical-interface"[].{name: name[].data, ip: "address-family"[]."interface-address"[]."ifa-local"[].data}' # yamllint disable-line rule:quoted-strings + post_processor: "{% for entry in obj %}{% if entry['ip'] %}{% for ipaddr in entry['ip'] %}{% if original_host in ipaddr %}{{ entry['name'] | first }}{% endif %}{% endfor %}{% endif %}{% endfor %}" + mask_length: + commands: + - command: "show route protocol direct | display json" + parser: "none" + jpath: '"route-information"[]."route-table"[]."rt"[]."rt-destination"[].data' # yamllint disable-line rule:quoted-strings + post_processor: "{% set mask = [] %}{% for ip_route in obj %}{% if ip_route | is_network %}{% if ip_route | ipaddress_network('version') == 4 %}{% if original_host | is_ip_within(ip_route) %}{% set _=mask.append(ip_route.split('/')[1]) %}{% endif %}{% endif %}{% endif %}{% endfor %}{{ mask | unique | first}}" +sync_network_data: + serial: + commands: + - command: "show chassis hardware | display json" + parser: "none" + jpath: '"chassis-inventory"[]."chassis"[]."serial-number"[].data' # yamllint disable-line rule:quoted-strings + interfaces: + root_key: true + commands: + - command: "show interfaces | display json" + parser: "none" + # when root_key=true this extracted value is what becomes interable in keys using __ under `current_key`. + jpath: '"interface-information"[]."physical-interface"[].[name[].data, "logical-interface"[].name[].data][][]' # yamllint disable-line rule:quoted-strings + post_processor: "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" + interfaces__type: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key.split(".")[0] }}`]]][][]."link-level-type"[].data' # yamllint disable-line rule:quoted-strings + post_processor: "{% if 'ae' in current_key %}lag{% elif obj | length > 0 %}{{ obj[0] | map_interface_type }}{% else %}other{% endif %}" + iterable_type: "str" + interfaces__ip_addresses: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[]."physical-interface"[].["logical-interface"[?name[?data==`{{ current_key }}`]]][][].{prefix_length: "address-family"[]."interface-address"[]."ifa-destination"[].data, ip_address: "address-family"[]."interface-address"[]."ifa-local"[].data}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | parse_junos_ip_address | tojson }}" + interfaces__mtu: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key.split(".")[0] }}`]]][][]."mtu"[].data' # yamllint disable-line rule:quoted-strings + post_processor: "{% if obj | length > 0 %}{% if 'nlimited' in obj[0] %}9192{% else %}{{ obj[0] }}{% endif %}{% endif %}" + interfaces__mac_address: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."hardware-physical-address"[].data' # yamllint disable-line rule:quoted-strings + interfaces__description: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."description"[].data' # yamllint disable-line rule:quoted-strings + iterable_type: "str" + interfaces__link_status: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key.split(".")[0] }}`]]][][]."admin-status"[].data' # yamllint disable-line rule:quoted-strings + post_processor: "{% if obj | length > 0 %}{{ obj[0] | interface_status_to_bool }}{% else %}{{ obj }}{% endif %}" + interfaces__802.1Q_mode: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."todo"[].data' # yamllint disable-line rule:quoted-strings + iterable_type: "str" + interfaces__lag: + commands: + - command: "show interfaces | display json" + parser: "none" + jpath: '"interface-information"[].["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."logical-interface"[]."address-family"[]."ae-bundle-name"[].data' # yamllint disable-line rule:quoted-strings + post_processor: "{% if obj | length > 0 %}{{ obj[0].split('.')[0] }}{% else %}{{ obj }}{% endif %}" + interfaces__vrf: + commands: + - command: "show interfaces routing-instance all terse | display json" + parser: "none" + jpath: '"interface-information"[]."physical-interface"[]["logical-interface"[?name[?data==`{{ current_key }}`]]][][].{name: "vrfname"[0].data}' # yamllint disable-line rule:quoted-strings + iterable_type: "dict" +# Vlans on JUNOS are a bit hit or miss show ethernet-switching vs show vlans vs neither working. +# interfaces__tagged_vlans: +# commands: +# - command: "show interfaces brief | display json" +# parser: "none" +# jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."todo"[].data' # yamllint disable-line rule:quoted-string +# interfaces__untagged_vlan: +# commands: +# - command: "show interfaces brief | display json" +# parser: "none" +# jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."todo"[].data' # yamllint disable-line rule:quoted-strings diff --git a/nautobot_device_onboarding/constants.py b/nautobot_device_onboarding/constants.py index caccc432..0f101f50 100644 --- a/nautobot_device_onboarding/constants.py +++ b/nautobot_device_onboarding/constants.py @@ -1,5 +1,11 @@ """Constants for nautobot_device_onboarding app.""" +from django.conf import settings +from nautobot.dcim.utils import get_all_network_driver_mappings + +PLUGIN_CFG = settings.PLUGINS_CONFIG["nautobot_device_onboarding"] + +# This mapping is only used for the original onboarding job. NETMIKO_TO_NAPALM_STATIC = { "cisco_ios": "ios", "cisco_xe": "ios", @@ -8,3 +14,31 @@ "juniper_junos": "junos", "cisco_xr": "iosxr", } + + +# This is used in the new SSoT based jobs. +SUPPORTED_NETWORK_DRIVERS = list(get_all_network_driver_mappings().keys()) + +# This is used in the new SSoT based jobs. Soon TPP, PYATS should be supported. +# SUPPORTED_COMMAND_PARSERS = ["textfsm", "ttp", "pyats"] +SUPPORTED_COMMAND_PARSERS = ["textfsm"] + +# This should potentially be removed and used nautobot core directly choices. +# from nautobot.dcim.choices import InterfaceTypeChoices +# InterfaceTypeChoices.as_dict() doesn't directly fit yet. Seems like maybe netutils needs the "human readible" nb choices. +INTERFACE_TYPE_MAP_STATIC = { + "Gigabit Ethernet": "1000base-t", + "Ten Gigabit Ethernet": "10gbase-t", + "Ethernet SVI": "virtual", + "EtherChannel": "lag", + "1000/10000 Ethernet": "1000base-t", + "100/1000/10000 Ethernet": "1000base-t", + "Port-channel": "lag", + "portChannel": "lag", + "port-channel": "lag", + "Port-Channel": "lag", + "GEChannel": "lag", + "EtherSVI": "virtual", + "FastEthernet": "100base-fx", + "ethernet": "1000base-t", +} diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py old mode 100644 new mode 100755 index 77cedc2e..5dcba0e2 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -1,22 +1,53 @@ +# pylint: disable=attribute-defined-outside-init """Device Onboarding Jobs.""" +import csv +import json +import logging +from io import StringIO + +from diffsync.enum import DiffSyncFlags from django.conf import settings -from nautobot.apps.jobs import Job, ObjectVar, IntegerVar, StringVar, BooleanVar +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ObjectDoesNotExist, ValidationError +from nautobot.apps.jobs import BooleanVar, ChoiceVar, FileVar, IntegerVar, Job, MultiObjectVar, ObjectVar, StringVar from nautobot.core.celery import register_jobs -from nautobot.dcim.models import Location, DeviceType, Platform -from nautobot.extras.models import Role, SecretsGroup, SecretsGroupAssociation -from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices +from nautobot.dcim.models import Device, DeviceType, Location, Platform +from nautobot.extras.choices import CustomFieldTypeChoices, SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices +from nautobot.extras.models import CustomField, Role, SecretsGroup, SecretsGroupAssociation, Status +from nautobot.ipam.models import Namespace +from nautobot_plugin_nornir.constants import NORNIR_SETTINGS +from nautobot_ssot.jobs.base import DataSource +from nornir import InitNornir +from nornir.core.plugins.inventory import InventoryPluginRegister +from nautobot_device_onboarding.choices import SSOT_JOB_TO_COMMAND_CHOICE +from nautobot_device_onboarding.diffsync.adapters.sync_devices_adapters import ( + SyncDevicesNautobotAdapter, + SyncDevicesNetworkAdapter, +) +from nautobot_device_onboarding.diffsync.adapters.sync_network_data_adapters import ( + SyncNetworkDataNautobotAdapter, + SyncNetworkDataNetworkAdapter, +) from nautobot_device_onboarding.exceptions import OnboardException -from nautobot_device_onboarding.helpers import onboarding_task_fqdn_to_ip from nautobot_device_onboarding.netdev_keeper import NetdevKeeper +from nautobot_device_onboarding.nornir_plays.command_getter import _parse_credentials, netmiko_send_commands +from nautobot_device_onboarding.nornir_plays.empty_inventory import EmptyInventory +from nautobot_device_onboarding.nornir_plays.inventory_creator import _set_inventory +from nautobot_device_onboarding.nornir_plays.processor import TroubleshootingProcessor +from nautobot_device_onboarding.utils.helper import onboarding_task_fqdn_to_ip +InventoryPluginRegister.register("empty-inventory", EmptyInventory) PLUGIN_SETTINGS = settings.PLUGINS_CONFIG["nautobot_device_onboarding"] +LOGGER = logging.getLogger(__name__) +name = "Device Onboarding" # pylint: disable=invalid-name + class OnboardingTask(Job): # pylint: disable=too-many-instance-attributes - """Nautobot Job for onboarding a new device.""" + """Nautobot Job for onboarding a new device (original).""" location = ObjectVar( model=Location, @@ -55,12 +86,13 @@ class OnboardingTask(Job): # pylint: disable=too-many-instance-attributes description="If an exception occurs, log the exception and continue to next device.", ) - class Meta: # pylint: disable=too-few-public-methods + class Meta: """Meta object boilerplate for onboarding.""" - name = "Perform Device Onboarding" - description = "Login to a device(s) and populate Nautobot Device object(s)." + name = "Perform Device Onboarding (Original)" + description = "Login to a device(s) and populate Nautobot Device object(s). This is the original Job as part of Device Onboarding initially created in 2021." has_sensitive_variables = False + hidden = True def __init__(self, *args, **kwargs): """Overload init to instantiate class attributes per W0201.""" @@ -181,4 +213,554 @@ def _parse_credentials(self, credentials): self.secret = settings.NAPALM_ARGS.get("secret", None) -register_jobs(OnboardingTask) +class SSOTSyncDevices(DataSource): # pylint: disable=too-many-instance-attributes + """Job for syncing basic device info from a network into Nautobot.""" + + def __init__(self, *args, **kwargs): + """Initialize SSoTSyncDevices.""" + super().__init__(*args, **kwargs) + self.processed_csv_data = {} + self.task_kwargs_csv_data = {} + + self.diffsync_flags = DiffSyncFlags.SKIP_UNMATCHED_DST + + class Meta: + """Metadata about this Job.""" + + name = "Sync Devices From Network" + description = "Synchronize basic device information into Nautobot from one or more network devices. Information includes Device Name, Serial Number, Management IP/Interface." + + debug = BooleanVar( + default=False, + description="Enable for more verbose logging.", + ) + csv_file = FileVar( + label="CSV File", required=False, description="If a file is provided all the options below will be ignored." + ) + location = ObjectVar( + model=Location, + required=False, + query_params={"content_type": "dcim.device"}, + description="Assigned Location for all synced device(s)", + ) + namespace = ObjectVar(model=Namespace, required=False, description="Namespace ip addresses belong to.") + ip_addresses = StringVar( + required=False, + description="IP address of the device to sync, specify in a comma separated list for multiple devices.", + label="IPv4 addresses", + ) + port = IntegerVar(required=False, default=22) + timeout = IntegerVar(required=False, default=30) + set_mgmt_only = BooleanVar( + default=True, + label="Set Management Only", + description="If True, new interfaces that are created will be set to management only. If False, new interfaces will be set to not be management only.", + ) + update_devices_without_primary_ip = BooleanVar( + default=False, + description="If a device at the specified location already exists in Nautobot but the primary ip address " + "does not match an ip address entered, update this device with the sync.", + ) + device_role = ObjectVar( + model=Role, + query_params={"content_types": "dcim.device"}, + required=False, + description="Role to be applied to all synced devices.", + ) + device_status = ObjectVar( + model=Status, + query_params={"content_types": "dcim.device"}, + required=False, + description="Status to be applied to all synced devices.", + ) + interface_status = ObjectVar( + model=Status, + query_params={"content_types": "dcim.interface"}, + required=False, + description="Status to be applied to all new synced device interfaces. This value does not update with additional syncs.", + ) + ip_address_status = ObjectVar( + label="IP address status", + model=Status, + query_params={"content_types": "ipam.ipaddress"}, + required=False, + description="Status to be applied to all new synced IP addresses. This value does not update with additional syncs.", + ) + secrets_group = ObjectVar( + model=SecretsGroup, required=False, description="SecretsGroup for device connection credentials." + ) + platform = ObjectVar( + model=Platform, + required=False, + description="Device platform. Define ONLY to override auto-recognition of platform.", + ) + + def load_source_adapter(self): + """Load onboarding network adapter.""" + self.source_adapter = SyncDevicesNetworkAdapter(job=self, sync=self.sync) + self.source_adapter.load() + + def load_target_adapter(self): + """Load onboarding Nautobot adapter.""" + self.target_adapter = SyncDevicesNautobotAdapter(job=self, sync=self.sync) + self.target_adapter.load() + + def _convert_sring_to_bool(self, string, header): + """Given a string of 'true' or 'false' convert to bool.""" + if string.lower() == "true": + return True + if string.lower() == "false": + return False + raise ValidationError( + f"'{string}' in column '{header}' failed to convert to a boolean value. " + "Please use either 'True' or 'False'." + ) + + def _process_csv_data(self, csv_file): + """Convert CSV data into a dictionary containing Nautobot objects.""" + self.logger.info("Decoding CSV file...") + decoded_csv_file = csv_file.read().decode("utf-8") + csv_reader = csv.DictReader(StringIO(decoded_csv_file)) + self.logger.info("Processing CSV data...") + processing_failed = False + processed_csv_data = {} + self.task_kwargs_csv_data = {} + row_count = 1 + for row in csv_reader: + query = None + try: + query = f"location_name: {row.get('location_name')}, location_parent_name: {row.get('location_parent_name')}" + if row.get("location_parent_name"): + location = Location.objects.get( + name=row["location_name"].strip(), parent__name=row["location_parent_name"].strip() + ) + else: + query = query = f"location_name: {row.get('location_name')}" + location = Location.objects.get(name=row["location_name"].strip(), parent=None) + query = f"device_role: {row.get('device_role_name')}" + device_role = Role.objects.get( + name=row["device_role_name"].strip(), + ) + query = f"namespace: {row.get('namespace')}" + namespace = Namespace.objects.get( + name=row["namespace"].strip(), + ) + query = f"device_status: {row.get('device_status_name')}" + device_status = Status.objects.get( + name=row["device_status_name"].strip(), + ) + query = f"interface_status: {row.get('interface_status_name')}" + interface_status = Status.objects.get( + name=row["interface_status_name"].strip(), + ) + query = f"ip_address_status: {row.get('ip_address_status_name')}" + ip_address_status = Status.objects.get( + name=row["ip_address_status_name"].strip(), + ) + query = f"secrets_group: {row.get('secrets_group_name')}" + secrets_group = SecretsGroup.objects.get( + name=row["secrets_group_name"].strip(), + ) + query = f"platform: {row.get('platform_name')}" + platform = None + if row.get("platform_name"): + platform = Platform.objects.get( + name=row["platform_name"].strip(), + ) + + set_mgmgt_only = self._convert_sring_to_bool( + string=row["set_mgmt_only"].lower().strip(), header="set_mgmt_only" + ) + update_devices_without_primary_ip = self._convert_sring_to_bool( + string=row["update_devices_without_primary_ip"].lower().strip(), + header="update_devices_without_primary_ip", + ) + + processed_csv_data[row["ip_address_host"]] = {} + processed_csv_data[row["ip_address_host"]]["location"] = location + processed_csv_data[row["ip_address_host"]]["namespace"] = namespace + processed_csv_data[row["ip_address_host"]]["port"] = int(row["port"].strip()) + processed_csv_data[row["ip_address_host"]]["timeout"] = int(row["timeout"].strip()) + processed_csv_data[row["ip_address_host"]]["set_mgmt_only"] = set_mgmgt_only + processed_csv_data[row["ip_address_host"]][ + "update_devices_without_primary_ip" + ] = update_devices_without_primary_ip + processed_csv_data[row["ip_address_host"]]["device_role"] = device_role + processed_csv_data[row["ip_address_host"]]["device_status"] = device_status + processed_csv_data[row["ip_address_host"]]["interface_status"] = interface_status + processed_csv_data[row["ip_address_host"]]["ip_address_status"] = ip_address_status + processed_csv_data[row["ip_address_host"]]["secrets_group"] = secrets_group + processed_csv_data[row["ip_address_host"]]["platform"] = platform + + # Prepare ids to send to the job in celery + self.task_kwargs_csv_data[row["ip_address_host"]] = {} + self.task_kwargs_csv_data[row["ip_address_host"]]["port"] = int(row["port"].strip()) + self.task_kwargs_csv_data[row["ip_address_host"]]["timeout"] = int(row["timeout"].strip()) + self.task_kwargs_csv_data[row["ip_address_host"]]["secrets_group"] = ( + secrets_group.id if secrets_group else "" + ) + self.task_kwargs_csv_data[row["ip_address_host"]]["platform"] = platform.id if platform else "" + row_count += 1 + except ObjectDoesNotExist as err: + self.logger.error(f"(row {sum([row_count, 1])}), {err} {query}") + processing_failed = True + row_count += 1 + except ValidationError as err: + self.logger.error(f"(row {sum([row_count, 1])}), {err}") + row_count += 1 + if processing_failed: + processed_csv_data = None + if row_count <= 1: + self.logger.error("The CSV file is empty!") + processed_csv_data = None + + return processed_csv_data + + def run( + self, + dryrun, + memory_profiling, + debug, + csv_file, + location, + namespace, + ip_addresses, + set_mgmt_only, + update_devices_without_primary_ip, + device_role, + device_status, + interface_status, + ip_address_status, + port, + timeout, + secrets_group, + platform, + *args, + **kwargs, + ): + """Run sync.""" + self.dryrun = dryrun + self.memory_profiling = memory_profiling + self.debug = debug + + if csv_file: + self.processed_csv_data = self._process_csv_data(csv_file=csv_file) + if self.processed_csv_data: + # create a list of ip addresses for processing in the adapter + self.ip_addresses = [] + for ip_address in self.processed_csv_data: + self.ip_addresses.append(ip_address) + # prepare the task_kwargs needed by the CommandGetterDO job + self.job_result.task_kwargs = {"debug": debug, "csv_file": self.task_kwargs_csv_data} + else: + raise ValidationError(message="CSV check failed. No devices will be synced.") + + else: + # Verify that all requried form inputs have been provided + required_inputs = { + "location": location, + "namespace": namespace, + "ip_addresses": ip_addresses, + "device_role": device_role, + "device_status": device_status, + "interface_status": interface_status, + "ip_address_status": ip_address_status, + "port": port, + "timeout": timeout, + "secrets_group": secrets_group, + } + + missing_required_inputs = [ + form_field for form_field, input_value in required_inputs.items() if not input_value + ] + if not missing_required_inputs: + pass + else: + self.logger.error(f"Missing requried inputs from job form: {missing_required_inputs}") + raise ValidationError(message=f"Missing required inputs {missing_required_inputs}") + + self.location = location + self.namespace = namespace + self.ip_addresses = ip_addresses.replace(" ", "").split(",") + self.set_mgmt_only = set_mgmt_only + self.update_devices_without_primary_ip = update_devices_without_primary_ip + self.device_role = device_role + self.device_status = device_status + self.interface_status = interface_status + self.ip_address_status = ip_address_status + self.port = port + self.timeout = timeout + self.secrets_group = secrets_group + self.platform = platform + + self.job_result.task_kwargs = { + "debug": debug, + "location": location, + "namespace": namespace, + "ip_addresses": ip_addresses, + "set_mgmt_only": set_mgmt_only, + "update_devices_without_primary_ip": update_devices_without_primary_ip, + "device_role": device_role, + "device_status": device_status, + "interface_status": interface_status, + "ip_address_status": ip_address_status, + "port": port, + "timeout": timeout, + "secrets_group": secrets_group, + "platform": platform, + "csv_file": "", + } + super().run(dryrun, memory_profiling, *args, **kwargs) + + +class SSOTSyncNetworkData(DataSource): # pylint: disable=too-many-instance-attributes + """Job syncing extended device attributes into Nautobot.""" + + def __init__(self, *args, **kwargs): + """Initialize SSOTSyncNetworkData.""" + super().__init__(*args, **kwargs) + + self.filtered_devices = None # Queryset of devices based on job form inputs + self.command_getter_result = None # Dict result from CommandGetter nornir task + self.devices_to_load = None # Queryset consisting of devices that responded + + class Meta: + """Metadata about this Job.""" + + name = "Sync Network Data From Network" + description = "Synchronize extended device attribute information into Nautobot from one or more network devices. Information includes Interfaces, IPAddresses, Prefixes, and Vrfs." + + debug = BooleanVar(description="Enable for more verbose logging.") + sync_vlans = BooleanVar( + default=False, description="Sync VLANs and interface VLAN assignments.") + sync_vrfs = BooleanVar(default=False, description="Sync VRFs and interface VRF assignments.") + namespace = ObjectVar( + model=Namespace, required=True, description="The namespace for all IP addresses created or updated in the sync." + ) + interface_status = ObjectVar( + model=Status, + query_params={"content_types": "dcim.interface"}, + required=True, + description="Status to be applied to all synced device interfaces. This will update existing interface statuses.", + ) + ip_address_status = ObjectVar( + label="IP address status", + model=Status, + query_params={"content_types": "ipam.ipaddress"}, + required=True, + description="Status to be applied to all synced IP addresses. This will update existing IP address statuses", + ) + + default_prefix_status = ObjectVar( + model=Status, + query_params={"content_types": "ipam.prefix"}, + required=True, + description="Status to be applied to all new created prefixes. Prefix status does not update with additional syncs.", + ) + devices = MultiObjectVar( + model=Device, + required=False, + description="Device(s) to update.", + ) + location = ObjectVar( + model=Location, + query_params={"content_type": "dcim.device"}, + required=False, + description="Only update devices at a specific location.", + ) + device_role = ObjectVar( + model=Role, + query_params={"content_types": "dcim.device"}, + required=False, + description="Only update devices with the selected role.", + ) + platform = ObjectVar( + model=Platform, + required=False, + description="Only update devices with the selected platform.", + ) + + def load_source_adapter(self): + """Load network data adapter.""" + # do not load source data if the job form does not filter which devices to sync + if self.filtered_devices: + self.source_adapter = SyncNetworkDataNetworkAdapter(job=self, sync=self.sync) + self.source_adapter.load() + + def load_target_adapter(self): + """Load network data Nautobot adapter.""" + self.target_adapter = SyncNetworkDataNautobotAdapter(job=self, sync=self.sync) + self.target_adapter.load() + + def run( + self, + dryrun, + memory_profiling, + debug, + namespace, + interface_status, + ip_address_status, + default_prefix_status, + location, + devices, + device_role, + platform, + sync_vlans, + sync_vrfs, + *args, + **kwargs, + ): + """Run sync.""" + self.dryrun = dryrun + self.memory_profiling = memory_profiling + self.debug = debug + self.namespace = namespace + self.ip_address_status = ip_address_status + self.interface_status = interface_status + self.default_prefix_status = default_prefix_status + self.location = location + self.devices = devices + self.device_role = device_role + self.platform = platform + self.sync_vlans = sync_vlans + self.sync_vrfs = sync_vrfs + + # Check for last_network_data_sync CustomField + if self.debug: + self.logger.debug("Checking for last_network_data_sync custom field") + try: + + cf = CustomField.objects.get(key="last_network_data_sync") + except ObjectDoesNotExist: + cf, _ = CustomField.objects.get_or_create( + label="Last Network Data Sync", + key="last_network_data_sync", + type=CustomFieldTypeChoices.TYPE_DATE, + required=False, + ) + + cf.content_types.add(ContentType.objects.get_for_model(Device)) + + if self.debug: + self.logger.debug("Custom field found or created") + except Exception as err: # pylint: disable=broad-exception-caught + self.logger.error(f"Failed to get or create last_network_data_sync custom field, {err}") + return + + # Filter devices based on form input + device_filter = {} + if self.devices: + device_filter["id__in"] = [device.id for device in devices] + if self.location: + device_filter["location"] = location + if self.device_role: + device_filter["role"] = device_role + if self.platform: + device_filter["platform"] = platform + if device_filter: # prevent all devices from being returned by an empty filter + self.filtered_devices = Device.objects.filter(**device_filter) + else: + self.logger.error("No device filter options were provided, no devices will be synced.") + + # Stop the job if no devices are returned after filtering + if not self.filtered_devices: + self.logger.info("No devices returned based on filter selections.") + return + + # Log the devices that will be synced + filtered_devices_names = list(self.filtered_devices.values_list("name", flat=True)) + self.logger.info(f"{len(filtered_devices_names)} devices will be synced") + if len(filtered_devices_names) <= 300: + self.logger.info(f"Devices: {filtered_devices_names}") + else: + self.logger.warning("Over 300 devies were selected to sync") + + self.job_result.task_kwargs = { + "debug": debug, + "ip_address_status": ip_address_status, + "default_prefix_status": default_prefix_status, + "location": location, + "devices": self.filtered_devices, + "device_role": device_role, + "sync_vlans": sync_vlans, + "sync_vrfs": sync_vrfs, + } + + super().run(dryrun, memory_profiling, *args, **kwargs) + + +class DeviceOnboardingTroubleshootingJob(Job): + """Simple Job to Execute Show Command.""" + + debug = BooleanVar() + ip_addresses = StringVar() + port = IntegerVar(default=22) + timeout = IntegerVar(default=30) + secrets_group = ObjectVar(model=SecretsGroup) + platform = ObjectVar(model=Platform, required=True) + ssot_job_type = ChoiceVar(choices=SSOT_JOB_TO_COMMAND_CHOICE) + + class Meta: + """Meta object boilerplate for onboarding.""" + + name = "Runs Commands on a Device to simulate SSoT Command Getter." + description = "Login to a device(s) and run commands." + has_sensitive_variables = False + hidden = True + + def run(self, *args, **kwargs): # pragma: no cover + """Process onboarding task from ssot-ni job.""" + ip_addresses = kwargs["ip_addresses"].replace(" ", "").split(",") + port = kwargs["port"] + platform = kwargs["platform"] + username, password, secret = _parse_credentials(kwargs["secrets_group"]) # pylint:disable=unused-variable + + # Initiate Nornir instance with empty inventory + compiled_results = {} + try: + with InitNornir( + runner=NORNIR_SETTINGS.get("runner"), + logging={"enabled": False}, + inventory={ + "plugin": "empty-inventory", + }, + ) as nornir_obj: + for entered_ip in ip_addresses: + single_host_inventory_constructed, _ = _set_inventory( + entered_ip, platform, port, username, password + ) + nornir_obj.inventory.hosts.update(single_host_inventory_constructed) + nr_with_processors = nornir_obj.with_processors([TroubleshootingProcessor(compiled_results)]) + if kwargs["ssot_job_type"] == "both": + kwargs.update({"sync_vrfs": True}) + kwargs.update({"sync_vlans": True}) + nr_with_processors.run( + task=netmiko_send_commands, + command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], + command_getter_job="sync_devices", + **kwargs, + ) + nr_with_processors.run( + task=netmiko_send_commands, + command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], + command_getter_job="sync_network_data", + **kwargs, + ) + else: + if kwargs["ssot_job_type"] == "sync_network_data": + kwargs.update({"sync_vrfs": True}) + kwargs.update({"sync_vlans": True}) + nr_with_processors.run( + task=netmiko_send_commands, + command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], + command_getter_job=kwargs["ssot_job_type"], + **kwargs, + ) + except Exception as err: # pylint: disable=broad-exception-caught + self.logger.info("Error During Sync Devices Command Getter: %s", err) + self.create_file("command_outputs.json", json.dumps(compiled_results)) + return f"Successfully ran the following commands: {', '.join(list(compiled_results.keys()))}" + + +jobs = [OnboardingTask, SSOTSyncDevices, SSOTSyncNetworkData, DeviceOnboardingTroubleshootingJob] +register_jobs(*jobs) diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py new file mode 100755 index 00000000..4c961531 --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -0,0 +1,293 @@ +"""CommandGetter.""" + +import json +from typing import Dict + +from django.conf import settings +from nautobot.dcim.models import Platform +from nautobot.dcim.utils import get_all_network_driver_mappings +from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices +from nautobot.extras.models import SecretsGroup +from nautobot_plugin_nornir.constants import NORNIR_SETTINGS +from nautobot_plugin_nornir.plugins.inventory.nautobot_orm import NautobotORMInventory +from nornir import InitNornir +from nornir.core.exceptions import NornirSubTaskError +from nornir.core.plugins.inventory import InventoryPluginRegister +from nornir.core.task import Result, Task +from nornir_netmiko.tasks import netmiko_send_command +from ntc_templates.parse import parse_output + +from nautobot_device_onboarding.constants import SUPPORTED_COMMAND_PARSERS, SUPPORTED_NETWORK_DRIVERS +from nautobot_device_onboarding.nornir_plays.empty_inventory import EmptyInventory +from nautobot_device_onboarding.nornir_plays.inventory_creator import _set_inventory +from nautobot_device_onboarding.nornir_plays.logger import NornirLogger +from nautobot_device_onboarding.nornir_plays.processor import CommandGetterProcessor +from nautobot_device_onboarding.nornir_plays.transform import add_platform_parsing_info + +InventoryPluginRegister.register("nautobot-inventory", NautobotORMInventory) +InventoryPluginRegister.register("empty-inventory", EmptyInventory) + + +def deduplicate_command_list(data): + """Deduplicates a list of dictionaries based on 'command' and 'parser' keys. + + Args: + data: A list of dictionaries. + + Returns: + A new list containing only unique elements based on 'command' and 'parser'. + """ + seen = set() + unique_list = [] + for item in data: + # Create a tuple containing only 'command' and 'parser' for comparison + key = (item["command"], item["parser"]) + if key not in seen: + seen.add(key) + unique_list.append(item) + return unique_list + + +def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs): + """Using merged command mapper info and look up all commands that need to be run.""" + all_commands = [] + for key, value in yaml_parsed_info.items(): + if key == "pre_processor": + for _, v in value.items(): + current_root_key = v.get("commands") + if isinstance(current_root_key, list): + # Means their is any "nested" structures. e.g multiple commands + for command in v["commands"]: + all_commands.append(command) + else: + if isinstance(current_root_key, dict): + all_commands.append(current_root_key) + else: + # Deduplicate commands + parser key + current_root_key = value.get("commands") + if isinstance(current_root_key, list): + # Means their is any "nested" structures. e.g multiple commands + for command in value["commands"]: + # If syncing vlans isn't inscope don't run the unneeded commands. + if not sync_vlans and key in ["interfaces__tagged_vlans", "interfaces__untagged_vlan"]: + continue + # If syncing vrfs isn't inscope remove the unneeded commands. + if not sync_vrfs and key == "interfaces__vrf": + continue + all_commands.append(command) + else: + if isinstance(current_root_key, dict): + # If syncing vlans isn't inscope don't run the unneeded commands. + if not sync_vlans and key in ["interfaces__tagged_vlans", "interfaces__untagged_vlan"]: + continue + # If syncing vrfs isn't inscope remove the unneeded commands. + if not sync_vrfs and key == "interfaces__vrf": + continue + # Means their isn't a "nested" structures. e.g 1 command + all_commands.append(current_root_key) + return deduplicate_command_list(all_commands) + + +def netmiko_send_commands(task: Task, command_getter_yaml_data: Dict, command_getter_job: str, **orig_job_kwargs): + """Run commands specified in PLATFORM_COMMAND_MAP.""" + if not task.host.platform: + return Result(host=task.host, result=f"{task.host.name} has no platform set.", failed=True) + if task.host.platform not in SUPPORTED_NETWORK_DRIVERS or not "cisco_wlc_ssh": + return Result(host=task.host, result=f"{task.host.name} has a unsupported platform set.", failed=True) + if not command_getter_yaml_data[task.host.platform].get(command_getter_job): + return Result( + host=task.host, result=f"{task.host.name} has missing definitions in command_mapper YAML file.", failed=True + ) + task.host.data["platform_parsing_info"] = command_getter_yaml_data[task.host.platform] + commands = _get_commands_to_run( + command_getter_yaml_data[task.host.platform][command_getter_job], + orig_job_kwargs.get("sync_vlans", False), + orig_job_kwargs.get("sync_vrfs", False), + ) + # All commands in this for loop are running within 1 device connection. + for result_idx, command in enumerate(commands): + send_command_kwargs = {} + try: + current_result = task.run( + task=netmiko_send_command, + name=command["command"], + command_string=command["command"], + read_timeout=60, + **send_command_kwargs, + ) + if command.get("parser") in SUPPORTED_COMMAND_PARSERS: + if isinstance(current_result.result, str): + if "Invalid input detected at" in current_result.result: + task.results[result_idx].result = [] + task.results[result_idx].failed = False + else: + if command["parser"] == "textfsm": + try: + # Parsing textfsm ourselves instead of using netmikos use_ function to be able to handle exceptions + # ourselves. Default for netmiko is if it can't parse to return raw text which is tougher to handle. + parsed_output = parse_output( + platform=get_all_network_driver_mappings()[task.host.platform]["ntc_templates"], + command=command["command"], + data=current_result.result, + ) + task.results[result_idx].result = parsed_output + task.results[result_idx].failed = False + except Exception: # https://github.com/networktocode/ntc-templates/issues/369 + task.results[result_idx].result = [] + task.results[result_idx].failed = False + else: + if command["parser"] == "none": + try: + jsonified = json.loads(current_result.result) + task.results[result_idx].result = jsonified + task.results[result_idx].failed = False + except Exception: + task.result.failed = False + except NornirSubTaskError: + # We don't want to fail the entire subtask if SubTaskError is hit, set result to empty list and failt to False + # Handle this type or result latter in the ETL process. + task.results[result_idx].result = [] + task.results[result_idx].failed = False + + +def _parse_credentials(credentials): + """Parse and return dictionary of credentials.""" + if credentials: + try: + username = credentials.get_secret_value( + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_USERNAME, + ) + password = credentials.get_secret_value( + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_PASSWORD, + ) + try: + secret = credentials.get_secret_value( + access_type=SecretsGroupAccessTypeChoices.TYPE_GENERIC, + secret_type=SecretsGroupSecretTypeChoices.TYPE_SECRET, + ) + except Exception: # pylint: disable=broad-exception-caught + secret = None + except Exception: # pylint: disable=broad-exception-caught + return (None, None, None) + else: + username = settings.NAPALM_USERNAME + password = settings.NAPALM_PASSWORD + secret = settings.NAPALM_ARGS.get("secret", None) + return (username, password, secret) + + +def sync_devices_command_getter(job_result, log_level, kwargs): + """Nornir play to run show commands for sync_devices ssot job.""" + logger = NornirLogger(job_result, log_level) + + if kwargs["csv_file"]: # ip_addreses will be keys in a dict + ip_addresses = [] + for ip_address in kwargs["csv_file"]: + ip_addresses.append(ip_address) + else: + ip_addresses = kwargs["ip_addresses"].replace(" ", "").split(",") + port = kwargs["port"] + # timeout = kwargs["timeout"] + platform = kwargs["platform"] + username, password, secret = _parse_credentials(kwargs["secrets_group"]) + + # Initiate Nornir instance with empty inventory + try: + compiled_results = {} + with InitNornir( + runner=NORNIR_SETTINGS.get("runner"), + logging={"enabled": False}, + inventory={ + "plugin": "empty-inventory", + }, + ) as nornir_obj: + nr_with_processors = nornir_obj.with_processors([CommandGetterProcessor(logger, compiled_results, kwargs)]) + loaded_secrets_group = None + for entered_ip in ip_addresses: + if kwargs["csv_file"]: + # get platform if one was provided via csv + platform = None + platform_id = kwargs["csv_file"][entered_ip]["platform"] + if platform_id: + platform = Platform.objects.get(id=platform_id) + + # parse secrets from secrets groups provided via csv + secrets_group_id = kwargs["csv_file"][entered_ip]["secrets_group"] + if secrets_group_id: + new_secrets_group = SecretsGroup.objects.get(id=secrets_group_id) + # only update the credentials if the secrets_group specified on a csv row + # is different than the secrets group on the previous csv row. This prevents + # unnecessary repeat calls to secrets providers. + if new_secrets_group != loaded_secrets_group: + logger.info(f"Parsing credentials from Secrets Group: {new_secrets_group.name}") + loaded_secrets_group = new_secrets_group + username, password, secret = _parse_credentials(loaded_secrets_group) + if not (username and password): + logger.error(f"Unable to onboard {entered_ip}, failed to parse credentials") + single_host_inventory_constructed, exc_info = _set_inventory( + host_ip=entered_ip, + platform=platform, + port=kwargs["csv_file"][entered_ip]["port"], + username=username, + password=password, + ) + if exc_info: + logger.error(f"Unable to onboard {entered_ip}, failed with exception {exc_info}") + continue + else: + single_host_inventory_constructed, exc_info = _set_inventory( + entered_ip, platform, port, username, password + ) + if exc_info: + logger.error(f"Unable to onboard {entered_ip}, failed with exception {exc_info}") + continue + nr_with_processors.inventory.hosts.update(single_host_inventory_constructed) + nr_with_processors.run( + task=netmiko_send_commands, + command_getter_yaml_data=nr_with_processors.inventory.defaults.data["platform_parsing_info"], + command_getter_job="sync_devices", + **kwargs, + ) + except Exception as err: # pylint: disable=broad-exception-caught + logger.info(f"Error During Sync Devices Command Getter: {err}") + return compiled_results + + +def sync_network_data_command_getter(job_result, log_level, kwargs): + """Nornir play to run show commands for sync_network_data ssot job.""" + logger = NornirLogger(job_result, log_level) + + try: + compiled_results = {} + qs = kwargs["devices"] + if not qs: + return None + with InitNornir( + runner=NORNIR_SETTINGS.get("runner"), + logging={"enabled": False}, + inventory={ + "plugin": "nautobot-inventory", + "options": { + "credentials_class": NORNIR_SETTINGS.get("credentials"), + "queryset": qs, + "defaults": { + "platform_parsing_info": add_platform_parsing_info(), + "network_driver_mappings": SUPPORTED_NETWORK_DRIVERS, + "sync_vlans": kwargs["sync_vlans"], + "sync_vrfs": kwargs["sync_vrfs"], + }, + }, + }, + ) as nornir_obj: + nr_with_processors = nornir_obj.with_processors([CommandGetterProcessor(logger, compiled_results, kwargs)]) + nr_with_processors.run( + task=netmiko_send_commands, + command_getter_yaml_data=nr_with_processors.inventory.defaults.data["platform_parsing_info"], + command_getter_job="sync_network_data", + **kwargs, + ) + except Exception as err: # pylint: disable=broad-exception-caught + logger.info(f"Error During Sync Network Data Command Getter: {err}") + return compiled_results diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py new file mode 100755 index 00000000..8cd132c3 --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -0,0 +1,219 @@ +"""Command Extraction and Formatting or SSoT Based Jobs.""" + +import json +import logging +from json.decoder import JSONDecodeError + +from django.template import engines +from django.utils.module_loading import import_string +from jdiff import extract_data_from_json +from jinja2.sandbox import SandboxedEnvironment + + +def setup_logger(logger_name, debug_on): + """Creates a logger for the ETL process.""" + logger = logging.getLogger(logger_name) + if debug_on: + logger.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.INFO) + return logger + + +def get_django_env(): + """Load Django Jinja filters from the Django jinja template engine, and add them to the jinja_env. + + Returns: + SandboxedEnvironment + """ + # Use a custom Jinja2 environment instead of Django's to avoid HTML escaping + j2_env = { + "undefined": "jinja2.StrictUndefined", + "trim_blocks": True, + "lstrip_blocks": False, + } + if isinstance(j2_env["undefined"], str): + j2_env["undefined"] = import_string(j2_env["undefined"]) + jinja_env = SandboxedEnvironment(**j2_env) + jinja_env.filters = engines["jinja"].env.filters + return jinja_env + + +def process_empty_result(iterable_type): + """Helper to map iterable_type on an empty result.""" + iterable_mapping = { + "dict": {}, + "str": "", + } + return iterable_mapping.get(iterable_type, []) + + +def normalize_processed_data(processed_data, iterable_type): + """Helper to normalize the processed data returned from jdiff/jmespath.""" + # If processed_data is an empty data structure, return default based on iterable_type + if not processed_data: + return process_empty_result(iterable_type) + if isinstance(processed_data, str): + try: + # If processed_data is a json string try to load it into a python datatype. + post_processed_data = json.loads(processed_data) + except (JSONDecodeError, TypeError): + post_processed_data = processed_data + else: + post_processed_data = processed_data + if isinstance(post_processed_data, list) and len(post_processed_data) == 1: + if isinstance(post_processed_data[0], str): + post_processed_data = post_processed_data[0] + else: + if isinstance(post_processed_data[0], dict): + if iterable_type: + if iterable_type == "dict": + post_processed_data = post_processed_data[0] + else: + post_processed_data = post_processed_data[0] + if not post_processed_data and iterable_type in ["str", "dict"]: + return process_empty_result(iterable_type) + return post_processed_data + + +def extract_and_post_process(parsed_command_output, yaml_command_element, j2_data_context, iter_type, job_debug): + """Helper to extract and apply post_processing on a single element.""" + logger = logger = setup_logger("DEVICE_ONBOARDING_ETL_LOGGER", job_debug) + # if parsed_command_output is an empty data structure, no need to go through all the processing. + if not parsed_command_output: + return parsed_command_output, normalize_processed_data(parsed_command_output, iter_type) + j2_env = get_django_env() + # This just renders the jpath itself if any interpolation is needed. + jpath_template = j2_env.from_string(yaml_command_element["jpath"]) + j2_rendered_jpath = jpath_template.render(**j2_data_context) + logger.debug("Post Rendered Jpath: %s", j2_rendered_jpath) + try: + if isinstance(parsed_command_output, str): + try: + parsed_command_output = json.loads(parsed_command_output) + except (JSONDecodeError, TypeError): + logger.debug("Parsed Command Output is a string but not jsonable: %s", parsed_command_output) + extracted_value = extract_data_from_json(parsed_command_output, j2_rendered_jpath) + except TypeError as err: + logger.debug("Error occurred during extraction: %s setting default extracted value to []", err) + extracted_value = [] + pre_processed_extracted = extracted_value + if yaml_command_element.get("post_processor"): + # j2 context data changes obj(hostname) -> extracted_value for post_processor + j2_data_context["obj"] = extracted_value + template = j2_env.from_string(yaml_command_element["post_processor"]) + extracted_processed = template.render(**j2_data_context) + else: + extracted_processed = extracted_value + post_processed_data = normalize_processed_data(extracted_processed, iter_type) + logger.debug("Pre Processed Extracted: %s", pre_processed_extracted) + logger.debug("Post Processed Data: %s", post_processed_data) + return pre_processed_extracted, post_processed_data + + +def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_debug): + """Extract, process data.""" + result_dict = {} + sync_vlans = host.defaults.data.get("sync_vlans", False) + sync_vrfs = host.defaults.data.get("sync_vrfs", False) + get_context_from_pre_processor = {} + if command_info_dict.get("pre_processor"): + for pre_processor_name, field_data in command_info_dict["pre_processor"].items(): + if isinstance(field_data["commands"], dict): + # only one command is specified as a dict force it to a list. + loop_commands = [field_data["commands"]] + else: + loop_commands = field_data["commands"] + for show_command_dict in loop_commands: + final_iterable_type = show_command_dict.get("iterable_type") + _, current_field_post = extract_and_post_process( + command_outputs_dict[show_command_dict["command"]], + show_command_dict, + {"obj": host.name, "original_host": host.name}, + final_iterable_type, + job_debug, + ) + get_context_from_pre_processor[pre_processor_name] = current_field_post + for ssot_field, field_data in command_info_dict.items(): + if not sync_vlans and ssot_field in ["interfaces__tagged_vlans", "interfaces__untagged_vlan"]: + continue + # If syncing vrfs isn't inscope remove the unneeded commands. + if not sync_vrfs and ssot_field == "interfaces__vrf": + continue + if ssot_field == "pre_processor": + continue + if isinstance(field_data["commands"], dict): + # only one command is specified as a dict force it to a list. + loop_commands = [field_data["commands"]] + else: + loop_commands = field_data["commands"] + for show_command_dict in loop_commands: + final_iterable_type = show_command_dict.get("iterable_type") + if field_data.get("root_key"): + original_context = {"obj": host.name, "original_host": host.name} + merged_context = {**original_context, **get_context_from_pre_processor} + root_key_pre, root_key_post = extract_and_post_process( + command_outputs_dict[show_command_dict["command"]], + show_command_dict, + merged_context, + final_iterable_type, + job_debug, + ) + result_dict[ssot_field] = root_key_post + else: + field_nesting = ssot_field.split("__") + # for current_nesting in field_nesting: + if len(field_nesting) > 1: + # Means there is "anticipated" data nesting `interfaces__mtu` means final data would be + # {"Ethernet1/1": {"mtu": }} + for current_key in root_key_pre: + # current_key is a single iteration from the root_key extracted value. Typically we want this to be + # a list of data that we want to become our nested key. E.g. current_key "Ethernet1/1" + # These get passed into the render context for the template render to allow nested jpaths to use + # the current_key context for more flexible jpath queries. + original_context = {"current_key": current_key, "obj": host.name, "original_host": host.name} + merged_context = {**original_context, **get_context_from_pre_processor} + _, current_key_post = extract_and_post_process( + command_outputs_dict[show_command_dict["command"]], + show_command_dict, + merged_context, + final_iterable_type, + job_debug, + ) + result_dict[field_nesting[0]][current_key][field_nesting[1]] = current_key_post + else: + original_context = {"obj": host.name, "original_host": host.name} + merged_context = {**original_context, **get_context_from_pre_processor} + _, current_field_post = extract_and_post_process( + command_outputs_dict[show_command_dict["command"]], + show_command_dict, + merged_context, + final_iterable_type, + job_debug, + ) + result_dict[ssot_field] = current_field_post + # if command_info_dict.get("validator_pattern"): + # # temp validator + # if command_info_dict["validator_pattern"] == "not None": + # if not extracted_processed: + # logger.debug("validator pattern not detected, checking next command.") + # continue + # else: + # logger.debug("About to break the sequence due to valid pattern found") + # result_dict[dict_field] = extracted_processed + # break + return result_dict + + +def extract_show_data(host, command_outputs, command_getter_type, job_debug): + """Take a result of show command and extra specific needed data. + + Args: + host (host): host from task + command_outputs (dict): dictionary of results from command getter. + command_getter_type (str): to know what dict to pull, sync_devices or sync_network_data. + job_debug (logging.INFO or logging.DEBUG): to know if debug button was checked. + """ + command_getter_iterable = host.data["platform_parsing_info"][command_getter_type] + all_results_extracted = perform_data_extraction(host, command_getter_iterable, command_outputs, job_debug) + return all_results_extracted diff --git a/nautobot_device_onboarding/nornir_plays/processor.py b/nautobot_device_onboarding/nornir_plays/processor.py new file mode 100755 index 00000000..0c3bb34b --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/processor.py @@ -0,0 +1,117 @@ +"""Processor used by Nornir command getter tasks to prep data for SSoT framework sync and to catch unknown errors.""" + +from typing import Dict + +from jsonschema import ValidationError, validate +from nornir.core.inventory import Host +from nornir.core.task import MultiResult, Task +from nornir_nautobot.plugins.processors import BaseLoggingProcessor + +from nautobot_device_onboarding.nornir_plays.formatter import extract_show_data +from nautobot_device_onboarding.nornir_plays.schemas import NETWORK_DATA_SCHEMA, NETWORK_DEVICES_SCHEMA + + +class CommandGetterProcessor(BaseLoggingProcessor): + """Processor class for Command Getter Nornir Tasks.""" + + def __init__(self, logger, command_outputs, kwargs): + """Set logging facility.""" + self.logger = logger + self.data: Dict = command_outputs + self.kwargs = kwargs + + def task_instance_started(self, task: Task, host: Host) -> None: + """Processor for logging and data processing on task start.""" + if not self.data.get(host.name): + self.data[host.name] = { + "platform": host.platform, + "manufacturer": host.platform.split("_")[0].title() if host.platform else "PLACEHOLDER", + "network_driver": host.platform, + } + + def task_instance_completed(self, task: Task, host: Host, result: MultiResult) -> None: + """Processor for logging and data processing on task completed. + + Args: + task (Task): Nornir task individual object + host (Host): Host object with Nornir + result (MultiResult): Result from Nornir task + + Returns: + None + """ + parsed_command_outputs = {} + self.logger.info( + f"Task instance completed. Task Name: {task.name}", + extra={"object": task.host}, + ) + # If any main task resulted in a failed:True then add that key so ssot side can ignore that entry. + if result[0].failed: + if task.params["command_getter_job"] == "sync_devices": + self.logger.info( + f"{host.name} has no platform set. Removing it from the sync process.", + extra={"object": host.name}, + ) + del self.data[host.name] + else: + self.data[host.name].update({"failed": True}) + # [1:] because result 1 is the (network_send_commands ) task which runs all the subtask, it has no result. + for res in result[1:]: + parsed_command_outputs[res.name] = res.result + + ready_for_ssot_data = extract_show_data( + host, parsed_command_outputs, task.params["command_getter_job"], self.kwargs["debug"] + ) + if task.params["command_getter_job"] == "sync_devices": + try: + validate(ready_for_ssot_data, NETWORK_DEVICES_SCHEMA) + except ValidationError as e: + if self.kwargs["debug"]: + self.logger.debug(f"Schema validation failed for {host.name}. Error: {e}.") + self.data[host.name] = {"failed": True, "failed_reason": "Schema validation failed."} + else: + if self.kwargs["debug"]: + self.logger.debug(f"Ready for ssot data: {host.name} {ready_for_ssot_data}") + self.data[host.name].update(ready_for_ssot_data) + elif task.params["command_getter_job"] == "sync_network_data": + try: + validate(ready_for_ssot_data, NETWORK_DATA_SCHEMA) + except ValidationError as err: + if self.kwargs["debug"]: + self.logger.debug(f"Schema validation failed for {host.name} Error: {err}") + self.data[host.name] = {"failed": True, "failed_reason": "Schema validation failed."} + else: + if self.kwargs["debug"]: + self.logger.debug(f"Ready for ssot data: {host.name} {ready_for_ssot_data}") + self.data[host.name].update(ready_for_ssot_data) + + def subtask_instance_completed(self, task: Task, host: Host, result: MultiResult) -> None: + """Processor for logging and data processing on subtask completed.""" + self.logger.info(f"Subtask completed: {task.name}, {task.host}.", extra={"object": task.host}) + + def subtask_instance_started(self, task: Task, host: Host) -> None: # show command start + """Processor for logging and data processing on subtask start.""" + self.logger.info(f"Subtask starting: {task.name}, {task.host}.", extra={"object": task.host}) + + +class TroubleshootingProcessor(BaseLoggingProcessor): + """Processor class for to troubleshot command getter.""" + + def __init__(self, command_outputs): + """Set logging facility.""" + self.data: Dict = command_outputs + + def task_instance_completed(self, task: Task, host: Host, result: MultiResult) -> None: + """Processor for logging and data processing on task completed. + + Args: + task (Task): Nornir task individual object + host (Host): Host object with Nornir + result (MultiResult): Result from Nornir task + + Returns: + None + """ + # [1:] because result 1 is the (network_send_commands ) task which runs all the subtask, it has no result. + for res in result[1:]: + self.data[res.name] = res.result diff --git a/nautobot_device_onboarding/nornir_plays/schemas.py b/nautobot_device_onboarding/nornir_plays/schemas.py new file mode 100755 index 00000000..f9b27108 --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/schemas.py @@ -0,0 +1,193 @@ +"""General Schemas and JSONSchemas for SSoT Based Sync Jobs.""" + + +def sync_devices_schema(json_schema=True): + """Schema for SSOTSyncDevices Job.""" + if json_schema: + return { + "title": "Sync Devices From Network", + "description": "Schema for SSoT Sync Devices From Network", + "type": "object", + "required": ["hostname", "serial", "device_type", "mgmt_interface", "platform", "network_driver"], + "properties": { + "hostname": {"type": "string", "description": "Hostname of the network device"}, + "serial": {"type": "string", "description": "Serial number of the network device"}, + "device_type": {"type": "string", "description": "Type of the network device"}, + "mgmt_interface": {"type": "string", "description": "Management interface of the network device"}, + "mask_length": { + "type": "integer", + "default": 31, + "description": "Subnet mask length for the management interface (default: 31)", + }, + "platform": {"type": "string", "description": "Platform of the network device"}, + "manufacturer": { + "type": "string", + "default": "PLACEHOLDER", + "description": "Manufacturer of the network device (default: PLACEHOLDER)", + }, + "network_driver": {"type": "string", "description": "Network driver used for the device"}, + }, + } + return { + "hostname": "", + "serial": "", + "device_type": "", + "mgmt_interface": "", + "mask_length": 31, + "platform": "", + "manufacturer": "PLACEHOLDER", + "network_driver": "", + } + + +def sync_network_data_schema(json_schema=True): + """Schema for SSoT SSOTSyncNetworkData.""" + if json_schema: + return { + "title": "Sync Network Data From Network", + "description": "Schema for SSoT Sync Network Data From Network", + "type": "object", + "required": ["type", "ip_addresses", "mac_address", "link_status", "802.1Q_mode"], + "properties": { + "type": {"type": "string", "description": "Type of the network interface"}, + "ip_addresses": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["ip_address", "prefix_length"], + "properties": { + "ip_address": {"type": "string", "description": "IP address of the interface"}, + "prefix_length": {"type": "integer", "description": "Prefix length of the IP address"}, + }, + }, + "description": "List of IP addresses associated with the interface", + }, + "mac_address": {"type": "string", "description": "MAC address of the interface"}, + "mtu": {"type": "string", "description": "MTU of the interface"}, + "description": {"type": "string", "description": "Description of the interface"}, + "link_status": {"type": "boolean", "description": "Link status of the interface (up or down)"}, + "802.1Q_mode": {"type": "string", "description": "802.1Q mode of the interface (access, trunk, etc.)"}, + "lag": { + "type": "string", + "description": "LAG (Link Aggregation Group) the interface belongs to (optional)", + }, + "untagged_vlan": {"type": "object", "description": "Untagged VLAN information (optional)"}, + "tagged_vlans": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "id"], + "properties": { + "name": {"type": "string", "description": "Name of the tagged VLAN"}, + "id": {"type": "string", "description": "ID of the tagged VLAN"}, + }, + }, + "description": "List of tagged VLANs associated with the interface (optional)", + }, + }, + } + return { + "type": "str", + "ip_addresses": [ + {"ip_address": "str", "prefix_length": "int"}, + {"ip_address": "str", "prefix_length": "int"}, + ], + "mac_address": "str", + "mtu": "str", + "description": "str", + "link_status": "bool", + "802.1Q_mode": "str", + "lag": "str", + "untagged_vlan": "dict", + "tagged_vlans": [{"name": "str", "id": "str"}, {"name": "str", "id": "str"}], + "vrf": {"name": "str", "rd": "str"}, + } + + +NETWORK_DEVICES_SCHEMA = { + "title": "Sync Device Data From Network", + "description": "Schema for SSoT Sync Device Data From Network", + "type": "object", + "required": ["serial", "hostname", "device_type", "mgmt_interface", "mask_length"], + "properties": { + "serial": { + "type": "string", + "description": "Serial number of the network device", + "minItems": 1, + }, + "hostname": {"type": "string"}, + "device_type": {"type": "string"}, + "mgmt_interface": {"type": "string"}, + "mask_length": {"type": "integer"}, + }, +} + +NETWORK_DATA_SCHEMA = { + "title": "Sync Network Data From Network", + "description": "Schema for SSoT Sync Network Data From Network", + "type": "object", + "required": ["serial", "interfaces"], + "properties": { + "serial": { + "type": "string", + "description": "Serial number of the network device", + "minItems": 1, + }, + "interfaces": { + "type": "object", + "items": { + "type": "object", + "required": [ + "type", + "ip_addresses", + "mac_address", + "mtu", + "description" "link_status", + "802.1Q_mode", + ], + "properties": { + "type": {"type": "string", "description": "Type of the network interface"}, + "mac_address": {"type": "string", "description": "MAC address of the interface"}, + "mtu": {"type": "string", "description": "MTU of the interface"}, + "description": {"type": "string", "description": "Description of the interface"}, + "link_status": {"type": "boolean", "description": "Link status of the interface (up or down)"}, + "ip_addresses": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": ["ip_address", "prefix_length"], + "properties": { + "ip_address": {"type": "string", "description": "IP address of the interface"}, + "prefix_length": {"type": "integer", "description": "Prefix length of the IP address"}, + }, + }, + "description": "List of IP addresses associated with the interface", + }, + "802.1Q_mode": { + "type": "string", + "description": "802.1Q mode of the interface (access, trunk, etc.)", + }, + "lag": { + "type": "string", + "description": "LAG (Link Aggregation Group) the interface belongs to (optional)", + }, + "tagged_vlans": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "id"], + "properties": { + "name": {"type": "string", "description": "Name of the tagged VLAN"}, + "id": {"type": "string", "description": "ID of the tagged VLAN"}, + }, + }, + }, + "untagged_vlan": {"type": "object", "description": "Untagged VLAN information (optional)"}, + "vrf": {"type": "object", "properties": {"name": {"type": "string"}, "rd": {"type": "string"}}}, + }, + }, + }, + }, +} diff --git a/nautobot_device_onboarding/nornir_plays/transform.py b/nautobot_device_onboarding/nornir_plays/transform.py new file mode 100755 index 00000000..ad1d9ef1 --- /dev/null +++ b/nautobot_device_onboarding/nornir_plays/transform.py @@ -0,0 +1,39 @@ +"""Adds command mapper, platform parsing info.""" + +import os + +import yaml +from nautobot.extras.models import GitRepository + +DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), "command_mappers")) + + +def add_platform_parsing_info(): + """Merges platform command mapper from repo or defaults.""" + if ( + GitRepository.objects.filter( + provided_contents=["nautobot_device_onboarding.onboarding_command_mappers"] + ).count() + == 1 + ): + repository_record = GitRepository.objects.filter( + provided_contents=["nautobot_device_onboarding.onboarding_command_mappers"] + ).first() + repo_data_dir = os.path.join(repository_record.filesystem_path, "onboarding_command_mappers") + command_mappers_repo_path = load_command_mappers_from_dir(repo_data_dir) + else: + command_mappers_repo_path = {} + command_mapper_defaults = load_command_mappers_from_dir(DATA_DIR) + merged_command_mappers = {**command_mapper_defaults, **command_mappers_repo_path} + return merged_command_mappers + + +def load_command_mappers_from_dir(command_mappers_path): + """Helper to load all yaml files in directory and return merged dictionary.""" + command_mappers_result = {} + for filename in os.listdir(command_mappers_path): + with open(os.path.join(command_mappers_path, filename), encoding="utf-8") as fd: + network_driver = filename.split(".")[0] + command_mappers_data = yaml.safe_load(fd) + command_mappers_result[network_driver] = command_mappers_data + return command_mappers_result From 40baccb675e5d4d75d9786b24a30a2f4e9807dff Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Sat, 8 Jun 2024 22:29:58 -0500 Subject: [PATCH 05/81] fix vlans across all platforms and more unittest --- README.md | 2 +- changes/181.added | 5 + changes/181.changed | 1 + development/towncrier_template.j2 | 2 +- docs/admin/release_notes/version_4.0.md | 14 - .../images/device-onboarding-4.0-Overview.png | Bin 0 -> 117159 bytes .../device-onboarding-4.0-Sync Device Job.png | Bin 0 -> 231857 bytes ...e-onboarding-4.0-Sync Network Data Job.png | Bin 0 -> 321418 bytes docs/images/do_job_inputs.png | Bin 80113 -> 0 bytes docs/images/sync_devices_inputs.png | Bin 0 -> 81547 bytes docs/images/sync_network_data_inputs.png | Bin 0 -> 86695 bytes docs/user/app_detailed_design.md | 7 +- docs/user/app_getting_started.md | 2 +- docs/user/app_overview.md | 68 +- docs/user/app_use_cases.md | 18 +- docs/user/app_yaml_overrides.md | 1 + mkdocs.yml | 1 + .../command_mappers/arista_eos.yml | 12 +- .../command_mappers/cisco_ios.yml | 9 +- .../command_mappers/cisco_nxos.yml | 11 +- .../command_mappers/cisco_xe.yml | 9 +- nautobot_device_onboarding/jinja_filters.py | 42 +- nautobot_device_onboarding/jobs.py | 3 +- .../expected_result_1.json | 2 +- .../expected_result_1.json | 16 +- .../expected_result_1.json | 2 +- .../cisco_ios/command_getter_result_2.json | 914 ++ .../sync_devices/expected_result_2.json | 7 + .../expected_result_2.json | 1 + .../expected_result_1.json | 22 +- .../expected_result_2.json | 200 + .../expected_result_1.json | 66 +- .../expected_result_2.json | 256 + .../expected_result_1.json | 22 +- .../expected_result_2.json | 213 + .../expected_result_1.json | 184 +- .../cisco_xe/command_getter_result_2.json | 7559 +++++++++++++++++ .../sync_devices/expected_result_2.json | 7 + .../expected_result_2.json | 1655 ++++ .../expected_result_1.json | 14 +- .../expected_result_2.json | 1655 ++++ .../expected_result_1.json | 30 +- .../expected_result_2.json | 2181 +++++ .../expected_result_1.json | 14 +- .../expected_result_2.json | 1765 ++++ .../tests/test_formatter.py | 21 +- .../tests/test_jinja_filters.py | 18 +- pyproject.toml | 2 +- 48 files changed, 16661 insertions(+), 372 deletions(-) create mode 100755 changes/181.added create mode 100755 changes/181.changed create mode 100755 docs/images/device-onboarding-4.0-Overview.png create mode 100755 docs/images/device-onboarding-4.0-Sync Device Job.png create mode 100755 docs/images/device-onboarding-4.0-Sync Network Data Job.png delete mode 100644 docs/images/do_job_inputs.png create mode 100755 docs/images/sync_devices_inputs.png create mode 100755 docs/images/sync_network_data_inputs.png create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json diff --git a/README.md b/README.md index cc2b1beb..541b03c7 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo Device Onboarding is a Job that allows you to provide a few required pieces of information and onboard the device. -![job input](https://raw.githubusercontent.com/nautobot/nautobot-app-device-onboarding/develop/docs/images/do_job_inputs.png) +![job input](https://raw.githubusercontent.com/nautobot/nautobot-app-device-onboarding/develop/docs/images/sync_devices_inputs.png) ## Try it out! diff --git a/changes/181.added b/changes/181.added new file mode 100755 index 00000000..677ed211 --- /dev/null +++ b/changes/181.added @@ -0,0 +1,5 @@ +Sync Devices from Network job was added which utilizes the SSoT framework to onboard devices. +Sync Data from Network job was added which utilizes the SSoT framework to onboard devices. +Git Datasource object to be able to use a Git Repo to overload new SSoT job YAML file definitions. +Create a Nornir inventory `EmptyInventory` to support ondemand inventory population for `Sync Devices` job. +Add `nautobot-app-nornir` dependency to reuse `NautobotORMInventory` to support inventory creation for `Sync Data` job. diff --git a/changes/181.changed b/changes/181.changed new file mode 100755 index 00000000..0c57e433 --- /dev/null +++ b/changes/181.changed @@ -0,0 +1 @@ +The `OnboardingTask` job is changed to `hidden` by default. diff --git a/development/towncrier_template.j2 b/development/towncrier_template.j2 index d2ec61bd..76ea3af7 100644 --- a/development/towncrier_template.j2 +++ b/development/towncrier_template.j2 @@ -1,6 +1,6 @@ {% if render_title %} -## v{{ versiondata.version }} ({{ versiondata.date }}) +## [v{{ versiondata.version }} ({{ versiondata.date }})](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v{{ versiondata.version}}) {% endif %} {% for section, _ in sections.items() %} diff --git a/docs/admin/release_notes/version_4.0.md b/docs/admin/release_notes/version_4.0.md index 42cc0ca3..f8610e60 100755 --- a/docs/admin/release_notes/version_4.0.md +++ b/docs/admin/release_notes/version_4.0.md @@ -2,17 +2,3 @@ !!! warning Nautobot Device Onboarding v4.0.0 completely revamps the applications design and framework. The original `OnboardingTask` job is still packaged with the app to provide a backwards compatible way for users that have used its extensions framework in the past to solve complex problems. However, that job is now hidden by default to avoid confusion with the two new SSoT based onboarding jobs that v4.0.0 exposes. - -## v4.0.0 TBD - -### Added - -- [#TBD](TBD) - Sync Devices from Network job was added which utilizes the SSoT framework to onboard devices. -- [#TBD](TBD) - Sync Data from Network job was added which utilizes the SSoT framework to onboard devices. -- [#TBD](TBD) - Git Datasource object to be able to use a Git Repo to overload new SSoT job YAML file definitions. -- [#TBD](TBD) - Create a Nornir inventory `EmptyInventory` to support ondemand inventory population for `Sync Devices` job. -- [#TBD](TBD) - Add `nautobot-app-nornir` dependency to reuse `NautobotORMInventory` to support inventory creation for `Sync Data` job. - -### Changed - -- [#TBD](tbd) - The `OnboardingTask` job is changed to `hidden` by default. diff --git a/docs/images/device-onboarding-4.0-Overview.png b/docs/images/device-onboarding-4.0-Overview.png new file mode 100755 index 0000000000000000000000000000000000000000..228045025d04e8917a813ee0f11644cec865b8e3 GIT binary patch literal 117159 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 XxWMzopx~k7D)^(Lt*@1%Vd?XK1gFZl literal 0 HcmV?d00001 diff --git a/docs/images/device-onboarding-4.0-Sync Device Job.png b/docs/images/device-onboarding-4.0-Sync Device Job.png new file mode 100755 index 0000000000000000000000000000000000000000..1048aa9342b5eb82729406a400454bd1edb0bfd5 GIT binary patch literal 231857 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 z

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 z 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%0D^9xr)F|~=U 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 a!3p6?@1Nd!-{dy||LA(#bhC7J2mc=wJP>aH literal 0 HcmV?d00001 diff --git a/docs/images/device-onboarding-4.0-Sync Network Data Job.png b/docs/images/device-onboarding-4.0-Sync Network Data Job.png new file mode 100755 index 0000000000000000000000000000000000000000..e7ed9cc3152e743e1eb3965eaad968c6cd19ec1e GIT binary patch literal 321418 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⁡uP<sARM;xxUY@bT+SkhsrYzir8ej@7nZv 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

~9Gd5` zr&I~l6#Bgo9%1#quLAp=KOEWhW{S6Agbba6qLX@d02k$l$0Px^oD!2)*S8U~cox<_WWHH|~fk#NIEzGRN`#cko;% zaQw~yKq`BPi$N%87csnZXIR(5!J|(mH6wCx*(C7b{ummHNB_WDlDu(Sz-Urj2yqJ* zz)r(Y5xb1>@Daei#)zL3XtTU6VB@Q}w7*(VGJK8<-?sGE)i}_L|M#VBogQ57NSS`b z=R{)P3oWS|GR?CtAjlg+N%?Q)r^DSWm8fh*U0bMCqjN0acW z0+sqH=%_@CS}F>Kp_tb3*6~k!pHQ3&=*T7N)5XYS!4xbj65zlp>l4pGe}n2> zABFHG=>PVJvm^F5Xnv_ia$5`bq~)#BX>DkJn20~Hk4e&nj{KVncPDt7%96&DWnurs zh8`I$HrmX9K6O9-ww+w09|Q-v19O3H$Rg6QG9GLbkpGV!7qz#({2jG0gqd~%*N1H4 z1ESV!iB`Ofcz0Njcn-P!P}1BL;W{^7M@`WW>r1W?2;>xj{yr3(ASW! zD!PY%KSiDge;socg;!JWqyul`3?xtHW_$v!X^wn3)GH*6M>O*79pRzb+$WFdvna+0 z?*6;~n4&z0@KnT<8yG{qjFPwFHO+9|nlYAC#Lka>#1~L}1B&x9Vs|NZp)y*!(zYm* zT}PZU-|kKkAv|0;upNgxX7X!~B(s3UX+^euw($NruTdNl7?e75!hBO2KHIuqGTat5 zU*5iTGm>K8s_(tMy!6n}yoa4NfUL-+?NuFsUnxRJEA{5nK{O48Su%0jnEY}7KN$tQ z#PLiVhixOH28TtBa9$pqH!It?So2*zD~G+*vFr_;o|m^x2~Q?ukA=5FS3M7`Zz#XID*EwOVT>SEo@pU9Z&% zR4E~V4d1b=xGlC#NRR*|Q_Cuwd0QVzHj&wQK!&r1zvWb>lS{ zij~t*ssUn|t9DVoG)r%6^CrL?ufUfFCEjj+t|Ozl6S*(02zRzzcdr;P>SKEWM!J_6 zodL?wSKME)eqhmb7tpTzP$uOQ)?i~c8LU6`QV$|6*%zP#esOl4|JuK>CZNgI`20Y1 zI>lyP$%zPS?=LYa=y3t4qP`xW3IgNcOLK-wXC8JQV)L!Ac8R{Y=VnIRlk_VSb_KCg zqZ8$R_4{2XzxoVALzI7F_>&kc3<>iXnGcCjy853ENFf;hv9F;nqkiq5H9~`l_zi^2 zj8l?Sv{$UW*;Fw!Pp-p|`wIlx>&o?^(Iv{}N(S@zsJF;t4|vVCmC<4Oc5?Mk{4Zu) za5}hPuYzh=SrsIbf(ov#M61@_qHcp?NVIm_RjuA={U}# z(0p$Ww$Crd%4^r&eX>!7emctcIY+HG730s{aXRXPco1^AUsU0HvBn2~qxoU9Pj2$x z$>?XqNnDg>U}g|Fy$|TnVCl1Q= zSABh{((?D6owi@Xsj;K*KEaQ2!@ui&?Cz*I>PBv!=vR!dNlo{Ojw9*wc`e)y<^Pjk`!B4@rCxtKgQ-=pbAzahB}HTxASRcz

KpF?tk5K5IoIa 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 JO%=1_{|EK_{gD6w literal 0 HcmV?d00001 diff --git a/docs/images/do_job_inputs.png b/docs/images/do_job_inputs.png deleted file mode 100644 index f62c262b89646190095f710eb9605411b1e53fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80113 zcmeFZXH=6}7d8w?6vF_bU_6Cmi!2^bR z+vmGU_9okZAa~ooJeZy*lT%roh#{M!Mx`aE#Ul(cbA8l*gl0nI6g?Im7z`|Y4qhKM zn)jpp(8zSQ;mXj&yn(|)rq|awJYh(ZfO9FVj`(stnRQShVw~^PdA4B@Gd}O|+VT9H z&|S(DX;!G_zW>hrZFP?4E};!ZhP|g`PPg@Y)ZcFNad>Rtatc$!^fV8W%seP{>k=(Q z5P#)5eDq+Qx!gB=X5?AqMRlt$^3PPEA&|%3w2!sa&>-UmpQ*^mL+r>X!6$O?0|P%`O=6yrodCa2gCE6A zihn+Zv}PXr=jUUlq=IsK3Mwk#x1Ob|wY9UGt&97cysr|VDvX`Jk-L$Gy11o_6W?7c zmwVQH-cAoluaHT4i-V6&*6w%Nyqz4K-Ne16F8x_T9DF8y&3}pQ&m!&)QkRT0wAmC~ zT&>we_^$I^za$N1V`GzawYo2^s|f$c>)3~u zUl-sP5a0zRc-?%Q-S2wyI=iv|Rmnf=QM7imbhUfnZs+36MymJjJr@smsY{ng4gKri zU;VW9w)=NW&Tju078oEu=?VW0zU%z|svEp2N%~e?+s@nC@wTF!6PO;*hV)I5>ym$# z|LMuUTl|kVjsE@S4Ixp%|9tg79{u>Lft$6ff{PPq(_Q-COY@JH|MTHLUXkyE6Rb0z}7%aTaEX=t^{>O>`skqDdSU&c0)QCObGYl;ZR}8|MY-qiy4@A-sMs zK2_3ftsZ5$>yAJmj_Ume3mnq1a zji-8HNcgX2{MKdJQRt+2HD}|rUNAB*T;84;b9(|7P+tFG21-o?(YaTxa#) z2%1EwsHoUy95$L@uqOcvC-!I^_s5Tp;O;4&Fs`e{1$DyBb(z1;;uyNnWp+Mk*;Qa`nz4?T0P)WwnU5uHR zaKn0Y!(OMw;XU_NeJ`=y3AgTG2(|8HpBI+5W+H~rr9Mxso*_MH>N6jAe|veTC~e6v zH}L4Ns5jYXqxD302x~xM^-6?b&vhop*K%V5(m(AO+3qu;G{J#*wDSFxkvE?pwXfVK zhmdP^i@HO*(}96*{VG?Jz)WJp)5hW;M8gQ#KN%ci)luU(Sg14aFjG_J zHRWT&baBdiHnMZlP{Z!d+C<$#r0CQwTu-qIgT1CDt6==Mj=ml%2BUrWOqSEfUzKiqDl9`x5llWaGFOaMDFU)oYs~tv1keKoWsX( zsM%}xVpWx(6CM~d&r0Whvf7sQBE5pK5K|a=*LzBfXFfk~mdx*z+)`A06&3+|A20gM zy<7m3%SqJ=2Hxg>@U0DkMu=bF-}pWooua2H_VE-|v?%unVW_c%Tet86=svI4F00?l zjT{C^9>Y>jFB74^+iTi_kb47JPwE>Mk{yz@!%pVO=|~TazO_kNZ#j~#EHd+)M(!q2 z^EY1iL~7jrHt98O?XJ`&edisS-+}L!sk0`IFLgp7aqN9r3Mck;6*AihWpl{hoHm zI+0-BPb}6y%dQ+HBtyjOeezUQ$;O{6Nb@xQBz~4{h7uoa0R8D?V#t>@m)lsanVxEv z?V3M~(p1Wv$<@s?^;@mFa7jyQJ64Q<&FQYkp;F$UuJBSpT6@J7FTU-S-XF|$9!_rl z4JOon(SM`0b#_RNzU5$3ErowS-EZyWunymex_orm**;D%&p@i$LZB zXZqIaac2kT#&7U5P($v(qnXynPAm_aWCe}aT8;vkZX%c%DCH?s({g0~roZX3PYVj<5*{{sfAB3jP$=+de>zgv1Z;&XBSjKx zwd}R2PoHu;`1bMK35mx2wT6^&=LX*MWL`|RLPP_EnKi8xUb}|VN!)SddQJ#8!_Q(x z7WDOWyTfH~>5zavxf4lW-iO%avL=c+8E4+qmT2 z;DNh8!O!MerT1zWXVgsGG4Ye(Gp=lB(c0fx)oAcsU1>5Hwk%%R9~2$jV-j^vZE5dW z2itUExujgAp3jZZti)Hg;NlEeYAa)pNwpm1XpttrT}_j8+nG)VR8aGA+Cu2e07Z~ky?V0UZo^Q%>_k%PT0joD9; ztL5(U(?#{e9+S9fj?M&r(e7knLEp?G%WF7cR-0t2I)6N}?A+Vs1|{Ncm!|E~hJ!8M z3T?l7PwO(A$#9Be#q*}NEvIP0kLr`5L^j~%q$C5woxY>c=nH~ZoJt(U-Wz-)?oQY2 zrL;w}W>lx`XTDqj>P(oVCG5s3i%e2)429ohYFT7}>ZIRYHBs7o%;-o1sb#3tRXsj`p~vu$fN4n{(2|)ve(mcr*Sj3w0G+9O+e)o% zxbl`MMdjfVmq?g!$H-dkY}8x+s|NNjQe2uxk5>{sClBt1FyD7$7j+!zAtbqJcS<6M6`YF&$m_4(eBFgWwWYp&I0Lsc zz;9gAXPAi9IXWZ?QaqJ8I(R#387(CsqQ`O|wL2kbS=S;!b5s<7Q&)gMH{Fa>?C^AvQ9+fsHdlRK)N z3^c(GlL~ZFvGkPD0STPeVXj@cFQl{Hru+g1C1aqy1ythe-FwZ%f!*A(VIqv%-ejFq zJ1oI}YMs(tiTW-kMkU$mk9r=k7hf54bv`z)w=Got}Ai`fx{dpxi((vh3vU`uobK{y!RhnV}F@y0mL;tqrop(;xnLN==L|@`<$7 zd%c!u8TFjTw6KC=Fj|^WNF#rry3m0kd%0c)qQsD^-^U3fLo~oRu*=JCg|*wTj|Bwu zW(QAsB64?9)P~G-yy^Sb@cS*q9YLt>C&r{&WPQ<2+00?k36?~9GOyJq)dRQgK)kfX z=3`6A(Lh!wj$`7l-M*(>!PB?%t&O!IUoanvO?~jk$%QGu^=>1C8MRP_uG|}2ol~mh zS=#8TtdP^t*B>Eqm1z|I7*n@M8fl)RCJVeaoGxIZ&UN7EU{NNZYNip6Y9Kfl%cjBW zia9kxOxE%rwh9el_Vj$|AZryvdS+%?(0rV4m#0>dv(j{dy`T!3cosR6vx*NkCQ`6X zXX}iqW}W7RRxE#cWsyD20W&Cd3j`+4$K&s+nyLpHDDm$!omIl&Ik=!(reqUUWg)k( zrh8{Ie@-iLiu6aQvOyHKWBMGGh{Ik_St_t!)KJ;<1mAYIPTrc4eRdP1S%YuU(&7HP z3&V9<#-oN2GaT$>`H67!iPPv+k5obcMuPGy#mpGIt#IFnt`bkit%4TwBBJ%36l)@J z`(PtFmp^vg%|1+HYulaj<9F~Hq%%XP(!{Pds5TRJpY%jeyL2~LoVA*y=lRjx=e!i8 zN)sHSdyW$cujC{vx)bF}xWWrP&Qr6l%!-V4Kf^SqetJ-4VrHF@aYh`RxQ=W(rsF8+gsU3%byH84{DD)T*9m-EL@(+#ZS;%BmLNhMdI)g#`N%s^q1W zc4Gr>oT6E&6DeMn_SoMlc)05{;j>c{nS!xB)Yj>{Zld$TlrF#(^2&@!^h%36<{S4ES3G@fGxsyE&Ck8k>bYgYfa#G~Z?qg3 z`B3K7$vD!yJ!~@Bma2!uEZx2(6j1eH3t{?DX+N!{6uE`u>=n2mK{IWv6 z5^MVkVx4h*64Tj!9wE%0uf@t|!Rc74d-fxv)IpeEXr@TqGlg9*)4GGrPABu#K3}O1 z;XJN7%U6g`n_H^V0)}4YMqCsVun}g?3HW>(fe$AqHsoGwxftpo_<6Ht%9qEWJ54JI z+aRQm?~~_hkXIrPkV>Uu^kV*GhRJd=diH}CDCN zhAA?6tTya^Y&n9w0DJ85(m+AM_DqsZ`sa53($#FAMziJ(tVcdsuIukSO^?Giy?F`? zPcQ}Sfx$4PoHNBJR&s6>B|Ka(0eX|+0U{%I^Mi{XdxOW+HV=6VXJTQ(C&I41$7BJ@ zVhxhF_BQ1ii)O7yUB2)0%;0zE5D%DBN-kC$?RVT=t1jDJ0%7J6r_;P(i>8LvOt^Mp zzmD{(n&s|y1GJJGizPXHuu9}LIz}lx zT6{7Eg~iZ9XRb1LuUGT*>eCJ2o3eM$)@E~xT>SfY;A!p)Oo{4wuVs?D1WCd z#97W3sY}IqbAe*UUTw=aC^tB&c=nvn{412~IPN?{>`T)#auo*Pn#vXrilnhD&()r1`*9hA1GOBRotm-zLWy55;_U9}Mq6!NI@4Gaqn!6S z9E8q@lP#Ol5)EFyy0*U=xgUXkQk){h z7y>WESx2L1bSDm7dFdj*54KB3>PGOubWo||=H*T^Tx7=?TY%)#}6S)Gcu@ z^a<**TkQ83)x*w0j6|mWx3Ks2#bTey2l+?JmU3~x&g-@uye!EY6cG0!7|5EUZIM## z8{rfyT*aS1`Kwd&iNR~mE)R^ z*ha!uqgjj;!<(r)Oyn`40Xi>Bu;6b>e~V>w<&jhtu23opuFj3#(b1_qQjR5DXup&mt2DblpO%O(&`% z39P%g-zUejESQycKmG(^+CL`w@SBe~ZF4go?^}1oavds5l#@lUa`qN(j0g8|-i}1| zFv<>NyR_f&S4Lm%jLrUC=&M;>wHxDnJ`F^b$mV3q1pV*{QZQSMcFogx&XaW~GlQ1B zeiFzyvze95Rb;EpgITEgdFXv^r(hoF8eFY{0*k?o!w<2BsTR(*@?uOuXoQB|08f z@0p;=7F+SNm}ku?+nJn8)XbBfhx!<+2_$_zeA}%2g#T#AaVEz*%H=jCdQ%>-s&e9o zxITVEeN1mBt9Sx*bJ6!yap2<9=J2nCKU{zG^}`I<+>FdQE*1r!QPP2$)RS3747<$j!I(ATfERq z1o9c|PF8B;LoVHkYI{Nasdr`NYj#3MHG~|~cGMGiv^{0z(Ip84CgT}}?wPBa_>z%# z#(2z0XfRLUL*UTrc_zpM1+WuaBwIu@ExYFkOFsEBXEvlv9G2Or^9tKd#}X3i{Z`zVaI}jw!jCShLfI zo`l`(W{0;@WHfpGB)l``+q!;>nP@p~>GRbLch;Y^01t$lmkNc>>qsb(9LhR)-5(Wo zZBSr7Epj1!X!EiX``fn==eLoc)cOM|H94=N-&nTUR*m##)!Vy)V<3DI&eP#~(fVY^ z$H;p3G`*R|{Nt^{VFH7q3954JdI~{rYtKEYw~R`GKQ2-Y$)V3gKdRHsuEn2No((+Q z%BZ};=)E#jf*7mFWtGQRqI70d#z<2)SkSj!veoe5%O4Svoms02o$fSGC=OJDXCAgZ zd9eRnt@X>WP0E$gmg-$rZ0*hgn>Ti3vyO!U8@(`Us4bDqXZ!8z#~o&R*gSEmAmjMD z1g51z)1x%&gonLWi}cCK&e21&ncW<-2G7GbXh!eO#*L+(>}mEfK0Gc>+b<63pM|XW z?FY0wDEZ0@#3@tugl%~NMw#~6g*X@EqxTsOxtR)up)XTWyc!C7DB^Zj=GzwO>AfUD zoBNJ2LXYxj6l5OLRb7}=v2CzT8#@$R8*?T99ipWmw;ATHXPk=dToKxwhP2A;ue^uq?t=P&b=#e5kfa#-iR-n2`?nsLeHm3Exl;p0hb^V-j; zla+DLSY9jQ^miAvxzn&}BC~|^9q(BX2|vYx0JLH*_h7zb=$7$0e3a(Xxp)q8y|L&% zD(T2)ylS5ry9%*04{a|`0fgs_msBhZ8wRTs8LAGutTyrTQt5f$yG67EkxwF-=FNv4 z_+wcVmbm5RHp2OvN3iCb7ScwH}IXC`Vnqy}2ib&PW}1T7f;~)x>Pp!TurDcAuAu^t2Yh<~na$9Z9S|rju@mkzty0 zAJuK<;1Kkx-EO;+UMT=t5X_l0rIv5|TK(MbMs9%JOP;H>W9@ApR^JvEtoe0Lmj~>{ z=5k8WKz>~GF+Q;9joEKvhuM<@_khDK44exMrS*>Lgv+mEd!rQWRKCI!o{dH3_i3kT zr(`+ZKFhxWf(|JF(!QA!O!1KKdzphAc|BGk5uKylmT%T>d%cYUf^z2#{Qf1xPB`wg z(w@JC?^0gnJQQ#3cfrnh{#^*4S^as)6=Do;@9UC+JNEck%Z zi@;y(nD<{UDp=^sS+B|SY4VzBJ;55mSG^P~&tKJ5X!M+#!JjtrkEk^PcW0tS!xOkx zZ{iL1G4+*2ZE?ow`y;RKUKr=zKyH4%%G7jIh@qAj=k=gEq{R4KeZu^iWrfOtEcz|9 z_z+PHpB}2+v#TxhYM9!oQ{bnASSeG}gXI?I3{!`LX&SPt+67{eqqNucs&Pb*|JHAj zq4>w@=<2;x^%($fP#H=BNUT5JYi&Yo^{w<17IiEA4$Ic&{k0UG{WygA4d0jdg+hHm z(S>cbFx&T8Xe@w;kFtjZq;YbO%oDLk%x+ybihPCVrKJuw-s>SZZQv2-zXYla9d!xz zQsTDPr)6pzxz7cFQ9buOhkR5Rc_8^E3nzy$j}dU5sEyE<^1U^yYqo^AmgP4OwuGR# z*2C7t`Obu^qsS=_c?_21-WR6jUU?2H$yMcxd^O#u%M%wLPY4%S5Qdqz#Q$V(X^%sS zg{fGe-bSR06$KKcO#F zCQxEw7J}c96T__o<0L{AO3U4jOVEC?QB;t=SwguebNGFB&|?wRQo9PmVrl4SaDE)W zajbNnBnMu50pLJ2{Lx**Yrv6Ddova&=Acoh1p+o+XFBYVq{s%qS}x6=|9Y0B_(^y$ zEy|E(cbV^f2wm?UbD_@Idh@|H@7@xi^QT1 z(h;qJO?Rc?VoMQvw_dFxPGgo+&*w^Pumbq^g_glv^}WTV1zRwJmj;S#mxQ{=+tn0T ztglf2xRH|Cw9Di+fE{|1y)aLwh`(_|-jFF0Z*b}sJN=}^MEmr(r&6{7IL>#;eBn)Is zED!42=~ob8a{Kj5`6;@Xw1z`@a%JJ-%1c?2(`fYaWP?{POjh0FdS^uc(>JTHzlKHxEKdvf${hKBa^>wS zmnC7tl$bZCew@>>D_~9^KvrUVMU8u;c1?5G?g~Aqx%Uy;AjwcU(7v(E3B=$Yd`71= zj{MkhN@b}4!cu{VnXJ2e`n6cKgcz>to-0OfN5tI%;$*=7>H@I91q)JL!$u#rF?XYt zS((*)GlzwsjanJf7if5F8v(dsbxj5Yv?4Y=mBRyquDfIVBDRXjzQ>z5Unol_T=dnB zG2Yu(pKeCxgl`^}KJw#yx8KelJ#r_5;(LJ3>!Zp6%}y%yWn;XB;_X*!dbbI!Mn~QZ zD;TNVm#YC|G|V-+mZ@$%V(`{YZS)?~%?EdE4XUo`$$${bLd451>a*9btK!bUngUne zwB<`-(Q3bg9<4+iItcA#$~_k7|7JT_8N6P9CEGfjxB8Y};y{%H#+EUMfjjF&B4KKn zpF2NAdt7T>52w^;^*GpB+M~8lX zPS~*vlHLyr#XEnDw-?4y3=!_BKj*Qj2zE!GV=xaSZi~z`0l185-p^o7Z+@H>qAnCH z{yBV(d-gX`hv6<;$|a5j)0p8#iZ9A6KDkJ=d2hPZDwPYwFvllz5)NIcwnhJev|2vd z`0W!DJkXj;H3KY#S1#lP(ev|TPdXIq?n0-Ie_i%4< z{4j8P2ytN&k&aAon9kEYiM097wEX*XxH6{F;x6`XMo$uoHBW`G^0rsN{I}&Og*I4+ zOv`HZ_}I+rP33(hOq+AV>U|5&x*W=%E+1TQ=sc^PeX|dFG)Lr zm=aB;{h(L%%f`CkX>mR?b{Lnb&Y}I=OX1CDW?2ls@1q}wAE$wR57*s-1(i);^a?aJ zc-;h{&y-mcfoD*BLJ6Jel>?9Lk~_i7pgtZm*Zk1Qp_l-D!tvWk&c zg*j(@sIpgFI&uWVpBKX*lZ19t3?M zqnV7?NSb7|cVhdG*V=XywGTgit$i7DfwA+oEdS?0TZ{P*L+w+hO09fNed^>!PE6eB zScc-984Hwd{A#S0xUu}RfHZ9j`Td=m&%zm68y!`7?q@r0m%c3OU_AU1!aAle1V|!o z2CkZM$4r7O)94c5?9S|w2bem&Q<8RQwL7!s>2;la4RelHGAwm0!9E6t==h`Ce0q=? zRwQ1B$*9vKS|5*0-g@^|U)v(Cdg0?a3n5r*I_~CB?D9&@bU@L?p)8zqePlz4adm507GKU18-8(L2zxn2@<#cSP5oS79<<-ibUZzDQBV#a9Ljc4t-LEj9(L}QZ@ApKgVCqg~-=Pxu36<;r#e(nz%;=($s6xV<2EDdzJtM!!gRusm5_s zAm>im4%4o-pmR%IJPy{^8R{X0Z8}{~ih3O?|6VHWn`0-N_hV4UYeRt3|;9>Ad~Uop!Y!-x&l zMK&0c_&g*CRG+wU6Y{kT6#;xK=%ohmq*Sz?%E z7TpKV-MovG8ue^jv?vI#lqU(<>Bbw6A^;!7Zvi+4-R4D54Dbz)ga8B4)i)5v3tEwSz@qb-hfhh4>#A4 zosUE;j0Z0N4b^s@9*icT;EjK^(`0>>7^qDHU_@J^*UHusZ&-F6qmz75U1}t)|3vGJ z(O~ZEcfg(OcB+{)M6uOMq?1^Qrhsa=W|^nS3fPH_k7pQ%vciOTv@)Rc>BWG^wKUz* z0ywj3KD44vJr*NQz^+P$b;&Gte>APGp_0&F-u8&s#0L$<~xm7=jY~Lb}|{# zv1g3*B)(@oyu&boZd|Um8~Akb;RpJB>&|#jro3miBd@c7>GCE?(#O?4r3zy%QKqpg zw>=c!Z)9ubG?1^+ZR}8Hjo=x2N78i+R{CsQC>l(BzN%Cvk^4@;o!c>FvHeQ6m-mw$ zPuaJ3$rw%}(J`~*9=Jo+y@@)v$bObe`yp-vgrN9Y<`Dnmv=K*DV+@)i~a)GIO!D)YcqVZw@I0D^KA|rQ>`8gkWsPsJ7l~hl?iQaK}r6KY# zlwp#WzEqWz){rEi{cfWqIOmX3ZhBwshMD_ zT{TW{{Khgtx5b@#IY2wZda3l)1W(0qyLHtWFSCzTuR5>!zBWK=*&T`VGJ=ufvfAdmNbUc|sA+ zY}$grXMhg)+RQ`TN%~PQ0W}q7kf{#*aE%aJ=49v^v;gqv7W&orH6TuL=3k$j(Y*fl zez)rA_S)n)@Jaw*Bx>(qtGAoPV%jPXBzBUx(Z8`sjyMAF0KPO8mua5uZDfPJTN zi*qkxM@fVmzJ?Wn@hJ7wXbL=uqB-EmaI#mk7q(ugtD5 zGsq-1nVYQ4L)GU?!Wk_|^lujgKJcl!YNiJs`T%EsF*mvI7$@c*r;7zAh(JYCot>+=`j=iI-$_$`2X zWq3|<8}VH=GZ7c%hP9TpfDp{Q)4F)}{w#PXsv3AndG}OXnb&|R#-`e`5r=9Zxl&ds z{mAX~61!Jq0qr+sm} z7@8c1m7Q^y8oDR$(b)Y(U_7at1d6jP{+?Lw_GupwV2Q%fNOm~&9ZtnCJn1Un{8o{fX5ZeNB1mr--M&kO-hH_g=>}2G;KDw`^+58jqWL3>oZ5%>O~nkGF?y z0ZL-8xyjg(hUlbKZ%FV|Rt%2d3jmsxLjV(4?Mu4O-IBOxv8YP-N`5*ni}?D-pcFs^ zISqq=hJt-AdzV0=0ASNJ4TmguTId=#Hpc_DRQ7HPz{?IoU-j)+8Lk^T(j=Iqs5ZjQ6$`5w4s`2}MQ*s~gfdo+0Vr|RH?qq^i9LXE zBsz*Jz985QdJ|_9+au4eC|qyW>c#w+!UEdE^@2AXfK@}r#pN(zW?mQ)HEVbsLDZ7~ z7JB8-0b#V~dGHZ8>|wDxt^Fc?Kr32<#**jgFdEoFlllIARax!;Un#kCEV6H?Zm?6B zQ6Di4CJ?t@boc^UvQL*v_%wuzk{`7M_E zRKjJh@~U3VrY{drJ?&I76HgHVV=TJZ8=!N?rMziJ0IKdFwD#oWnSR~7-#vuO2ak9EjuCD&KUND}pn1!sX^{A1**C_m$WS44S`x zrIv_mIWz_If8osu$j+oV1n+)Lb#-Gt!D39r6p2vQJ4(cl%3M_?&ajBsrtzpA%@9`N zl?nhP=rnezhP7%5KG-nGiOTj1%@#*lIkXLZwkaO`9gttLX{@-}irmu5YD0wfMwG_~ z-cv{VVmxMoJ5ZXi2Qw#gf@{SB#O+Pz(#p zk`@vs6VSL?j9Ros3u95rH9clqXpu>e(slT*<|FKGfrA?6)fyMV)y$&f+aZZD{itRf zu9tVYpP!fW=X08j;?o>6<*tP~_E8*LuHc&^D^z(nUxt>nj5(XnT^6kJ1# zc@R%zv*8$3Bx(&9j!3yQI4UH}k1O3_pnR5p;0@<>6gmn0)%;lzk-Iwtj^QcHC&0{D zdHJj(QtG!i^4$emudYR|8POa^vGkdXp zI%C11Uy4JtNyvcC4^Jjbw??AG!y8h+J-Ee~nzZ$hNlb6LgV)VtLS${stJBTQV!0r! zA#lReUMpvEyRUb@TTKY-05T0v;}LxUbe$ zUh5cGIp-x+$G~BnP{v$_5zCPBtG@4~^ZI(Mry`HAyagtzzsJ_S+SL|EF3)-DAh7I0 z%5nJC-bjNJaS7x!IXzwlzEwGM()ut*o%EI%9OEp#t2(H*TOWnU8QijKTa^$mi}LFL z#}3*2xp~|5@tShv`OFilgzZq42etdf4j7aOrkTZ5F?@eYPcxw9`*fspov!lU$0qMV zWJ|q=s$lMEFXR$ou$*%+ojSLqd9xbV&=z?aBk&V$1b_|`QdS?ddC58inqOPA5XX=3 zX=c2pJLN!Ru;3DoO)zZD2IM?go|^U}gpb{}yc9%9xc{cf^*7h9%KDVW!4-3oh3^^e z_S?y|KOmomp6MpqE}KUbxSvPUr`TI<%(Qy80Q^nHk;MX1 z9cMDmuj-MVJrAv1Qu6MwE4veyF|4>f$E_SGNz0h$ro(2+&th<7Y9j8rtwb)S0ph1D zDf^~NI2#ChU+E}Jkx zu{@8;-E!~LxOVaMT|K7ZA?a)D`kqE~M4z|*IAiMY``@J0A8?pR6z62-5%PuDmoqj^ z+L$vM&RS(Vz!x>z^0RSjl<|Q-k5UogZ&TNT;tnGbLZoxO_!wb zeX{INw(1bE*~)bGl}!O$Y;H~84LMXKbl$$pLhMQ9olvOXja9S2Gyy##<2zb3rIx8P z-VunhYz7AKN>vVEXbh4v73pLSEOo}t~`71W9-|eb69hf}COe;GPFaRd9YkJv5b7WT_!Du?Qq-@QDmP zfwPq;2JVz+>bc)`pY~K(XN48*1BE?KRvcWeYMuQkCU~9CyXaAIumZF%B+R_IC_!&I z5nn)nx=(_Xs|8@hR_^^Fd~b|@th^sVvXDeXD~7qQm%RMaqs3qD55j#b&CyajMh$hF zWVpQW0N)s?ossv)&oUnLKR$-=rygzBYs)|F6)*rTKL3u@>_+pPf;g@yra0zPg_0{q@-MRgo;Ng@rN|p;51^c$xw^A>kCC z#VxqU)_}dN)x@B`YIg*^G!=M6tnQ(eSh=&GpIO|=m{Gz!8VD-7KjK2irq58Q|7fyl zaKLLgoG)5@nRDyiF}jh=^5qhgYgea2UA9LPr_{6HO@iKrkcD4W$=7w0jBR=SNj>}C zxXTzDl%>82^pE9_rS-~;--obYOn1Xj){}J0?=RS-eyO*rl*tR%L3^Z^Ff$_tuMLf? z3zFR0nvSHh_4AWB6sOY5QvF!&TlWdH0}33BX2;fyYp5FovHr^mjJ~pk>n9Mg_dn+; zxh|Rp)K5(wqni|5gL#bC*`aW1)xNK@*7>Eh^>nUJO^y>T5>bP;UQ(0;yOcj7!X&}) z42tRR?;nCvDjm7c0HEKzlL0@}`Az5#G{mbi5`KaEX)uLT$L*4tQi=qUO;Hvcfhr8J zjsK# z^dk3aVO~{6+E3PdET?|Q5q*Zz1Z|>L8*nMXc2MaC`t|^#<5r8A@{aGr)el1kEN*$J zISMJmk7 zQRONtL?TC0uLp9$FXB)dU|Ei~O%?XK2qVBHL+^$1lV)KqPgZS`92kp#@0 z!gc2)mVRt9T6nIRX;NHtXt!XeoOg(*lmt~-UU#BewP_63~MS(t%S~TelL7ksj7AZMB4p5br$Mj$l{h< zB{{LH`mNUfmvwT_i^Y@WRxqv!$ueDWV%zv zp}3i79U*zn+qLSIL(}xtZU_9^LsK2rnAF9~NDrq4iSEC~e+b53AF`cLcG>Rg_>QyL zX`{!p8xn9g^R!t4j?gds;sc*k$WMt> z03optlC1;eJ!xn>*T+Y$vjiX1iQmrOF=bh*b-HaXLCMfp5~{1Ss;_8adn{-Zify7K zB`$R@PJ$GUO_8>pzcapCPR8;uhrwBjYwg_4?T(W&JT3T&UdCs=96GG7zHz97r|695 zrCwm_-F?SXoaVo)hNR@ylWocU@qas_Bg-Id{O>0D&+p={fg1^8 zg6vp+*$4q#t$+X)&o8emD6|4sK*ar~zV*vShOUA}2rHw%zD0tAdXT271%Q=;E>n_k zZPAzBy3VWWfmp>hHzOGJG&)&NY3Q+@=!@P$XC_?SeH5};}?*5SKric6J~-j=%SV$XZ*g5sZ?N6 zN^f<~kczljvws~4j=$aL{bp(84SUc=?t?*vAL3U3{4-3S&9b%<{)m+O2_V-Fa2rB- zCanpPgizDW^rlJFWD+!OekpX^=4|X#%@4lFOHed^^)m3_wWn-|di-+~=pPfT-2f2? zo+0JO*V50R^$O{~h|~U!q4!thM|Slrz{@etv{Aoa;zY2-=LSaSjDCz${%c$GgAxS~ zH^_e}CI44dv7C?OejoCb`do5G0O7OqZC%|M`z#XjfA{^fqTZiEgZ~P_v1t!c%+m&g z6y{G8fQ-@_u!}{%$Kx=)j(`N!x_wRYpYrt6I%En!I+!WF(j=A(bJS~`Cs*1)6e$^G zsJ2T2axsbWxd7tRB7mpy(BLN)_zYY*S0gEJ zb#v}BJcE=KpA3SQFk$;x@mdg{O04(5B?G2TN`JrZTR=b?sIXQObQ%-d0{Pb|q?;*9 zL1J|g;eQPKg?{EA!82LR+^@^}iw$@L0}uV(fZdmTM)PJX*pXKah#*WP1hS9P>p(ZU z0d8ddDVo*A7*GnXs3*QC&WYtdcKo+n$ov1}NWM(r5u>lFtIXe)D&d79?gPlU8;j2A zo{g4q9ya%L8UQ)hmo-Mj?Uk4G0aKOM4K$bRxjL3a&kj%IP>a9p{5b5F2N>0@%s=44 zq3xF?u9S{N=>p(cJ+d9E4-l!sgNGKw!6|o1bqe;V@_kSDK`>VHe z?AmwbHb_`kf<^r~OHy9?{r+5)`+yZA(xhTq5YK0pT&i?A-=g767xKh)!eRkcu9tMv z%mV3F3a3v$(To2r}%Car0YJfz8APFXkfU%Gr&Q~G!LBeC% z%9JU&-p9+GuPJQ5>u>y`?k_} zJ;--~3c4+*4*-E201U%Q50s{oI*B$R9u;OAE%NW~{qPB@m8lCZAGryF`VJtfamx7P z{~DS;n{fO2oZl`+wKW+?z z>H% zlw{ujzbgI@d+z}hWx92Z0)iqsBt;A)VNik!C_yreAP5p9OBO^40+MrR93=^ef`~*V z2SHRoGMGRNC^>`VoO8VULApWD%)Phjt6TT`|NlExr;4Ga`|T(0z4lsbqbZF2e=`kUp!5C1z?($>*yo=sdKi_uHfDXbz3GX~ee{BYycsJ*V>AB}MK_EzJ zo(pL(xZ#xOw*iGP0<1K`-R7FgYf~PqcpL6Jc99biPEzzriVtz>i#<0#@Y|YWPz)vb zxSpBA=JLLHGvJ8TB)V1=ZJv=o#I_u!AccIhfO18LAkChahwOg8f0DWJ&wHsKKKaMb zn^Dn<0QourUxT9lHvIQ%Aoes0b?&g4{~QfP3_*`q!QmqvU~qxo_x<oT2I-GS-t=m69)9)(e2cE{=nOc*$J-z6lCfIj zOjHNo!|sdHwg7eGr1^a%xZ@`ZqmI}ilUH)>*#J3&r|X6E-Unee~L;j4($p2ZpM)93K7@Po|h{@q40VLEtD&dmxuJ zUQejKs<(LNo_9XZYGJ!j5zHh9!lzLmE27f>NTgJ5<1v+`{T1%^a{|f99l_`D3!>!Y zG@G(-m>wNIY&A+fKlKTc_9g$(iW?`tePUhhvdj$A$X5cc9AAX7z?Cvkr)1~tgKv_g;O%7s=%&OntpPqmu?*>p8*8@hjoAxlADxjGLy5^d)^Yb zRnHK|F-7}FieLNPp;LOrtviRQ@YKKW5nP`ND>+CsvpQGw<KM1Cvhk!9o zYd7ju1t;|jaVz!XNL26f-5S(?;d7%cNkyK@ZuPQffR(Pke?rZqI^I|7s&Wis=gmoq zPXZ3mNNrXOmD)K+mGAU<(arY`{T}uqmu*^wOj zz~Zi-S02wrG1hbFUZ{s{NHQ3H{?a;VxOk~9ln2rVeA+>0?h5+*Yp{1gDZ!fvSJL;o zl&Yba=9)d+tHDhvB)yL=Sxg{Yj76~>93~nc+Fk^baJHSTknF<~S#hOxN#G0n-lCl3 zm%)uqB}7NNvSNM8+p|AXPiJPVk`rd0a+>o;A-Upn0xDWU4h`a;aUCvU*#8_d0Rj;x zC;O;!8Yizyw7-ODxCjaE{hKHT`kMDN>9;U->pz_kKYricp{?Ki_S0=9NRMuQr4s&q z>EaIb3T4P`qV-k&9sQw!wBxo-#sKRtu^#UGK&}`KS;aJAoWQ^SgCB_LA88}0@cUhj z`?^z*3PvA4Sog30fJ6$O^G77R^FQ!3ejZ}?l3-wk%98&zsZ~6S@}qw3@BhGE+QcM; zU_nB8VMx&kD;l(3B$^> zLik-6eHP|1`?qIWxsO};oqu!3x~Hn&_0IQl!^;lgzTwvZkPa#M_4(D)X>F$uvKj?3(lq+SDLr>c`_FPiKhn$Zm)geY2XH8b}=$s z4H!H^yS2b7PCa*Bw0@~yMsUV`#jz$%ij3e#Q=Y~!_>RwWZo3azEbs&H)bR?z!GssD z_`_kd{qy)Xw%Df@qu8CUomb6m(b~8I=ki>b8|c*7p2mS09y)!DhN`!!pJD-&iX ziN$#ndp5i~b1nwERWPjtOXFvintSb^p3jFR{>!KRh79cwhJU~)5Ki;&C9eNP-(r7s zDG-13As^G}7AOX7(1r>KV#NB_#i~-?YUvtRgb$q1Aa5=D+8xPn<29_|gTtp_ZtB?K zK5|}d65KowYppS5w{}H<@AdO$DhR=arw8JK5|_AOvAqOKh{qQm97}ju*LR5MwSvIl zpVPI<3PgwGMOSTYzDrUQ{pLWBst#*ucIl-9ZY!K82JPerp^4HRDaEfW+L~$H7k(r< zP4}f3{Z{z7&7zn~E+~gH+Q&2>dkzI%LACJewIf8|E0I7-REFFh2+s%-@he19C~mNtvaalQ8u1V-s8={+a+Q6)s6qVD&%JFm0w z9jf$z-TG=4YFpQ#0Cxn^TH2aCo9jR$8*c0!qi^=Eu3rJFQ+=~}fBmm{n<2564Ha&o z@@R;Oe}$Z<0Sp6AniL^ljxR6)=3yyc!Qa~g1Qr=8v_$7Pie{8*3LGqtgdkJUFW^rb zshJs$l~p7PgHS?mBp+pVksx*EjZIZKxenAzRPXx?7PaR2K>!T!*PRC`%4ePiZA0Fs ztNV_8tIL6K_cU^$*Ng&r77Np(=v2k{GtP~%+J_Ezr zygA$KdfI?^IafK2VW7y8aShb3h8MsgH2=%!45;3Dq-d=Ej*1bmOXXi*nXZ}30xyO} zo5wj6^tc^-f}kczfe$78;3sO6`jGAol(`#jB(d1U@H7)ljL={0Mw_gxh2UbduyF$J6r|b1I^09Xy>F$V+tU4)NZ2M7tZ+AdOWog@8YPEz*o0 z@&Jm7ENzVL)0FAB*g2@zUhiQ)9?)3ab6-|z_QekOp>t#QyR!cgLIuPl(Q+c3-Uu12;aJj=*GXrk{Nf+9k`e~Ot ztTQZ}5=pGt8);7xmc}uO3HoUr_Rlv|0#`t$AWQ()fK&-h`jG_2#*VWfw?S zUZki!ZBu(pMO4m1vIx*cP8x6xZI1NRCmRvfQ$14WM}j2e1kq1+wi6F3of9O>F~?hs zdDhRZD<_xSkYtMDw$|+%^O#$j88k%J8b{*mxz(*qlx^2~GB3>^ezM+lJ*Fvm6%6`| z<*vk;iTCSD#x2c?K6f5?4tZREGtn?E#)+_&TaS8*Ieg5R)H``Q5_7TbHd}pCg zXkVE6#PJ2zTrjV5OPy~7TV{48Z_AAbYRFXNc}(ciTcR=@v3gY%QnTK}91pF*uBbVL z<9oLi*{)aGCNe5Ht=6)FcI$v>1k~COw@rPs9nEgwZ4Nts4cxu0c%@#`2^ohJ(_O95 zejl*Y!5l8?)1#VJpSCLURs?XX^MJ*F*s9%=J)ThiXX1H&)S}?U33Y~6;Sq;hM3vQ~ zEe!WE;m&h?pN!)dsbqP|Ug#QE8|0k1e=+x~oDMBf5s#M!zH)-}B5<8ecGSs)TY*D! zlL{NCHnY>B?NY-|rzXplysiQ@;QD&}O#f0Ahru)aaXyUmjG$vhLlfk)M##`>AX|%`h>S=W6X1VNMYd)Id)R|8AUlb z>p!5iOON~^6a18>lO)wtBCGnwpC?b*`C0oeOFA*C0xsIckuf`6S)Os)ex#9mPwxfw z@6N)dij!5h&JPq!0fj#t*{CDbEwT8LKqPc)_?S_z;1iXn)H@KFFWO7nFe{FWzV4F@ zBs`LdO9D?!7r{CgMeuX66RZ*?XW5Ba7rl{mFz}8cE^a4L6dU9^A8QB3w>6T4EZC{jRZ`t~-+f{9c&I5qJgcJ7xwZE$}G9(Juyzs&on z9ca|+4H70na~5Xt z`o|rbi$Sh6!GYagdrnn2F_OXMUN}^^^yo)nQ8}GUJb)~xMgQbh8;}}$tWid*$N0CM znVA{0 zgRRT|p2jTwVkZ>=Au&0Fm}lu@;&*z~AG~~7BuPR*1|~G_e?3?twZJZ%+Es2T{twLT zQ3m2-5tXP1c=#KC^85}#7UNlK3n{z;7vIupaM60qXnuk4T=$a)mkegdkz)byMPk6X z#@zA~<{PnVImraeq%6V=BXgO24yQT!RZ(b{00L~?xzcJ=B?p^Tsu|$38W09QtVu-I zEvs6XdYJSRN{<6BZFUX4offsDa4xe32663YJ?lpk^ge4cDO*w}E3>`hErVAL*L5xh z$tJi|tC3DqG$%Vd0l@APnfU^6VcO7*KT4Vi06y*gk_Df-<+^p=u01}E6UN%z{(370 zYmAJ|627&3hX>Yv)8*;ipuHooc%1NpqeB(>3G!&OV?nh0zEu0tF^RojO*UiLY| znuPm=#&dn6RtX1>_c#6Agw3g!Q#%SQ%llcZqT6Mj<+lfB#caII-bAsU*(ff<^M1R? z*a&wjF(_S^DCMWS+obHPT0Z%y5-v-1vwiCp{`rmr1|b^aG$jkLF%y$&W?yrB-8aaK z%wAuW?L0Emc#UQJ?*3C*N(CW6M;@a zs+wQEd~tg3K41JnZx?`=oB%6lxP(^yoOL`*{(c{COt~K47-$yFc#4tFvm>Xm!n}!@ zoxv_Leth;a@79n3@}F}q7JD5->{ZW}^*T0J%(%5tN_S$YT8pzNUv7T%tU|oXrTU8u z#jkv3ju(YOCxYjFBxw_Yua0NSxE}i6QrI9MPrLaxo_LrajGbkV-WnwaVAs>;Xrr|V zi%(oRJ9y{f&l%kQ zryC#5KrEttt@-TkUtjq7aGZOI2+O>G#2-10d)Vzi-0}BhShyK((*5VJ54^dHIQNqi z(%*StQGp%bA8g-hYeRtWBcSbV*^2#bKDow=s~7y11#Xu~tgdyx^ zfi55HCv^*7yYBdAh~43w2Yi-uUkCXw=jG(&Tsd)Nz>Vr)Q^Sr|$8q08Q4RCq!-v}M z--87N1tGw%QG%Xkm%X2MV4wTSadK8g10u)Ps`qYDf9cD?P&KH?2x4aelTYrW_XyF$ z^z678Zebq_hB-FTGxMV9RPsNL8Xo5K9|STUVX{q@}N^#sT{setnZ<7-HQAQp~^p7W>6Q zEk1wJxD3&VF*wT6h5qu6xG%1F4VL)n zs_5c>+#jA|a`5tFA+~>c>(2yUokr2ZZd)^tdt>+k^B7*{aZ;hgeogE&Y>cT`IMMls zdDBbsxXFmkBmlmFbW~K7$=b?dN?KZ4rni{__GM0K0y#N3ShCF7a2|g+Z|1Vg zW$_6m`3QO3;ZZB&dZ@xWeBZ1ZW zfqARRFt_N@(~U1LWeo4}3NtI7d5Had{gXrnv-j{8G#LdVv412@U`2mCp^f23*uo31 zPUdJKoqw6ZW|+Zjx7vT1L0{OmvO-SzTT_Ugtc_)m4KJH5Co^wf6WGzk!%(8Fy8SEu z^0$Ph@N&c4CD~tpiyePvv{fg21_f~M_sb8p@N(v89Ci%8#g#(8vuda`P7R~3G(qO| z^It_*evmCLp|m|S>@lCEt_3hxS9DvF2MS7&Y6}jm%v~Uj^)ITQRm-v+tbPTa#_g#t zt@Jh>VICeFB`el`9t9-0kH!4>6K;dZYb_c-_X@`D7^mG(t!?8K@7{*>Wsh~ssHj|y z;{w3(oti~uNL{k!evh^O);<(9WSXnY$aO+KDGLg*9Tr;c6cCIkIrOgx|wI^j|sxTJDu0D_|+lN zp=7x&Zyms>oAcL1aQlQjSr!v)$Io_)5jQ>017W4i17r~l41!d;s+FQ~HxA@4Iq0#P zxgNSUHokUBc%k#w;8?-9JoqJCSsIWMZSLmEdb|P&;FnQ%FqTPr`0ybeH2=9<*8#b< z?b2LsNz_w?Och|;ga95jvtNAafxG}K4-ZcQ>cHkUW)mX|?aSPn!8Aj6aR1QOK@*}0 zhhA+>()7=bQmRP#2rRVx>hd5CVXY2Y0Xr)N2!C}<&CFy20Hs9geo`)duOCF@vYDXNZh}MSn)&-(m zr#^x@9LE)#5R6c@l-iC>41%zS}ejombDw|djK**W$PpvKRy*S2SW=LmX=MVzbc%G7mB?`;} z3&p~z%GXxiO0E=?>@C=o1Wvu#Q;IGZl!}7d7qBPDusGZk&?XGhbhuVdW zHMM!058zKIxOVLul+{~O(!D~9KX$~jkc-d1u9<=*h!THRLzRX}XK(%px&Lfy9=>{tRU3>8y<3IQqGELCB`P5Zq5eQF7QR7b#KSa*FRpL|9 zixlkPhD0tDctKPjC=PmjG1GmJX$2smdWKeCfW}Gs%*pQZOy0YwgNu{id@ZAvWszMw zJ^O?U8->rQuLa?D{htptCU<9d7qi4-(}cvE205)OFd1J$LMi+vGE3T{KnPO28^Uv=|s zP4a<6Q4J#;s%#?BO{^h>jB2b&`-xqPS4S-s#+@4qU@|DmW(Ix>*#>%-3|zog z<^ljXR*xaQkuOlHts8bp9|)=z9+eB0?*jmp?$wiW)76E)nERNNQczZNzrj_GzM0=R z%Haz3Ld7Q-7AuvRu=5<)kG*0|F~Ee$o#Lv#vcDI;D=RPiIH(%Tb(k>KdT*mL;)xsGhB3;R9baxR``TNa!zuaqq?87Su2@h2}un2us$B zf_xPZ3scid)!@FT`TN;J(&pdW6Q1{1qK$Qf#hnwVX}+%kQ6-IV!hg8F#zp8ew~P=?cK$n= zMHWdnyEZWkdfRW}i~d0ie=(_fl~YsGFIGq?tuTB2g}csU+lkT%Gv^QSiu{~7{ZgVa zxD{n4mNN>*QngDoF6cB(h6QxtKhCmV+M~Ddm#(-DZAf5FraSZ(IBM1Ih-VnGaji11 zUT}>Dig#hJ_7Aw}#;5Fsu1*3#|D~nPgPWUM#h$ACLtsPEnB8Ff1Nq8K;$kUJL8aFc z?cP(tZb;o!<}#4`>7Ti-wB!cQ~rQe{e}XAiK<>wOrx#yrF%C!3WjB+_8$%iz$X z7UbzMOHDs{TkP}oECCPB4|I8@qBBp(64sY8*DIZxnegbyhVFW@&+=u_+2En&2IES&Rkw63!1CSqusJpliTFtO zhw!@SLK#`#HHy!Hc#cAfTx#}GH$}WgC>VlD&Ev&{U-AQAVGtfdv` z^LQbP(G9x2${@o$5zC?#mc9ZHiV$gdJ{Gm>YrgKl_0Sdmz+Wc;ZmX@X_oB54x zdtDuKhiK1%^t(s;$1)Gz%*sp}HPD-NnIB!CNmve8)SF+Mz5XnJ$UbKyUMf|j@Y&Vz z1^NU4Khq@H_JZggPqCE(pItKNeeovochTI726`dQ)w|q>vSkPbn0O=!Uz7(N3CrJ= zoE8+|ZT7)$O5;n5manHtI%80$v!3h>^Ahc<4}+TQy4P%OD(gk{Jp-kR*M@vT^uoI%l>fbQ;P?+2#R+y8tk@tsh|7r(hqiH$yf z{YSADkSPt@oBnb4=cjD_+0TtZShjlP_up-1kNH%P>9nNqaBiJ7+us}52bQ=aSHF>% z8{%$gk4qXcd6;E0PK>1^f-aT!yNczHK2L;iYsQv_^)5Ta)U*8ZC#ye{gVM~ zg0A1VTY@A+1D|f*#!4@VTtgX<3ZBsFKyJe}+=t+Q!#|pF3Gm+gV#>1b z97Q-3M?)5)A^ay^@k1X{ENBEn*;;gXZoIV>j zy1)FOXaHN7QXx76H%Ht5)>F(JUTzjK{g=0X2LtuXSHvDw8*hU7FCtmz>oe4FSd^jy z0kpJ`o=iOz5D;LJ_AE!{$c^XXvlcBy#3wGl`1AHjNhfY4X4pgBBMc1cAYo>ZX)%Z{_ zRkyUy<;?sb^Ehis)`S_{j6-2fVFajwxbgLP;{0I~(GiXt}ijhI9e%8B1!!!_Kepo>oYT_>GU0 zjRPBmpKoYn(Nff-m?v$q&ZI~ zGESgZrj|qVRr1pFYV&o#sw&-zp-fnf8a6{u`fs+-RONcmgdYd#266>$64;}lJF^Mc zZpz23j$EG(+lx?`!4GL~w>{aHCREfWgdY2A)BPd3}4}oKhj3# zG1w~?Rucx|5qb?v_05o;c<&*Mbkp}DiBgv^9s3J<%gqheb>LMRj4IUJ&NBnHkcT9q zNLm<5tAmjG$skC9&0A_>Iih3bnxD7i`8*)?C*~k*g{JP{XE1ou z(n;m0l2}fSf{h2O* zj>MAn^J^K4myg9e(DNF zkj_*VF!h!L&Rq>wz7J7$FoQ6@agHH>L&I4|1!lU#O?7plHC{6+dJo-#+y5l!3|{L2 zY*K#m+b77y++bU=tbQt4ktGdr$ea(~wgSp1Ufcbm-`LD>9nx7ci--=|e zt)V14Vg!194FV7C0y?=hVQcn2A7hV$8L5(4n~)}>O!=!)+mB`tIC+bvZ_lpI)F`Jr z22D-8CF@tWi>t_`Bl|;j`&iRp?v$)J4OcECBrLP%D~}AD6f~-@wz~<6NDZ#Ze*cGj zt+WI1EAVo7a7QL==2odQ)dHX{k^`3$!4~3Z4!h(Wqv#y+JqI`3prhZz ziqD$j?x6`$q}WqH3A($_^7_c=ay>Y1)BsBSC?>dOK92U%F@TIdaceEfU{@U>rs9am z8VA{}5d{-dQ#Ln|iM6{eTwBK*@m^X?bc{Z??NZY5ZNJ?%%3`q{FwCooHVoTV_qKn! z*ACX*6OnUE*p>dvJ&aGV3bmPWzNj78V}9G8!l&pbL*0jL_E5Fxwi|QXNDt&f1W__b zBaIEKuwl{9PdTRpcWZLhy)|4Zd;61nij_djy)4%+hJAC)i`|H>h5)2OOh+X^oXGz|58- z^QdeabCVQ%7Lv2Xh(QFY`O5ebc(ABx7CKrj?u;$p901If6Xf%jR`k^KHV}}$)p+x5 znT_*B<}PDg1yn3Hod5z3C|NSu+1n?Y)FdWkWMsS`l`O%IuV+eI#z3|%qsf=%1E&sn(#{Wx+AIMQyE}IJ+g*q+^W4t`1tW-C0SY7pM|vgInrwGkSQn&Cq(i_VbcQgfgmx$QfMG> z|3e^cL^FWfP*_{CIb4n#u)SWTK;EtfDsv4eE|jIDyu}t6K8s)GU?tYA53jMr?KqJ= zut14Db8~X~@D?C4U2-Mewe>E6r6^#9UJunHO)sbQ=3ud2xhc?IiD&ce^`CFz6CBGzEk@6;$7wfE6LK`T4xYq*eyJwOyP>1_ z6WJ2BXR&{DkFZNbUZz0&4acMr(f<;a@n26*LK#G2>H1h>hn+3#xBaUa1L5I@j!~8GiwFaTS!(|Q^ z@^HzSjBOuZ%1$!l-oNJOZHoKlH$4pS?)jqNPUIo$0Lgqc&>X`8q0M6JSjYNmN6o@y zw;A0T6*g4doq;ksqxti)orCA-m%b?u)@#mo1D8>CsXDAUgt3&?2+}E8)EcrG3RqL9 zcW4r{a2Oth%ThXvR!;+oy9eLxQ}`@C-C9A0{fhAYcWOhxzb%dulL-jObUkuFycX(R zoPbaDs1t^KQlfJi$+88qdJ?oQ$T*>s(Nu*J5@;wZYX0i``9V+`C`i%Tsrb1;k8?E? zaEQ!7;Zb)Z89D;x8(V0WkO<%OcpKEJ2H`j7zu2U0V>#)sl4$HMc6W=yZfqbmK1z#sTJZ_cnIxjhO#`s>POU=VBM%8{1-pN4qk%uS;fK2`i#(Z5 za?Rl3iX<1{w5L4nGBO-}-w?W^n84k(_y`F~`uh4@$A;*2baYIB^J)UJP!ov0zNA(8 zbDzk1;{*({yhYGX>Fn;KX4L|!^~?R`QuO|mb`dvTTp(qjUap*ThxQjer}V5pGPAbE zNytQ?W?dTl7tbe;H}%!GjvkgVg_se*SEHqr|+Rp>;KGAmiT{@9~eA>KgzVXcp^?G6I)$l6U#QPcDz_<8nqUk5* z@XFVgo?6%OieKy!f`C9#v9F*8NE;q~k-b@Nkk!7^%10Sxko!!WEwtn8ud;fUyxdqW z^03CMCyIH60)HJ*IVkahjzTG_C-_|$8S0;E@AgTn{YB+~0nY-^sUu6y8k?KzBz)bq zebt@s3|%L6&|mt&hC9;S$OlG7K9`LFAaI(Vs;sYq3xq8ZNr>MO>V}Ft)As3WYv9Hl zy(8PwrKQDMAc#0}y`^MTi`nQSNZ_gwHF!r(uotr$M>$FV**WNNQjz!E&}fN06!a=W zqYx8^UW44uwAnC7m@VehYl^Z_;vOmAkmF&x&L*UD^!ANcSk+3(P1jgJ8=>mX;Vv;D zBs2M5BCBINXKu%FD0Y=zE}+Doi%}%+*v5%poF~tzC~|||68&|R!8@6)FG=AER`QiB zep!LUOQVj~2s&ndPOCIbuqG_Dgl?RLqH2$jvjVGHGCk}r)@o-7@_CdZW;)lUSx0D! z8uU8EoBMiuoR1YI7@k$>^1sD6APjz@Gav-$-*x4~!GeBgdX!bQd_Rv(*Ws$szez|~ zwyV5N6&p60F_V||8iZQGB`Bg!nCb6Y7c43yLl_qamLMlfI$+pXb?cbbf~$aqOv%{+ zhmsARP_sm85P}Rg7%@<>)rbR8Ro<}GG9W&m^P0O?3p!RUqP>AP()Z*5*~b$fX!)Dt z_Vd^IueM`97iRW9@=}3)$zPAO*Ia;ykksip97MTT)UndXM_s@^jwm-n=5^LtetF3p zq?$ndY}W?ZF)PiYgQ<}=Z5aB}fWv&PcIo{ z7jIQyJxe=@D|U;V9m~LF2a1>|hjxBF4ua<3j%8FXB}>06)H$hGt}$5zMXO$3kOXa< zBrO}{p4m)~sN6UawODE+pwc;=@hU9})i7$WtEqV>OJ{F=Va`q7vL{ z)gEvTN~7YW`~z!ntq5}(*j9>&ogw(cV^O&wbkbjaUj1%*V?&L7R_0RCvb}4d(yD)( z-uy~cm8RW#P33`&ZG2FGV6w9Sx|%`CdhCxV`N7>75n_p@2gIEgFTd~>(NU4rx`J*= z8B_$M?hcj*7fYE`Woo7L3v($`6uYQW{_?|fvNYdi;1Pek2~L-#wlHZs%2QBEw{$A* zzVhh%F*=PUnY@-=2A?yqc}X%KW?@f}^hatkTfKYc2gm4((S z;P3unxcl6AT4_ZwU99ltEdfLOf`prwH!(0Uu(qiw92_Vf=I7^E3hZCSW+8h8G13@H z_R?bh*(Saex1+b&>(DOvtg(wE4m0xn-A#d~RW_tnf)^0uTbNdPPydTL+V$mYbnV*F6Z!yPlhwsdva5gA4&;DtscM?toO@X0p zxB4~!Ft!%3!-Qy&C~WEQx6@M-Ue30y#qH={UKUFM^iEdTO<)TV!#>l-!p?@U&TQLP z-1fO}xF{jMx$}}O4*B@yZwXC-x8G2G>0dz0gaZdJ548^qZ4R;iJtAbi8|~QTJG0!e zE@BRhkim_N3b?)vvY7`sbR!XQ81>q&t*w2fn}LcJ+}FQGzS_);3%htg{eKUcdDYg} z&-t12Y=7EPePWH>A_s>uHkB&1w@W=%%01!{6PVU*=KBV6jdH0PRLg>nX!l>aE>78r zd_W=K;PbbnvK}kl^bJjU9>Cm7wDeeR37wXU65!E;)bCKJTQ;u+(A#Xmj;`MHDXwyi z#^V+osUpcMr#2b=A*u{sB~Vnm)(jQCYKP+Ks2NlkLCozUB*zo)WzTs1bpN>s=yRDr z`QZq=8!exOwlfgWB9P3iQsf9Od4V6Gyl>00O)j!ilA+o|;+{)`j)U9=nY|*|qbR|z z3Te(a>Nz{Qpaf%JYHTd+u~ZYI1fhkW3KRHZ8;hJ0pi5ElqiR5GK=yvtom6QbVQ|Ay zatD391gQ$to%A5bMlh?zz7!1rt+Z0~AXWyqkISg!uOK|DvIOlr?;&YnO^QSum>ncY zU#B#W2DRX;kH;e7pXD^O(W2P%QJ2K`AfPJsTcI+7)7|%v{CVrft)gDH14^ZI*9=r0 zb#*^^Sm-#o6E1e*pl^xTNXiHZC`};$9Z9JaAsD_0_iWT90g9h1h*O&om2~4FuVQuU zVWPi$@@5fe^5Q{(%DXEPk@>;6FFKN~7aD+G06(|Cj`=Yx0x%Hv^=$WD*XTDVo8MJV zu>=WCNedwQ9_hqWcSt`uc&A+mBSe8lmlLR^K z`5p8NV)8DO-9FZk#P+O7Fsy5=4&9nvo4+ z=T}1~^U!i_6$!<))U*s4#3uLC*~(|&%M<3u*^>P&HKB#)`e@bgVEhjm@6*x~r#7MW z5cSxXFV8rvA(cYVEgx?QR0winw*B6T01^k}b$+;b(2jN9tyY zi?5!kU+g+sX*0LzR~Rx`O27i5fbV2mKk-C4_0GD?gAz^iVHS*7$q&mjv3aTvij`Ad z-3h>04Lc7k$Lforftwt(bCUW1q~x&&AHFIl8-I{h%?oYPuO_nK^jEl_y*v(f1gb!b zu1yBjK-ZdkH4zf2p$$N%&Re4$ca)M3K+TSNswnOSs;~wJ6-tLfM8rhCio_bUfCA;| ztSqebi^d>4W@Up53>mg%HIjB_?#nCTgNh@!Ro6S2<)HxLzVg&b9s4Hc@l(x`ehS7%YLXA4XLt1(a$ttgt=J45vtAVht7Y#?uxn8x2jZ^emX&9^JpHv94j!O zQ&beqF+4+fpW(F!AvRtVA-MsW!J-dhM1tJdIy;W3lxFavU#S(h<8(xawh6UUsiEX# zMEgu)WwAjwq|nLn8YvyG|&jLfojzSC;`L>&hHC)w~PjMWLpn5yO< zhalJkAe?x9-@;A`$MI()P``GHoQ(bAC}|oh{e!Zf#l<&EQe<}Mv}tX!%G_#QcNUh5 zbC4LnY#gI#A20^jO`D`EHoh$MDn*=at#_s)0NdDR*Jqh7K%b;fgJOP_fQ1>Hk(}W6 zs)6dMrjcG2h4?IEn@l`c%Becc@L8!4BpOH~EHc!~Vie5rx6f*8piIj%q;gDm4N^H} z={BrYgBtZ+lA^8aPBBn*NnZ)n?hPjGg#)}|P|v`~Io`l`m*vB3WP-@5+a}vI??4}f zRoB9yF?2~xe!@9Y)o?Q{sZSH@nF_3{-w+5vAy+N09%-D=sL=ETdRkpd-BB}H`ceA$ z6k@dVlR5Nsi9lLg1HS$-H9isoAuN-5`4^*w@}{z+WvkoUb@`O!p^2;W%)UYc`s}0vBNhR3wS0bS^wwtGtMR|BpZZ5GGv(%RFgy z9XnM4pleqnjdx9qM5mBfJH^dFs+wS#9;EP|^sGEPk4{4yH|pcA-A6he2?z*OgVX1O zuR_zGX&eK08N0)8rIE1c`v_G>#N)@---N8SknAe$6+KkJ*J#LkP7us<6|-bDFTbbO z``q$A$aozt1kNOFUr*O`Z4WT%v$30{CXjUbMU)9k2Y3XE_J8~g#$v|^87m6v)U|fil1>c~e*yI*@Kq2W-fNn%|{PD7a5O;8(D74K%Y?@K$OIGTxU~UCRH zAm+H&xTG&lBmGL}u9^UkkK=A|h4!|=NvCaUZvMsT4O5lV?4rSKSD_Q933`#+hXuWf z-l?LQYC4-F>W0bfdOgf6>$iz8(H}aOR~S`S>8MYN%)inZNpl}Brj3bv=j6)F- z!F}WFaz5G+Xin{J1^KJ?qm=_r4mO&P|D zxi@1=?7xB!2R1|Hc-Qu=wG|{j7lB~7At}QKn_vGLaF@mcAD4`+#2@$a-gv}!)CB7d zG2QBH+`q2R`X4L+n^>V4_&-#N{a-3L|F_lL{|^=*_CHv_Z|5q)aQ`2%fV=6cDY(Q~ ze{~OdoU=fY(k4wi8AJ)Fs2V^god3e3%!_CcQ8fYQ4|Q8@LL6>qkQLWJwc|y7|4`K| zEf(HECpQLzz+q|g1}wBZ!*CNq{Y3DhDe!(ALMkv2YYTZ_pXV&Z%lDB8dj^U~8Ra=` z4r}19d=c@vA-7&;Q$(lG)1aE1Oz8~K=WZl|dpS64go6)1~W;7>q<=abnv zIdhAVq+2%+C>xppY5Bx!h$T$bJ}X6u3It(O3tg-C&XHaK(`daVC_A^Ck-Gv#c@P4* zi^$udyF5q%DOp8C=A@QFK*^qu!v&mB{16?}ALV|PPN2J13s*bSv5_0>QBtydi_8g|? zu9d7w>Gl#3uPnVgE)uM6EM`=#8xR2lzE~ zM*Ks2p#HE}76}skiqTVG-e3z+d=heEN)tLe4RbMPnj(it!oAb)F_WL<2z!{w=?0ab zqSTSKIwhpY*3PbXhNG_ACy#Y`ZD_I)n;51mU|y@=RZ1rg>U7Ambkha(*x#Oz>+Zq^ zn@1TZ!0ABP91`9yNFjWg1x>{=+bxqljGR|ybdT9qI{P+?M~EXx~L_VS8_gnBBJmXP4NFae=q$5ST7}EehUTQs*u*R6i&LLAG9;uH?jQ zP0X6Dyv|ghLm`tJ;Dl9!vM4v;5h%{TMEJHK3>i_1{`s;|)S~sZ!OMnu;>rdyU#ii` z&hJB%WE3ZV8JWF*dv?x?u@szlfXy|=i1U|_VVLNqUqAa^W+W{mpA8V|9y)c=SZldE zFG^IjAN+v;Y9s7BLI5r2HPR1pEC7In*R__yFxZJrW;VMHbw!d|CxlECZiVS(RJx`A`;dw9F@g)o&7>`V-!HvONymVutwpt=1-sNxjsfuRPdBg?)*JKcwu#$ovy}aV&uUYL zM-MJkjZ9zFq2dw6c%PK8-qH7|2Zw$ zhxCRisKLiOHV!;?pH$2w{eXq{Szc~1@Bse^nS(Sd`|yWNO0n_La!uBU-TM4xpSTp9 zu@*`iatvxZ$iC|ZFa8K%Btyzg+rNpJ4l#IfQ`Z=i|8o}e?E%nv71-wf1@PAad#;A} z+=sW9^0vLv3|OwTKk)kneAv3D6saMBvf~Qa&U3{UY|sHJ42b`Hyuqd|!nV@b#y_gP z4NsbI6Vcj!N)Qt zTYuqpr%%_t6 z$ke79%-TNj;R$00ey<_swTJ)m>(?=Wm>>B-d8b_+6YM4|=CZY+jHrxn+_(r@kQ9Jp zkp#ug&MwrB1*cX!Xb+}E%xa$HtJ?oqB~IRhS-5TT=I`B$s?*=*EF!#dvnJrmi+GCHSCbsuv!5a zMp4QcoIHE)B@D4A^uu9B^0VyR+@wo!=l}Q~J@k`<0()D`0fVAO=wz7)Aqj8=NHG&* zVj}ZUw`yk(z{%_|&ij0*Iw|lh0S?2TKupvY@&MekwFxCJmIL4!$X>qoqDp#DCra)1QQA#-kos&xWb zEc@V?TqU&|*z(jML+=c*U9|E;SDaJG%r_;zL#qC=AN8fE_akmZvhX5al6>G=avo@&JT~b~`se0uIhbjS~4F zf;sW0=*L^v4az3*ffG;9X-bXFCij|SPUbW+I^2Z5QH!f6zwsQyrQLRRK{b1R1$~<x6kq? z$bny$3kdE`XUBZ7vt#VX2A||CL8ZWTj-kJIi0q>)P?@Vyoxm0m=QNHMgN0C{bg(rF zop=GM)_IJ|#mH%Ug>P6 z#p|bbTKA}Vk;UhjVMB&HKBX{#`I-tSdn}$w;OJcivs*Ew7DcSpUg`(AV4&ipN0`Ud z_7RF=%KYW%-b5L;$ZU#20@M-s#yy}Q6)AuA$KSSK8Xu2BMU>xH7vDG%%ytdz0@G{- z3oDB~Lh%=|ae_t=0R?doHYE_&txwr~6mzXHCBigUD~60%<9?1Cx{HG-PhHKKRN`0$FYX(o9Pu z{w=3JWm+yG((W&7-*f6UL%=~UMs-Qg!u%6@#X=r5{ML0X6>!}4t|AkoW>^+!WFK3= zk*Udax$+g0*E;0xdI_Jn`d*Cd8Hr)be}p^5#3o$u?&%otU{pO^E##m7)zB~hW5uP?^eorOlq)u^HhTlh$V@LVI4Fz9XvU&gH75P%=p*+2Qu z{aOf6gaB*@^Qge)0fafqpcv0Tn8J=|(CxwinjqFe0!nqIkA8L;qOSE+K8Hf%8GvxVccg*0LpZxx1 z=jKy$swEB`fmN6C*S%&Miab^?!v{r~Z;Ugi3KXFD;3`9~&Xa29RfgxfL=R7DJp{UF z-hS~Zuwhj%R9m6C*|l@!5yn$iWaRr4Lt%9 zz@f$E*;kQG(j{r0OMUj?kXtVMp~fP0KoG}_BEdM~U4PcteCQ`i%xxUczqepYPL44!2mj(BQvVw$7kOqcnkSwf|(7t2fnQT@jf%_KhhOLbkVx~5`O0RGwr+=GlpDPJBZSo`+b&QLw1`8 zHN+ohT@A;Q(4+pKIgkD3iXs>g&%Ofn4bsBCa-8g%`a>)TJ1uWD7{)sOFZSLtF3SCT z8--y&Qcw_3q!b0DL%NioN`o|lq!KC}f>J}OARr|TZV3rRBm`-Y9%2I`B_SoHlt^>d z?G|wF-?RVcyf`n;b3V@-KO-}9&wYPmeb>6ywXXG9iu>yn?5==3zh^(RjBgl`ckEH0 z7Iyne$$8lyZP|}qqBxSz^oZ?&&$Ni6*mo*N2@r;xO2A7>vQUZ1PZCWMZ4gL4E*U&> zT&9kbkYK0mdug1Pt$-C?sd%ZaWcydF6O@yAWm)J}Twk`vr+T4$SzFQj@`je^NdXg`xb9k8DXc3_DZfXC31uG<+HP{nxwjk$yj%T@&cc zW3**Od1(9sTZ%V|_}4!&dbm8XkrVc5`+qrj@8>HSE)rUF?!=$@-}b)pj}LgGZsL>r zJpDhH_&GlRKN<_Mr`Kl{_SP7(iejpu9R-lZ^ABrhgQd0cD=X`8n$J^g9riaABuw6gV8WU2oAY)TX{1&$XWrYN(Lv{pX2uVW-( zs5GzLooBZ{zOtWG3p`AJ&E9rCZhvdYXnRw!DVcs5D!&gd9J$Yhg`AM~7NQu5jD(Qc z-?m#Mj%Zb^RolBUwzE~k_UQ#2XUE<+pa`m4ri)ef-ui1m_htZ0K|1Wkk1Gp(ZhM1$ z@ZMjqF#lh&Dkj%b`g`OCzs6+d^a6+~1V9~&X}Gd^?9J%c0P6-K;wVlt-B#h> z$@J_%`N5xAHoy;n!{^NLI)$yEG)MjJ?l%SkvJ;wG9vtky8Axwb;W=0++E>~y zOc3EoP`ot(^$s$KUT!0OfNCI?IjI5!n+3oI{RG-2^5r)K?MA9zLvG@{ynfmVq@PaB zMG~$X6lGLlEysSFx0F^wTC}Zz>@;T2Bs&sfAt=BwoxeHiPjeWe3>OjT;Dfqw(>y5m zbq%qVg2xw?Kd{{XDlf{23(gb?fbJeya=|tqlx>CKzH^=rm;liHBGDQspT_ z(8<;8KF|j>5P@1#Be_a`DDDYlPmejJMV7M*R72DLr?wUAXQ2&aK2}lQw z0tn05J<$YJZ6^@8wK&*YU=||GPZtwmR0WX4g#SkY5Kc(R#y47k7ygs&^sXwY9 z+r^Nc;Lu#dpM0=B3wSVyxSs^f%O&y+$p2{Q!jlBOa(sqTKGTtxdEyQI-Zo7sCl1q( zKR(FlzHots=@K!n9qK(&5Qa2HGOMuj=^Q5;z7e5Z13A587J94#sD>cUH*%mcdk52l=f~w3QyAnuZPVF?+dj7m(mY0yJXLnTSKr z33N~UfE6G*F?MC}4%`Fc(kL){gV;4+G?3mVW>+!iINC!@IwC6lVZjI`*V77&AVl-~U&;+R;#G1wU4bWY;v7b9SBn`S-L($+hJ zD0xEfFB?Ln>)NgKvy6H5r#EXc-5X1BCrQO${yL@3vxkxUQEr*XUcyXL@X{+dvXzqm znorAR)OhvTHAU!WHgu1J!8T8NMtbAR^Ve|Edhhd@a)j;z90?aYM2raSA_67i@erk?I=&Hb`qrN8eVQz|YlK^x|o>R_Q;wf$-cL^v2O2ns}0$K`w^@ct_!e z0k5u?*2j*f>M~cUB0al5t7iR2nr-|7>jR@~f2#Ar*NZ4dEC{@~cq~Y{_6|)MN1_|M zQf*SUueM8*SCMmYJEZ)|t6z_$%);yRr9(tEhKWbChDgfMv852Yw1-Qkrto7HG*m>- zAm*5FqzpL0A4{%Ivd~RZgGEJkPG64R1S7$6;adoO_HHL*evQ2C#pWmkKOv}vervm8 z_qX9ppDCNfzu=`Xb4Z|pM%Nfq%()qKe5TMKTG#X;FJ#PnMA0E7Jx@Q1G8ye}q*f;5 zh0^0;pXylP_+w?Z$Lt*&YUNeH7&kS%Q^cere8JAA3i7YAN@r?rH$#UZdQi%K6Z0ef zBdCd8BlSUQPWilCR?o)fsQT-TjDIjc>kOUNK7R(o*H9#nxhO_STv7p&N_}eyMo2|@ z3}|nWI;=SJ5%yINHn zzXFgPfB(I3BWQ(ZYh3XqPdj61?r-MaG6)`F;PZ=nO1~z9w-4PoraTi0;&kt;1l?XY zO?!a8{V|_z1mqf-j6?|By^y5;eCHb?Fg+w8fFC4pTl1KmNSjiG`~2yEc_IY?j!iIn z!EOyrqAH#?>M^`@?ju#0(HGA{9(jz^$EE6&Al4Md-mudoD>MC(l|E8hFB2C52L-oO zxZ@TaTEY1>%lU7K?jcQ<7ki7Vr=WuS!~l{pHN6!H^5c928${teh282HLH6;B4L%#x zd#39zpY9Br)aR|=yG_ksZblrX+yw(vXC|-W{iZWdNr5@7yawsZ80v<>k-^3#I5R`0 zFX>*W0J6qVsahZ_Hpcwy`OK^8Vn?Dax?(80%?U*FD>Q~|Q6mNItz7Kr-b3UJCw)iC z%(X>u9o3y9&&|aP5x$~qWF>6#j3x7gI>|ub5qO0wTZP8X_jxAR*B>{5<1@sW$R&co zf1Z5>(R+FL+p=BvP4Ch(yf8|y-H>=wC)e9I$A)s{D*>r-Xv9V(gXHrF$) z4gT60GK$0$;|Pzu24KvA@K1Kb=T9xbpw{C!66*@54~&zu@(AZQ25pm_hb*tms|C=- zE~zdR1^bC7jJXluDnwg35v^Yz$vV!r3++Q|;IzHwAYFC^X^GGQXr-97V6ldB@hBv4 z=`1ocf=(#+7APP1B7zZBV7RG~`j*#N{uaSoq0mL11do8!(%CCtXeMQ__=UGXbC5!sowA%y-(8bs1QXcgPnbxF_Q#lG(jqx#YSzQw`F zRGP8(SHZw40B`75q230uynhJil}*Ooew1!(6;e^MXEuMu2Yj$c=$=m%?b|E5BTOF@ zN}M4(06q)V|&L_5BVTWNpSjTb223BmVxBm{nH9 z20kvi@^9BDpu_bYnKyqSskS!^e=YO<+eq0a0x!wDHAU=4c5HpQJ@%y@12?Cm_}{$__NG+#5d_a~WbP zbMNIJC%r!EQN2KX@Iv*TgZr?gL~R9TLaeozp?osz(6isC<|cmG4fW`TsJ+?!{k@-m zE98VxiN4Zav47kD{AeTsar~c4{9Ne&+l)m=Nwm1_@ZJ)Fo%161pMZkVaO=z5{q@js z5q15Y6OrV-6+!?_iRi_}-oEt@cy{*gZD`#T*s5}{JOqKhwFb`K@${s7GaYYjhk5I$ zGz3$RzugBXs4Q_YAUt=*9ioO&z^#e#4jmSx7($t;WtR#P8fKri*k9bZ_%mEpq;{y0 z@_XMO;V!5oihU?06F#sPmd7!mtHR|p+r#C)vp%&L?*T1CZ^wode~hDqW$7qu9(eGO zC(g+bNA7HI2L5!@Wa-76EG;!`_N^jY2NsnoV{%j$+4PWLqagJWUdHKO_^OnoQR{2* z@!&!;tTKn~%*huS+3-fb=jRvgxj-GAsIBe#VSD#{XkSvWV%goZL+10b$F)y?&u++I zE)(0Q8?SK4z z|Gy~#2OW# z>1C$BbG{Z^1?~mCC#3%Fg$@JDj0zMUGXR&Wy3BZF>I>+Ts(q7sJ%-TFY=n)gye~>a zuVxxgSRlMm(Lobk*iE^?=P=%g9DYAn=Q}zPh$LlAfG%nszIx&lGu^=wi{V5ZU6Sm_ zzXB{7{bR+@0=X6ho3vLKRG{515*-3|iX_qW=mcij<8t43SjTFWMX z0Rm@#@CP^yoc_GzJOdIYZa;SoQbv?G!L{h)c@o%>qY%N7L(paPyp$KboIr#N2@;HF zks`InHthrlQUA3J?+Xh(qTH(rzZT84%qpmPJ)wQgD(&Jo$dW$o$Th08g9HwBbSq>O z{imd^rX*BBV|WI<5u~w*u6^CH7A@k!rz9Zb zH40obLNFPY3p@JD0rcW7q)0$tjKD7&v$>4vi7x#;gV#6H53Gy~9PMO&jsm}yzhyEC zafC)#qpZ?n&!#_Y%*bOZuY>dxgT)Viv#5KSyqkA>Uz=bGjtR61YQ(_(psI`2{i)co znrSv4UtJHkqf8p3X?f)JLfz#t|W!0==rOu|kCl$b|>0UlZ zZH~VCZAfxuen1$)F6LLK$?!9!5ZtN**cio}g^F>c=H2Nv70>{A%+=l)62U4#1LLQ^ zLW^=61S3^Q=dZR}TNwS*7Syx-s&Fj!P*ZfL& zhd=4<9SNXxxH6b;%DmnNv@4kX#>S6tMpFjkWmB%A-`v{Vv~ui{BK{x@b>d!*TaFp= zSd~!m%{?C{BKWc84?X{n1fGk~C;mB7F6fIAx;u3OMg{cY}^XgBGf}ZbvUB}k* zBm+pJO-$98JZmBqUL;aICIYLAWH$DQJ75U)TP@hLNWEXJFS(R1VPkl0oC^|@Sp2!P zf#60+hWr`Xj)3e8vClK>mm^8a^cU66-^cik-Ao7-os6NyQEk|TtpAxgAU)bkAWb)l z*Pw>@w$e9y*r5IbZ6c@JDpbC^u~?kXuUijgnrb(^Kd)uM`4jeNiO*}Ko;jM3z5p(_ zFgZf_E>dt;F}&l`IBnVn?Cq1jwK?MnFCq^mOGRY)Rf$%w{rUV#!}gJ?3UISOOA(3y zvQ$0ljdz%kBe%=}sXncR_(bmuW7Jx79bjT~10(KJ7h9nQm=>=)p-cZx-laPn+ow99 zIrU}(31P4Og@6LCJ{+lUhc+74k>+InNag&7y$z+GMJcc#M3M#wsv~kj|C(IE^ZEw&9`Tc{Ac2PN!7By9uK-oKEfWTEiT;2^)&Rw?5f(!)lb*6WFhIz(=q9s2ir5gtG<@OuroP4XVgZpq%#c zEDd=EqPEX@o2|5Cy|W^=qH$s zWyH~$I)rpqLLRSv(g-BQ*BZSHW9yXVX#$FA-wWdtN(ta48UKK8&GbAkBtW2cQSzv8 z%vzA=BBQC#5AHadlDQ@^6WhY%{OXpx8pCU}Ny)KVyS8?Pma7Bb{GY0kJ!Dkto4CuyF|8>|$Q^f$# zPz$Ybj#R!81-@&YURNrGi8<$)G#X~z=H;8wdS~0*^j3c2^12=9c|=19}$-u zq8=kZn4y|Xt9hed$VzxdBSun@G3Ja?N5t`JtnpcyWK`TlzZro9#@%NU6r&7AdUf<} zM!g1v<9*86Y0Z9hdEtujvyahNkDH;g`Ud;PN6+G5{qfa@!a@R$kCfm4aX6R`cO+6e z35VO7w{1NAtW4YOB6;T%rgEjJgrn*45DGsSQ@?YPkS$}IO5e!p_^w-;9i>V$jabaiKQkHt5^#-sya&Yx0?go5jx1+}5w@vDA7!z9FJeH#$HB z2?Db%7rgJHHf?706M>ALY%9JledPJIu}_9x>c6d7O?F?B?|=Dg(X(|Zp|;9vg{g^L zC<&+H&9)X2Zst4>xrC`Fj5(afch4q!Z;_9q<)#)O-O(^IgfuUUIpuSXy%n8b5KFIY z9C>jeOs@bfmG3Vj>|hF*DsBTzf^Twik(*8pz;L$!t!FN&7eg&(H0_4 z3q>&(^F+P9<+zR?BewwUmAKk=CU;n=c2tb@6hb?<${j+jNXW-gX7|46pivxjW22(_(;h>JfSWKAypjFoVws+^6gO zL8~iEEEMZ^X8v*oMei%k;%7|$$EVROP32{PW-7lqp5GjV-%Zq!Q9~xgo;mh(mW#_M`ROW(U0ZaLXBfLCZ6bx z4l41}HL~ak<`O+Zz&{fx@Zb<52@s@1ACJ{jJV#Bu%~YJEKc!5{^{0Qm2)g+-$h{xAd)cPS#^2{>HX0)ZFX2C8AT%X_4~d+bE+! zwaC~Vw;z#*{l-!c!x|PH&|p5aD%hnIVc6p~E-^w7HLjyNCS$Xv*{RDvAbM;`HzT&o zO3#Bq{?J8}B2P17TpOPeq+{JyD96;<>YLmfc9d7!+MW1V)}QqF+48H2*g^xtKG(x( zQc>@8;YbmGzryC8?IW>*9*N~^E0O1w_F{xP7U9} z8{rZ@Y;E5@iM9=TKEwA5eSy3l#p~0A*jBP(@TJ!rp?>ClY#EyCO32CMcmv~W72q+W zaAj<$*P!O>y^NLAH{o1WNcqurn-#g{y#cM3hC1*UR1=g{P7s^dnLE-6lt$$~ad?Kd$)gNGB|aSNs9p21{FhP!v^plPd$^k@UD`7Bo(mI%t+&mz};OW zcsSmgPFB=@h`!6EaHANARduf-b`zO6%?DEi#pB~hXi|rneyjk|kkLbatXf&FWKAu{ zZU;agp%BUoE;hkUtqkl5tifk!Sc;3QX!)X7o*6uovOa3eBlJAkT3#!nTvy{&x%w=j zUDx3$C>?i`PPN5f@YFT&KSms%zDzC9Cf^g`o8-NN!~`#Nrkfxo#3)(ZbawSl%l*ec zJ|W)uW7lsBFCRHQOV^D*DL(bW=q-2p82?|MbexX&<{z{;wuZ~AuZ00UGl`VE{L9CV z$w67wbBi;tt-?W9N4IY8C}pnVh$rnp$DbWX#}Gc`hr=&We;3>$S4ZhiF|{QDBcf=2 zjszJtfr@2+rddFG8EG8NF3g07_{8S*)jSp`aXVA(;PU~^9-El3+Q4au`if=Bc#IGc z2?RByZlfN+QLD2C1hr#G*9F?wH@y04^7!%-^{|MiBQl$lUxUOWNIlA(LZQWzch!g0 z*80C9kfm>9U%aq`Aw|MX7d{$tq{PehnGepwQAN(H4a|wM2Ej}eZR=G!nB#YCxD}pp z5!3L-m?+cRU`0O~IM(GUn8h-fO+2h5l%hnkNy}zcQe5p)NO2IKtHIo4e8JO=r=QY$ zmoNAd)YTc_q=X$k+xnn=Xe(;Bx6{kK+|dACOO)jJ%1)qH{md}A&FAJ4g|K82Qsme$ zQ*p4tHkGtU6^~jpS10$kzFmfd?B&{mp)32LJf`SOhly!L1<}@#nB7s{t~aLbU2o>h zc0_a8*QNP)ZKrp)x!-c@w@>}$w-r$1R=n8-r>&03^!9Ybw&iscnvKX$AY1TLL1afSEAayd=XpV)IFmK!VOmMGfj9-?GZi`>!VaHV`=*;8U)evFx7H@=odhN=Wa{(j~M|B3YqYHcO=8tiqOuX?X2 zP9{6|=(T8BY0RE0aeR#~$R_gEppmX1NZ>N)ZKUQ-*A$5Evu>80qD7)yJD?#4fV}bR zIhJULdBGd>m>G4^PP$IR{`CIbtBze)JBuMga5zY*TB}w$v02+HNuJu9%&I=lB)sp` zOkkkYjEmgwvtzwk>r@p)y9`4H#(w2pfQAzfS%86o2lvbVno_n7ZZy(;FQ&Bg`pKL_ zeJrTdsuG|N#|dgFML6Bz7pfuM1W-V7QYksOG|y`9$7C?n)ZiJ`;EjCU1EDZY%rY|( z>Dc>{q8pa+FIAZ)a%?>$<0T|d1xif^asK)_K>w}vkz2p-E-AKuwSBDUr9Y|%i zA8Wr=A7FTYNA2MfOs)eAMxp;kb+P=2B+|Yw++R5O-M_t(89?s8sNv)D16aC|(2nxG z{aF3Y=rzs#J4)$6159IKYjgd!Z%@tk`M*CjE`FS9%KaZ-O~xCaKmbhC`c~t|ez3yU zaRaqQFAQop9UzN&_I6i5e+3-PMbh;Q`|B#DY8Q=goDk%Q*L`h)*JV!k`T;U>OYS#B zUPD&$Z8jHIM@gFa$j;ud!;M;U|F1}Z!XICK3f)`2DKe+=<*XY>?RJvJzKI2)J`e+K zPrLcv!I)TI^xozDKKqepr{E#p64Svg0BtBorb+QEfRk*c&p3Yj-2+7G=PS#3)EVEA zm*r!ts{5mNkT>`hKPaHI@T(J#89w~;`@wJjMz zeDzyq;_tupLJxqO^Wsh}`=I7OZddL9!6h&uLo0908`?ttZ6OkCQali-CiBx#b12*& z>pegI*P4}4CU)Zfc-wbu!pYzO+Er6TA@l)S=qc96tqNe#C?vtjfig^j;7fh)xXPCh zd=VkneEE>AqjIwr8zy%AcWS4%_lx!d;g}0Bmv;lC}fE_^)k3# zx`N7G4WL&PWcp+FswMPgE2$eEuQEH|BMLbx!14Kca^uKLG(1<;;N8pD`Jp@^Lb zU>2P}#U`i??W*yg>A$tH-*oui`3`v1tPupR1OUnS?k&1UVL9`p=U12x|@BN=roA z(e~RjKRX`{(9RhOLR%$@GUh3H1bIi;6o>>LLEh_mDh;JSQ>?+&CHJ{A)X; ztfFV2V6C-ZWwz67o<2)bdw(@rwxfWS<4ntIEQ2uyP&l+bzlE5CRVo(LCfA@LZVik( z9ny6hN%GFk#0X8mc@i`W)S#~-zGW)@yX8#RK`_bvh|v=TpA|}=PdPrD0deG`Pmes9 z1J-Uza%NbZzf{gJ7BJ=KNxhtWuAFNJh zUMZ!j5A~$x=;pYa^g3y$lib`L(PPewjWv&B&jIw-x!&6`+JiqJSXJy}(EMGP6!u`} zYetXRzmcmK+Le__f4P#UZnY({8*`yuv~ewM>|9TD%btD01Q07N(dd>)XXT4$78$zG zCI7Zn)ksk2Nu-54?TF&`by!_yub+HGR|2{>D5EAG1zp+s?jS;vH%AwN(nGQfDsE%5 zuwiq35)($?DFCTc0lK%h9yE60>@ybJ9?WS9#hhKVN+=Sk2j zLJDLOaO0O8VLOU*0&&M#$+eaABeMD^*i>ibOKX(+m4*6PCQHm$zd~`+i662Q2|}?? z6zyV}1Vmer7GlMo04n9=ha$E11p2X7Wss#)KKdYa2|A*f;>75cB8-|GSmj3L(l_RkpUs`i_m!maTO7Y zNJF-R4+n8BugID!7`aVEEz;^4-3pMFJjJX0+8Ln9JDTFtU%oI_Pl1sZrU*8#UxUQG zX^IE57a&2vTZvG@weY7>_n$BqUY(IJ*+z0p+7NlYu0L`6ecz7+MRYciPX^HO`o5s6 z^ePbQSIRmp=OgX02th5WE7LQtVIv02aws2fJE@&RSH$urYy?8c!MG)+D?Vl%K9yo? z;5S+}IzWPmI=VvQ;PWL0^SAo@bCiB`t@4}5OzY2ez}tK9-!L}>*}~nB>C5~df}~#B(m_)AAq}qFX`eGRXjg>5 zSs!^CJx26?b>;&HA`$TCBj<@`=vTlPO5asq5V3lp`N+oQN7NgEB%-g63!AT+DT~pY z+iDOBO(|wB``t?wU@lfVL0j(zoGCuuB-_*5yFtrT7V3p_AmF*EOBAki?t9)yv0Tf= zWFY`pL`b&bfD4&+e6z`Z-g8Y2m`BO3Pae3$;I`dodD&7l=D6qdrtqQK(6+%z0|zw8 z0(o4YSo9eU`SrxuV=9MjiSw)T{rkqylG$A7P$MuCc7I-?sdJ*iuBN39HlyR@OBO@D zwodO*NU-9lbV%qUEx*^o6Z){~JX$esiWN6~9`{{Ti|QNsK-HhZJNqaprpV*Q(glp=GRx{*M8 zd0R>NhQaNZg)@U};rAwrTHZQ>p{qMNh`pT7WzHX=atgmT_Q-wEFYzOnT4PE-X+j`W zQrA@Cfn*EgP7e!Yvd8#?_s~vYAA%sIdn}bz=u&)e|)_EJ9|@koHe4Cv(}2wof392aM_=+ zbDV-AS2HV*O`DY~dsR~HRJ0V}+# z%N1K@OkgW!!$9PI)aeZ25S2BRi|%Kl-B4qKMM$@4u;P>KU@y0~C$tGi>@ccZi>IzI zg(Z_sI?6UX;M>k*^lggp;UzkW^|>?`ULAI3^jtF$0m^qRB#2K!W0?|Hn>3QMefHcv zHigty1CYi@&sbbU$h%V)c2Kg33b8b0p-?tTXX_qE?I^WWF|sw&UwHf4-19x>xx*4e zi_VBz2{gXNw=2eFo7K?t$y4Kdm&=}Af>@xDIP4Y1iCjmytckfKkthI3Zrf7}U6?UF z)5^fAwgwtab(Q5rC%xdPL=M))DTKiYsPzZ51Cf)XqtcRK#5G?!weZWnR7cP^^Zg}8 z#_P{MXe3=W^%p!Ii6pk|PPZc70ACsjrcqP9VhPDz6BNov)F^Xmm`GySAX2~+$wJ3^e?zr##)^D1&T>&cs_Sq zY|VVF)7i7wGWM8z6KGY;?22xg{L=%o!`88ZPuNS%!P%bMQZZ>e3Z9Gz0j@0&1$xmK zD+gDB{8HWNo|pQh?nh-NEFPYTCPdn9BHVM5lDd*-rp;4I-fl?F>jJWd1QujR2_AyI z)^|^urz9b)LTI7DwKRNy`5gH}Ogm{Us7i7@lgQBFv@-ELAD##ByBE*r4?udh4#|21 zB5ZUq-j*#`PY-9;>&Q+J5dx}KyBIh!3G;X|=81~cBOz1S5+m%Lv-DUb7q%U1qKuR5 zy$!iHy4wPW2i^JcKRYT@8Jf>$Sy_O!c)UK)G}=Z^gC}CR5%H58{gIE(3&_+V!jg6I z-hyt!?5V|lo}2Tt1#=BvYcN%rg>nn*3a*y)p$wb5zq#kZjbp zL#>A96sjp17Reu(M(P9Wi}4Vq)G`O2Jj&Bg@t=$i?rAfTLkE;<4Pqyx+X(AIpvK0t zMThpTjqZnYjMw|7*6(F{-ot)WZt?gFqDd(vq1ZA>zn*zK`DOVo5=qCYc=z>V6<$qV z_O4r1xJGKjBF7t7bGF$Pps z8pCQP=OPNu4c>UuJv{GD9qyTWC6wXPtl%X&|HE3YKIDdjv~T#*)Wxx#7DabG8sg^{ z&P557^LcO=aczFqZ46bp7cN*^ruzwz)L9Mkb}G_*lfrF=EqO00gH!tKCN_pI@8!lj zAt$e2tR$JPlER%~-|E)~9xzF3LvUzv+Rv|>kg1Ii0UuR zKcRE$(X(jPwpv+MsCHV_V`mk(pt|Jn^qlgamotl&Te4ea6NkBX-@$DPPGwZ2F%NX# zW$fDsR^E|lel@iYRLIY735vt20rpG_$N!#ve9XPH&d?DP$QZO|S9nX%Vv`mwH(*LX zzQudoS5&e2reg0+gy<`%R8=`ZH>o|VzsQAFZ*cJ) zH9V2+BMDwfJr<1F9xCPT@|#UOKYm5oFRuf>_0q#{E*VAKeZ{+7&{KUQYU9rBPyN)! zgLDz~sYRhfLw{YA;&W@0a$u)ao8LvT$UACcn`I|u3%@rPj{XfAvlPYkNg=qX-&T3% z$6WE-)QZht(IsY*>cz&_Gf}9as2<^|3ne^zzQuu8z4waZ1tpq?y0ML?r84@U)^6|J zJ>!b$Img@dm`~#hnF}isW@-& zjmvu96nK<4XNK%0Ly;l>`)7%jYyg~)pet5s?=nkM(bUgX7yoy7M=gaNe`Xw=OND(^ zP{A&4uK)YhOgH`C;ot~{zHP=#^DJgkF7iA|MlUhEV)qrPHdU7Rz-Jr_+C!& zy=>uLF8Qy!-M{&l$|)3ZAHCd#72QicE-9;5{%gE`4KJ{OyPJrT4i8tkgfIN-B&0+m z57vIDayeJD16&oHs2-iJ%SDpE2eyBID7FqYs85J=Ad4iv^Yq$KSW&a}*xwe=-;u8q zr_>02GQ3@O@|YjLd;C8<*o72Jm4!PE>S_r$`=BT{>->c7W>?Ti|zROMV0>PYl3%&|G&0;lJ#RkQtir+=x)N(=TyY8a7@`s{B>VTB5hsg0=45Z)=HG|u_q#WC zAff7fcH?ej;(DToO5)b6ddr*n_5a}pqLKS$ryjIM6csV56RiZb`R&WI z>W7w`J01Rg+fi9sVQQ4@#MHS{uG?Hs^R>hlMfJOs|N9K4p&w16GaSxiX4A7YvK+bh z{qEnN?dMoSFybFO(&z26D*AZJNT;+mz(&V<^Eb-&KgR~>cPt=Grq%W;n`-1$fz&{B z`@ip~n3Jf8RN1COxy!lJ|H-=<@!YW}^S}519;9c6CZ1NaWMLd^tF*y}4E`&xR0cCi z&4#YdCUe!%&n+Q;zkPsa?r+XtRw0ZAKDf+5>N0i7eXl<2cZ2bBKdIeDU9t_e}&!|XDY4o*o z@ILf#6usOBu>P@h;lGx*Fk%-LOfSrtwmfqFqyJuAk#p?7&vAq-m>=N>lA^BG8vlK* zzosqa4F01bS^?+AD%bzX@PIf#1)n(=LxRTvdijrew;V=nqZ@$*=Kp3S6N8+KD{vP! zdU%RdpZ+#69SJDPvr25G;=A=+En~kIkl(s&9M0tGvD=$#yB+r=@A<*dTdRy@BzqDg z3@z~Vg)gQttrIIV)yNTOrp;Vc4lDptLxMhlR*4p5a^XQ>py0x!V?{QLMDZn8A)5KUlY zcD!-%Y7n~TJ*X&0N;=mP#$us`30=3KwK88F)iZFfw5)dlH}`|!h#AT#GO{)b4IT!a z0gcQDLS0G%%3O?(Joa~D|4SJxkqU2V1@8PtkL}wUhT{FHmdQS1Ot1$1Nc0F*C{wt< z=L0Vesm!G!vza3Q0^KtRfyDcjMH(SXA-oNAa0@~1yu105j%2|?x%)}pb< z=6%R8nu-JG#7Sg*JYx2Pc@h6WvQwvg-=&+$2-D0207VY{3~e1G6E*rr5H~T@a36l>EcG;erqzXk=eg2#+6^GHLTebzh1L@^g)bP7Nh z0YsV_h$cXca@*W8bXMmb1P$D0W)0y#(s)XPU|J;!%2W~7GSs03BE=~Lb-=aOb1A*0 z^Xg6Wxo1!(^FiCT>-!Kq7-R-$-d73J$kFB_4P#cm4Oc2NzCE;`S1GuOSsKRWau_G5 z3Q8%KJJ=DJhp1H6<05v()u#T(vE*SR8R?VL#(%M>VX=- z(z0?9;R0v3w0@%7Y*P3p_^4!{$rEa&S_FmL9Y8rNF6+&OgyAvsl>AVKX(MewN90i} zb5jTdc3S64J20T7n{0|@WKPhAyo7oetu!-}_}@#Z|MUxJfN)qYzsA!}!C#YWU6W@n z^!Py9Y7^(zoHOipY)Fo1@Ed17R=t?^qL*dpc6iTZ3r}UR^OeUZj%l>=Y9pm{F(v`W zKQFChce~~#3DHWgDyk*&-5`B*Jbl%DKk-Wy_dl>?2c#B^4sRp@U9Z^XZi*y zhLd=&g1FyV((>PsLkQKi(0b5g%}w%9{`p57G}uBq$*YKv=~Dq6%O{_yfsY z5W#yfMN1RF8YK!m=^#gHoZ*bn>)`?iwsX0Ju*7!pB|?`?@_kcDWt zqMk}oCWRpD6zc%!1mW8G^ds$+iXq#BDtS-zE`0eu>@~9Sxpay!NsycVysTa+1r-9c zx@W6)8c&D5_vULS(iO;lr_QWa4%P5}V0u`gwFmtuq`1ftLEAEUw#@5q{3CggE)+SA zRk(-HOXieS+}aCF4^*nh0UUp{&0?uM607$q^**zmQk(t8J-C2BqzQeQc1A3 zVg&Dqbd%xge8%mkCxG(t7a3#Qq!OU0i6-y%O0w9s(htwGpDBD7Ns2I~5(DN&Z78b`{pf_&;MJH(B zs7yNdKzh94QI=PlHc-v3>o4_MTKyHpgDKY~TpRQ3h)G{DbP`dKqXfHg!l#cUJY^J8 zP~PB;kL%JI#EX~ULX@fzL)12R*QXy#k?hdSKE`RYOnCu@^K2 zdaucf6ieO#>MXme+*=>KX(hs5opacJRe>M!xEk1ZovvvfcEKxTbmngb;@tu1uqyn` zfo^3}#tU?ldqzp*8^-s}3!vOA7 zk)6*Mo@1#htwNDdIo!*z&URy=5n`7jte+xT&*V6U`hbv9m}wJcc=ECQ_U8BFuD04! zd}*Z)35sop^6!*nu5p@-u+B63UpTDOYDiuCQy5c4#JSLtjp0W59w}#Mnu87 z^5@$&IM;^5hYt-*HE?`?TVbtlw0{buOyi&3o?Y?U$TGQP%i%bbHZc zF!3KPP|hN?`Hv{n>7v?@%&VhW#I4i{|JZiWKyb#UDc?KdNyxH0YqU%J0qq|92~qxg zAKPm+j1F(oX(L^<`SdQW&feU0wC+9Y$wRm{>fYld)0fy%J>|DQKRN#S`Q^utW-Fkj zm8+~uXCg02Lc+|TQuxIW`1p&R(n}^9jdX^?Zx9xtGNib2dwXDVPcGY0o(`*U=8p(d zJr5B(HwZ`fVtVo*RRohTyBVPYqKcO%=2oi%dTy@~zXtZNa2Yh$=F1SvpW{JF^Wzgn zz5@t;Y~Zv^TOGbliu~(M5VRo5EnmIHR4FPK_mu;d%A-#o&@xTyDt^M@7vlxda`o@h!Sg1Z3b zzbtI$`HhK(9FNj=*>t2!L-g9wVI@Z7Lit=P_?tu?mQH=B0IhJoB8bK(f9 z8mUAYjEq<9^lZ*e?B`f*TpfH7PN#5`FoSn9ZdLBmMdlGKzs;&Ea$eosGWD9KB_`SZ z;V0!F+kq&R09TchdqRXLHR5tWydl4SV!UfQo%&H;FUZY-Khke-l1aCXOpZO(qYv81 zlWZbM5z`q;)D#vcgTi&HK8ea_0zO07Rv{7q4u}MUeh%;AN2FC@t>^1)7a=+ z^+A#R>v_!~SO116D0yNIQ|>-U2y+=@G?%aWWt$a9D7;7O9aB%fW=oN=CJy`R`@LzLRlIbRkg>a_UJD2$rkMtar zQiG>~`SRy{m*+W2q3^C*{mFYdl@u%dfM0~Y7nO(Nimnt10lr7KmSj*+v`?dF>$ryB zX#MGgVxB?&<7tb`_zUSmMAQ+p@tUk4@S%6jz%{`<&I%sG*xNTg`-eZA zc->_<>_&1|YFc^0!`+UPW+4A9D1@9)#5kHqyJ@f7>1SNov5Jm)(n`h>ltyKB|H|x< zgQ%uJ2iL;q?Z+oSihql;W7v#w2D=Wfn(`9i&CQ;kTRiyU-y`99UEs}$Gq{sq-#3W| zUq@b9&LX_I4Z{2GzuA!AuOTCj@a94e4a@F_F#iA(`rjcOH>ny1fIol#=7AFs0`;J8 z$EtsH{Prxr$C;QSZYc478Tz_m->v`0g$m4&f_v8mNvHi&=I;;m|ISb(4s77w`+X!> zFff(pkv7)loDwR)%`%CzN@p*#nTtRIMub&_6zaJH*9M6LO&}>5+%E1sLj~(Bz5eST zS@YAiNGktl{a%S<*VeQ&kOmi!a;f7M34Bm9{4&cE(!4bGyRFWHTF$rlwN5~L&o%Hp zYoMRS3EJ77Ya%?Nth5c$=YFa#0Xt)MuEMM#WO2KCGc8l$wwtu}eTh9@*%xSQ3({%q zS)Z`?i2s8@8mc3-t;ONwXeKwP6T{o>;eOM2iYxE_4+M^hq_T{w^ivf2M*Q2LUJI>4 zQp7vpI#bV6U=~2T^Z8YbFT{qDNTYbZ1*L^s5N?tqJ^Fef0ELcj3xR(HX^W5zQ7<5W zd>u(c212LHN|QwAo`=edVDEDe`yL`cjBuIE;zI{^;W_>c^T;V*?bj-F1Ec=ldkC^I zI$GP;vLc1O5K)aVW?7V(1aPJc`(ru5E1V zu2f~|irndajbzLHk&g996#j_og!aUB*8*bC?_2zG*r;YU{PBkBG>a4SXuS zYik+tz5go`EFdjL%ZoB?Z<^11uH(F`Na*HReh|sFA7;~+>hipb0%_JM4EYOe1??ZJ z<#+SIUnA&e*OE)VaGwfVa2A}wX0iB_c$j+h8&yd9d_%-}=7cl3mogPDLrsMRK_@GU z1xTkay3hkiCA|q!3KM_IcU~kNf|z%0t8>X?8QakBmy3e4oyO-hR+Ckk#OP!D+b6m0 zvj~b1405||x@n)fZ96a7Ri6^CO-!L1lf@Ae)mlm;3$_X^>b-LAB<0u>GRrQ;PAv+{ zbLL6)63OPNk>r~e!wIKTh6F|r?jn(!Yqcd(__sY?)*f=9$n#!Xi9g@=&B5g< zf^W}PJjb8loESbq3w8f@P9=V<8wyP`pxf}|bgoDQORfs^(|MQ{{o# z&S_*rGzJf9Gy2tM@*m8%B$g&TPjCzto#G#>4Yq6J7!)B7XH34?_k(_lYF0O?{>idW zyK+df(0V;Hx@p}p>DJBk zw*7~M+z&_e6Oj+?PUo`~Mtl-xf6?g{FBQ6+e78>+4>4Ow!yH+A^4) z(_rVn2m4F@Cd6<7*XINj77>4f#?E}+ywG>){qe_W7I|BH$T0f@epR5t6I&t%(V`tF zM^pK@r1CS-7J=XT0a8sCwGVk>@Lj?FHjHRodkb}JX!9(}4yMPApq>z>T_;lqtjgmW z*;Ld!--xVq3Gb+dfI)i=HL%n^F-S=-sq0qmEz)#H3A8<-9KyK4=;dcp;D~}64l!oD zAmIv1qaeBS8O4J!*E~gkZ^>DM#=ax!j$$GRKy~oMTnr7&JuIV1J(=Ez{)Lp%@`8J*LtWcGpwi&nzhz|MKtQ2 z1kfq8q!E-XhGpXX6}d}N?Nrnr;s{jVL|t1+PN6n)0Mmb{vzVfn#WIO_ih@Rh4b20? zj1?Pe$U6+OFbuZ+XE)^*p4jT721(?M6(e1;Xm7Olv`Vo)P^wChVetP!jaxpqX%DXW zx%)#Oer)SbySJ?JNKS2uLZ!@1jNK5ubNAK78kzI2%52-J5E{F0}L$9Q5$2*yJhnL)B!k)%ftWznLO<9^D6iLM0AIE_vv0rzn^pFoU+|UnTbWfq_41nUsVvM_rl23icpdn^HK; z@H=xNIk4wgbY+c0Q|5_S6DWMsIn5@SE-0Z!(3jdk*??B}w72fLKz>X*#7#T|&2AN) z3LM8=+UE>WCsyKd#4(Q$3XA11j_talP$+fs8z?qVl9jmn(C43{ z1OH`lv<9boR!isl`H*Eezpoa^&lOkMBN!A|J23(YSQaXB#COnYs-hE-ubaXp+#%c3ERn!NMG-hxAXR0Q1%Eo(2)%SVWHiPy`Mvju6pNo;B$7rLf?wrFe zCF!tLM&chd`Su#@QwlOqeh~TpAj4SYyutm_t+JZeX>qm4CT|LRV{&j}nFT*HU!cQ{ z+>Ud_0?^6_X4Q4Ux0(S@(l6G*v0f;txu5)l|Hq|~?ReBmf>H3@JoU%cdGp0DSz^=WjcwqJa>ya;5KoG$;liWU!{)W?rLWVY|9i%&mkCqWGwRB;F$ z&Sb!~laf9jlooyM9HC>ddciNMeL4-l!NY=M!~F^|DqQ*)+-<2X&(} zDGHc-RTzo1H3;o^6=VB4e=6pM4@B2s2EGlyp=%h9t)?ALBqb%12B$C8Q4Tstd^vrRp_%PkLYZ#{C0cI!kf^@Lk z@YR^iWUe%Wl8(A{qy=%^a&%t9qvaHX%oRON8~vUqfB03TcZ*KD^@jvqV9%8tYw%~| z#@a9DsE;O$=%1$=s&p?(Yv*q}GgMjjk+9f7Dn01Zx=VIpt8IhuY0Ia-R*}0(#}tC7 zPj*b@V?1(-KR;STk!Sj$&ue+B#z~cF03fu2KI=g`OYARK-d&-Eq zvJ%K-?Lkr5W9o{(4tAy@1mDTB{pHz|fGdUEo==<-)15w`!Wuhh^XvCs%uHs z8D=b;beNSe(US5O>+@u6t&ug)(;6uE9?x!Q zdV&|o{Hi;^+f2OJHbH7Ni-hv`*QsZ)4jr|xw@_98~RkZ!`DCfpmZw%3*DP(tctBXZQ zPC`mfm!{K4Z{oyQyxboV4YE*mQZH3l+bwD{qD24o@r!Nf*4uS#OhqMfJMx z)j&z|>?$t1o)c}u`62E=9_--3N8&Z`L!4EYDOL=93Ah8X*CH=;Y~)~gi(Tz&_r8P)_3b|FDc>|gUC3-u5KL;!tBTYr zwpAIVv~(y%R3ig>zUl=Rj8w>U+J&g0E!78#`{X0=VKCZ}HJTnw4vVFs&(Ko0@!~BhPd>-(Qd7_O7vCdnw>9tgj}ki_OS+~TrruQWC_vRl_+Kzkc?S~iM7I@NfXZUvNO^A=RNev!fq;M%tNf7di9Y=x%&ed5=T9Gv0O1hv> zTQTvKZ=*tq?@@jNZrNPSTconY{S**PFRba*amEhtyN^DX6ZHr8Bl^ny%FRPC! z$`zQd#%Oo}8R2%ytA^zJunib5*#S4Mv{2MfQ>C%+buST~fo`7y>zdTTf*V)q_-%g@ z5E&oL#X`=3$+agFQ>>HwW8!s9dR7ipO|@Eem%lrtqlDs3n81c{FZ(nF8bjxRB_Rgm zz)~XRfM*d~4(1saJ-G~m6(jdA&o6gD64?o6nZTA@vMl~HKvToBn7UVUR9j14_ZXv%pcaPA?*T!A1#oiVHA<^_A{n@>IGPp0NfHX^-2%b>_sZ8ZIf+lhD z*ho5TgaSm5&X@gqX(+$V;AgcN1$$MbB)Q?9HNn)VLRchZZ1+RR+QD7z1<*p#c~%U~ z^F^4?NaxZ$4RTea7jvQg-8ijcK~D=u8-0Es;H>j1>p1fm2uBOIUZ^{hXFmoU@4O@m zxhR48dYLbADeC7&Mf$j}0`aas=QjipSvcT?vob3}W|G{!;$ahwwz_PcGbdXu8=M9G zCEeHQ_oFb~e!!!Bg@0iz{EUs+7d{%=hswe!B{6eM?rOQkTQ~Dk8f^MnyX+OkS4do^ zAv8Tn08-ZUwAJlbnu+=%5GEfvIfol+8OXfK6 zTi;&`{g!!HCkrdMpaak8 zefj|ajScUGRIuGbuz7;)Qju^8Ogk@=LF1c{vUg5e`*l4XzQ|Rix*NjN;YyJL@4sRB zb3p8hUvjT7V|0ZQu5v~L-dCj^UhIH9wsbo6*L z-pzNSxGKT)P+X9FDs|bl1k0hiLH-gY^M$KiYy^VFTUt;>6M%47Dr>p zQT7NdC#Ox)5`aI%|G4dgg`w%i$%GUzg>ux4VJSkrXfq6f1kRpc5PHUvqK6>3311_KJ{#x z!c&)9Z#nT9Mt2hZL+KG-$F2y2r^FH0^aQ~@mya7ZEhtv1wmYZqJ|VY6e_*mchYysV znY;^ZQ#+RzWl2O+&~0Za(&qSOKkWrO<9FjO`klY5N&zCwfm<h8yd~eKnc%#yq&+7(dC^dPS7&Y;{L|YtRt@eu$ABt*_`g=Ob~LCSCNvRnpmzx@*xc*GK@Nnbfs75th`^AS zQ7}mR?sT+d8=VEjBDPWTxVz{_5+rEkiwqjgs0-}G63!}SVkYDsr&jfv78dne zP2uwd8MLSEA#7py!f)2)&wC0(E!_jh_pudt2}8SZ78I;MdrQiAU}@udVyJPaiN7|4 zj+mOH&(eLvKh(pXxJ)1eOtPW}CCAkDI!_lyr*5>sWmU+^14q|9jihe{1@?3$zAV+E z9cCV(*R!r52H+}T*+9{S!&j*6I^?V`6Ls%x;9zw5!z`(|k8JswK2QM1gTRz_qoGy1WD17Eb0J9Qh+# z4`f;}N^OU6_kPydM;9$^0uSh5m1;PXyQn3Qm{fNuvt%zb3x1MV@_Y#Wy4&MDR2jf3 z#e5KVP*3`xa_p}RfM8 zH9P(_GXkPd3j24a18%2NZr)bH4uo~kP6to1?TA3^7!9DjPC$GrnpkGEZS#MOUjbF5 zAYaD5m!m)M7;VL#7}X0?uF4ppJ1l=Z-jz^>*x1-O!D%aXCr(tPOvZZ%4iFx4OFPm7 zrJ)rEH%TMo!+10;6t-xyzf)O(j8zz37K0hyOT6J*?2%hsQGd}|9b*=|p6#?vAoU~H zl@ugtQ0jx^-_Y!y0UFk;kNJ7K7HpEWh3hzXci<6+448-MgsD$KNPv6tL;943DASHA0^_pcnN=O0?q-*KT4THXU79ueFDS& z|HS@FF8`m{?eFG)q_Gv;7YZyV11hVQVfI@L(VO2s<|u1!m+woD(XW3{lp?}-f_5XZ zqM#w^XNj)=6Rm>x*F5UGC;9G{R)I654?bc)V2=(6rlr^eiWJ(&1CsaF{K7*1_$1xr zp~~F{*KW2BP9*HqIoxT7fIUk~idy!qlZ&fr8Fk7UycZbj1L~Sskxg~MJYmhX&%`$8 z9QpOOzgA}7TFCTD#jo2;*_)a@xy&uup;7a^4}I}z*C%$n;oG|Gb}sLnHoK>><{o4C zlTS^@H4e?04o2RU}}Bta_j2|1g*>DPCo2^vaF+ZrZ?^RJkeEBT&}A1?}8{#9*kOb zReV++SRPRRqMTGjnf(On)BZx`V{x61&rr|qJv;YI?3v}WgU^ocNAJHAA%cJN&`n0~ zsVeVE?{5*65&N{MubjY3C!%-%{^`(JKbN<-^0%QlTt5C;KY}cS!hQQ5-{QL=Hgsv< zzHNz!Jmu>TrO)x-qAE=%kENo%-rn6sbwV+Ab9?HWB-FK5HOfye@n5?p^q=td=4%-zT z9v-&K>}>4pEbt8$3p-=W2evH67U%zSlE3GBE!I%!mYxv|4_rf#o0Eh8 z_xJzDUv{tf&o34K`6V~kzrXzFFaQ0^`xaR9n;C<42@Bp< zaH8$N$81+LiFJBoieedYBSjPg<112Osq064&Z)h*gmQaRRmt!Y0YesH`D=Dpi`yBFu?e=v%d;&7e&cD7kpgPzWMydEwgtV@BJO6S$ z_Vq~hK)uj*)@eTL_VULErdH+#-zS(J-1B1$EegeB{?pVgeB`Z{-o+IJ zY&EL6#-U%nd{GKy$1*bn6 z8nY}_;rTnBiuvY4VwA_)FaG+mdt1mSGBf-yk6wKzPh@x`J9%97D1nXgE2RwWyL{G@ zilzcfM|PhL`P8U{Ne_C+`Ng>W;&szloyn}QcW(c6zEISwjzg!oy>(5A-1wYqiIoa( z-9EMVERnY{S5)HejKamFIh6PR*BQLe;ky-*n@Lmc8JrgqaCEeY&7FA9VUahO1OgjT zf7Wcf`QfLNihY5U`U1LNtN&|o$ha@!$k8^76K%N{Mg1;}>$WB-oqb%GW7O4&rc~9u zpD3Trs#cIUqeWP<^7yb|+H#+Z(8}fYJueXt#Xu$^Z90<8r&Vz$B1tv0i(_Di#*5!+KYsVKtcq|Hre1%^h&vrwTbPjxau66)MH5+EqQ&szX z$5r!S4js?U361Rx^_R`inW=UJrYf3ij^5EQ=;)LoFr}ZQZ4%K_MDOQv5bu6BQFuqcXYJT^X)VC?J z#r$@^6vf2cZQ4)E&c>`UK0kEYygZ~+mM>u@n>z0W>Ax!--WFY&`Ov*Ym^&zsGBfN+|GMdo&K0>|JAM20o;9xRjQjGMk}l{%4g0Y-rhD#_ z?5iz`z=moj?8?JE=c9cCS3h_3(BAn+CF$DFI@rT;+kMaZFC3-K6TS6u&wXNO2Z_kK zu|*CQFZK@DEx6uG5$-*2o=}?~hQQsX{=}8N11193J3@3|&zr!x)4`C>O;eq}z2{Mm z68#jhe6kNBBn8TU;hIXG;G7hzV9jJ9-7%UG!kzPCT94CO_-D@uWqLit^_QhQxR{xG zhUoOH@Z8lCCwIT~gy3tpFkz4}8Mhif+Pa7CqA~Vcz!gsYX8M|UbYAz9m0NhN#P)m*mvMiI|M6T4{ENQvp1i$ zzc_L}NweII6XH(cWJZnQmsb>=nq_#D3q4kCYOVPeI*IDV1^45m%0q?Bf4*Q*&ieXm zxYl5>((Csk>ML~mfknX$LZ-S4Vl)Hhpb_rh{>3hvu@U=Bn z!=x+MB=^o4yU%E+PI5j#{LE>vzdMI-3QU4F%S_fREG&T7_KdhahmkVXSP(xplomykv&N>)|fwav&sA);&y9woHoEDNpoCDgl1;u-K`MXxgg zs{MYdbTdWsp6eOEIO_R1^7UgKCCUerlrkk&*P4rFU$d1EUd`36I@*<`C#xxx%q5?q zswW#OL7GSnmt_-~RyFOB?V#beHO=r(Rx4~hWB2pO>({R>7I|%^LkyilLoPpX8!M0! z#<`f6tC<^f=+tGwI=i6DnZHKFnDO{epdunzIXX{pYLb>r0A)Yu)FjT;5$&(8Kh>F? zNy3^}rtUCxttON&H`}DI*N;_AzbRHScWrT^5KpJthrv(4!J1mYK5MG4wD06KeQj8X zX|2gBD(MfuOu|s*yubNeImfVrnUk{>Tf|y8$zC|{jJi9DP9j8iez-Q19b28ZWMx_# zbZzNZ4Vwz2D_9`aRCZi*3CbD9Z9P|4C%*GOk=xKJqx|L=8N-EX!z z`{^*JPTeW4R+;E~fhjE^zW9yTNRBh7Nq@MVAA_};&L1h5IzZ#t@ai~=e!=kfJ2cr` zy|$nHSX72PrCmSRC3pxrt+m66r>f|}Ei0Q#O32jZfBA~OzwtB)*0=S~uSfi^B+DlU z@x}5iOm(#d`#IdVp35Hz%Y^vUweK*$COlnkY?wXcWlseSrxxe+DXzk$PJgVJXQIDTQ^`lkEf3!OlVp>ya7ui~1A2#f3fQH7rYu zZ5nhzA1dDGC#ZSUWX{(+00eo| z!fV}0R%QH7X(9Ws?uGTZNIW@QzH{t!>9+Iy_STq9XQB%L6uLYbolq;k!Z4RVi<34T zFR<|QrBl~w^$C1fz6YBWzi-J9MN1J!k+)BF=Qk}>DBy?OYfDj6GnM;ro0OVe`-Ri$ zkpFaTHtHgppE!%$o&JTiD~D-6rit1%wK?H_%}GwfQ5616dwaT;+S2S;Y`FDvp9j*^ zP+nwN)bUjMv1u6hxoj7cknblwsa+jq)Rj|fzc`MiV3Z@&enx(RUbiuuc=iUilsrl| zg!mkd!{n91pKnFQYBt>}qn9WY>7`_Y?|7ZD!uMQj?snN+RG{WDk0QC3n)icPp)%MD zbrpS@IAv>NUQ#7n-#4>5m@9P?CS!^+6dtOxO40WyWXV?Hrj&y@jk>Ma4I86gk^~f& zw3Mn|)mUZF?JTm(Y>RfdZ))FbH%eH@{(4KWT84jhlZozRJ)wOpAU;5}{Hlrx>}ri1n`C}k{P z?yxv?#y|0!(4X`~CPS<8^#i~tTpXEH%1WfQ zUmkmzFjV7TkCm}h$GuSS!7-@jrPY+!R+8Js^+^c_UPpV6%i^SJ{8-e=`djYPMrmHi z8_g^2>z_Xv-npRuxH9@%IJ-D;o!e`al7~XM$Gy1Ki9B}yYWD;disA%GirTyQi5a22 z8@|!9Zvs8z3F>Dc*q9sX9;{YeeO)0JC30l@Y;LldZu}r*xhcOEd!vb{x-niQ27{4W zVWrE9$xFtio7N611JBh$b;9f}Nv{XV#_`xw_`a0G#B)9#In6KR@kvM!`|=vA+60A% zf<@bv%`@Xg75z4{YT3s&lA^W+*C!5m)l9rr_=D<1m;p1jKRHi$%fpr3kodS<)+xz) zI;Yd6-y}@JZlXmN$6G8$_yEyl8?;%At`${1Ntg+3GQgqGs<)-6s8e( z1Z)`52ggmm_wyL{DDtylq@BALea~0bJ8IG$g}=?zUI7dmFy#N;SN@T`Dph5w}aT&{RdCawiKa+)rLMa!!Oqt!F2Ume%(#Y^)be|FSjeyR!ll)R^A`L(5 zrm;gkaRF}r@E@>9K=ANKpC)=MtJHSxN7>Op3@KC&5H}XW6MNhBsUDaMTNNEtH(zwC zXE+~|L!oUe?8MkFd#P4qLACv7)jKt^H*y+P9ySocVh$glb0cx-D(`wTK zS1{yZe@3c?rWmh7qq6G|Ho9M_FmPx)11M3qWKT#jYxMj(4CP4U{uP~TD;QSYHJo48d5>ewp@ z;wCCny8NAO8}}`fD~59$%u1hkHrUOa+;&>xTd#~ZN)^w(^B?AfHj((rs~*DXjB%5F z^SAr25|C$&9Xsk9I34G;f#%_cZ?J?8%Y+cj$o@2Fn6jWnm#9X$RG z{|~l%OSz&mb^q5Q_udMJmh20Z71E9t|3G*o^OL1O8Ivc|d~;8w5UB_t{gug~n|lv` zq@c|sQFvv)i+14?h8$px@LcT!-MxqN;Cci1qz~_4PUH$N9zq#IU&3>cbkAWz1-PCn z!}!@fMUONrNy;x=&)@GoJb+Y=Ou_qJE*`C8snBaOT^*FXHh-e>28M!62^a3XRt5Bn77z!A zEgdJ@ukfu;W=<8&*O8pk+Qr;>_)zc7Ik;kch?7)u>w*BJ>skU1tiD{{^XB{=!|~>L zKRz2{KFG;a?i_V#P+BMggfRk$WGwWZfM<7XOz)wXYxpm6vfiMzCpgZctPLoQhdlnxMlw+P z__6j3?CVV^7dTzE9GTRM@&J(4RQt1;Br2rlO!pM3ARHd>Qk*u^s?rerlN zw3)FU0pO&2n%6Q7u#HNtagW$KlDEfO61zN4^G#;Asb|71bn%RYX!)y}zjXRlMTgXM z>l3M^NeZdzklRZzn+ML=(q30VK+#Oedfh!A`T@Uy;jeSc+veuO-^MC(AATWr`0x+AEc$G&40GMFU|1#-KjVXA!9Ff zThw<1>V%DetaF|T5Owz7;+nQ~lK>3Y< zUe*cyd@E_!{T`a8+0vG^}gqAg8|=AI?Su5Cs3v*tOQ8?C02_R3#k1Ad8h zw3(ZJcf~SL0z;8cr9ew|1mEf0Bku55cKv1el%E+aVkSfU9>D8w!bxbgAY@;`{mCTAM&B@GTh8TQrl6r7kW_M{D?Iia4%s_U8bo&Ap|T;Kb4OU6(b8620@lw2rudV{=~;OKj&J0`ugTTf>AR)HcNzxD$IYEbO&t3jO2QZ3_Cb zd4IOjjYa_zE@0Itua0*&yuXQ50$H$(E+wSS-_4G;Q2(yLyTb9d*No*#i_CXYYRCI>PvcuoP3=%cO7~o6@@r&rgRB1K_b`tjyw)Vy_}Tp%?=XJA z9sU3GT`U8>liq5c+2AA;7vI?DTbIYi_~wSc1!}>XwVDruh~%)iBulMT>3MpoNmA%y zm!a}vs9|i#4ln-$qU_2w4DCJiCGj9_WWfWSn^(q?|DXhDU-<${z2(zpRV_7QBaiCC zj1YcUza=5C#86GcUC?>McKPD?J32{;ck#x(MIBH^1{rqA#)zc@n}0#&`MbXZicuz< z6|m8Je=nFY$_)eayvMRhe7bNLXyK8P_H~FR98Q#~>q}E=-dCK~EE6?KON=_Rs>tO= zYsw)88m%wSvF*F#E@n+s!2m7X+0 z#zBueNB>l)IS$LllzEJ_Od2IcYPJJUa~{>6oaieprLK3`Uf19QB4*#>HD?zU;w+zd zW|^oLM(t_kwQ7{(qRnlo8Z^30e`?mwA%6{HwL)tvt?%4f$&q3q->&8Y!K)1ALbC4n zNcjXg28V_3cWP%MIpumCW&{ixB5-4cc%_?5DzdjF=kwRb6V=M%G4oJnayWf2L|LxN z{!LrBEQHo;{g~xdrbkGhC*y6}s-%-Y8H%Ds-%x&)2VtymeY#K$FP4=&i5?R#{oxrY z75iswCb=Ag_gGJ1E{Q!PD6LRF8|(6#GTc5RC@yi|TmDnH=|Ukua;hs+$7|vP@awFK za{V6+1lK1yDBbO}?k4mGT+vDr59Vym)RCkXbj&-=ZCZBq8Dxe|BqP-Lv*pf|Zuc@O zq)e{y+s;PtrP9hftxO!qjV4jf*2lJKxD@LtC6wy+8HkquXpWcd$t%{JOD)|ZmP?g- z?-rbkx`uW~lN`6a9)-Gv)_bpNNkdM^^g1>@RWbb|+8V*@TGHEV`OCcyM3bmS!#~Rq zqYStuI{Wg}dDD}q>O%r^pN}p5d?$&B1ma5c=;M&6?tYbDJcU$%-8|S)i4g8LabX$8 z%A9fY#JWX|P((8!MG>c6Ws$IdBsEVVilAF5x)tuwJF4B*rYZ$Cl+n}6*@OaiA zJMT%?=BGf{oXBq1%YV(Y|5u|ZTmBV#Lix*+6xh=(I%%)PC@wG(%A3Y&uC0!Qa|z6F zJ^V~)V^{U|q8eUePG+Npci8E_LC0GV(!|)HL@MEvixEROVqUqF{Na9nDRu*?r|bFW-Fs{YJ#e(5 zBR(E-OLK5@EyfX}H)RTJW{iCq@87$;^|SLAYpZSct@{^kCy9MrR);A42b$SsQ+-%e zTCs}@*XhgK;yn9=tw!p@XHZ(`c9;lOT!rCy! z-y9$!jtf{Ry>VbGD|O^i7QstU&%QH6Y^zdSppO$tiSzU?7fn&0NN_C)c#GbQ$<%hsw+u2>GX#?M$OhTV~IYl7l}fjaS$Wv@$}f&bsC5YsP* zUe$g)2K1p2+V*sF7(+DT9n~*B)jB*pJ`=eL{<28xpm@$zHc1Y#$u1T->;w5 z)6n!l>Dy8a8GUd%nd zt2?S=R7_b_n|kykldPwE04_p264>Z{y!YX6sQvwCj5b8|a}(kwdyfV|R*NQL^7uDL z;i29@l6sxQRs3&`!b9nugX;NG($!acu6IiwV0}jK!d{pi^%Br`P+BAXU$pic*pey1 z<9@YoqTX}#|L7aWoq99n*$bttD(;F_g(9SoWA}w1er4-^Klk12A7x0}2%as;X*{;}HEMMj}+7#&H(clBiI>G}C7S)r-YQq2<^^;B#}fH)mX8>;YM1 zez@ZmX9GKtU8jP7gr;L%@-NCR(io z71mVA`gA79#Q9?3s2l$(8^>O}+!l4}ms~_tS(*axxtQ`7N4|EVKmxhDaF(&si-rq3 z3$J;^H0u_J&2+cl`N}?*rtfdXHb);TIzt>qC`a)?_AiJMo*Tts@S5G>Zxu^h@E^(}MKG z_YcqY*0qN~J`s_+Xxrx^qoKGpS4pF?xwhEjAG%&I{K?u}>#&VuY-a@!X_H^yoFA~h zxx*>|KLvtFTt3A?0^Ac6Ot*~T+F%tZ7nybHLO36MBv=PApP7}l?u^TZ86T{Ak23_SfuCI>|FNAY51hIoNAEND8G}pf7`L#bQT{I5m@e zQh>n5>?bIIHQR!JttM)>=UyYQHO{5f$#Tl@9{nS463DSei@+ze5*VnOKTZ zE>08bGRyK#xVGAP;$OxEW0z!?s+ee;7T&1Y4f(R>tpTN1^vN2YpfCavlw%^q@Ed0b zK8auVTbo1isY#`2UPol1LU|`$X5vE%$;#N9&km*++0A!Cf%wC%1Z2A|@Ff`%qpk^} zy%~uKZDx9>++@@W!Sq33<+i?9f6>-`JP|1Lm@>1ija8yfv(U{xA$<;8cjZ?JwDYf+ zQcSgodix4(QVW$W%Ma~1NV@Fz9RgM=5(ngSWx2^EtO z0AiBn7akr~R9CUZo@WHc-7algSX8etoS1vX?nGQ-oHwu^;Z|(8XA>^IApUGVQa9B} z5<-~%{$S**iU?J6r zJ8g3pNTbs0;oOfe@`>`v3#Se{op;3$6ZrVn zgb5VZFpddf1%hLSyws(K@8RCEOERi2Rq@RfGd9IeYRHTf+rL-8wjaB7!xyq-UeW^@ z{C6ot_vxBdH?*2_{A=geNLxI)T((b8sOl??fx)dOLzLz4;>`MHQO@E?$58gr*dIeC z?~MKi>;Hg7V4f1HtRRA(MK3&HwjY)hRhu8G(J5cQE6&($e^;&E?CiwD_L>A6r672dn(3X~b89br0O$R$-!RX)mLr?Au4VB=h<=DDab2Y@rJ>wr zKblVtFz!4E?%-K)1!|?Ir-PS}h)Fq1_f>_MssA}v#`D0$A|Vt4z;8eWWJC>EFSHL} z{sFc}DBGb*HR>s70Y{%ENJo#_H;;8c6&DsJIL8#>9*Qa?reIVoaa=vu#q$rwjS6<{ zT}R?E@OcLIk|&J!d+AI!PWgSmf~q3XWr%56I8^bC_ zAT0m2A73Rm88<1;OK7Vd=o^cZEVq`RVk>S2nVqUbVr++9|N0XqLg2=Jj$#)Agt1tw zdNVkqu?_@}5-jTNc(RICh{Qc~^5e41Yz3o{ms4JdQJ}2_>=#5DIzYBJ1P_gIa?aL| z50Wa4mE$pwzV9pP)p(c1x&aQq6ffX3FLkwno6qK6d8i(pz=E!jR5QzB*k zk1wwaB~Ocs@9VtrS6_$}hPk3VO)w}Ti-XF(2cfTF)@M9FWB>J0U5Fl#q8R{HyF9ph zb%iz;-XSC}+Qp{Z?77E@D<3nkHIG7ht<0~#DRJuuu#*myJCe|i20lKOrszfw76T1s zT(Y+I1b9-V<>{U&D4Q&W%B>`IwuQD=y^vIQ?R%W`d09LwKp84v7npiVsZN+UMi*xL z5%DyN2VG4+EVR*3$1`#&5rWQFg9C?7>27Z=m#TSl+AruP0#(+&{18GV#2Xf{rDgoJ zrQyEO0S7nTS`Lq@Z%Vad(I$m1vbi83<9Xi5c2v}_JMr$M|t)9?5oE3djr z!eA!>!(`03_M$gkt8#zLA|&}Ppi{-E8eu(D)Nv2Gm+@>rE1ACD=F6tV@L_ zq?Y|^RWTu5aDjp&kUa+k0-M8ECpxQrnG#iYP&CG&-yKIO=TL4uax8Pj zH>UdFcA5g~>eC_HZwd*B?nFgqy`TZi`aG}>=g&~hNjT4zACON~7f6(ge@jAKG&r`I zAQsAQtsXBE{R*MS5mRNgBf_?!9id2waUTX5z~sYij|`Z2?M$gfKio9YpM+nL|Hddz zmDSWHMGt_gvZ~>y7_}2NVz}Jug&KfF=@2`)x!h-i`>;mCWvtq78%K&ZB`(TxmlM98 z3cZxIx<)DRI8Lk+*1)Krg7enu2rF5mRrRo5Sap!ykjD0!e~lYMaP<6Eq_vNS ztY)%(mG8#tyb8j-n#S8#_m5EtdQ=79k!ho|VY_+O5xDSP8SlS&ml_|Nv~Xz?mV|{8J$CrE=czGv*=i|@`BK@X?MWtPrO1C%bYZYiBWZvIEGs(udlc-+3jlN8r zx9~Io)F(?C$H=76;a_0f$v@aj$6m?x4Diu#tnXl8``Q9PK?( zbxCn{O}%})ea3f@cq>b6Gd9_bkuOkAdVh^eZ)vIlMUq`O>v%0s ze9n#2ZSzKq<>B`dFuz(9G)S%P_6JPA872#{BavGvB{fmK+d~qnK-A({de|s2MTjGw z?QL7};(_GtHWs$Oxdd~I;4LJkaqhsv7u`pBU+%}>&bWtWjy>6~$EqF?ahUe*>oV4B zMdaQq`*Nj>_J=ReI9M#CkN_y5TRwTJ`Jw{XN(iOgewxF*%N4%O#j|w>G-91xXgZf> zCLHx$te$j6?I<03i1}AOBkOgU9x*+)Ea$!JHC3X;d{Y=+y5 zepWllx^v#fsOpnrO>~dLDM+r-IyvE-|BW zM|vzUt_YXEmv6&BZbf~y#FdQ^o&ulhqi+EZ0Dz0;1VYi(4g#h&WPsT9m2M4}%@!j% ztM6dad&g^auk!F|UhP8bDPmQJ+5YP)S-R4iLbik2BRaJ~L#%V^k5jk7#piZ7wAFcb zMYb_OFhQ~J<~w9%h>RCVRa*6dA?*R=YT5plL`u)9v2RTibn$KPdYYnA2D$$rohVNL zgX7$d#He`I%TPV5q-o-6!vwnE4s=GsU7RzV4xZv}0I_JOca}{lbXm+ckwco)7HB4*Ryj3ab3(obV)wv$)a+m>U*gH?x9 zz(7dEu1kDS!)}P;uV)fml3LISlZLqeAtz0S+Vq-fWY2y+CYfh_34D;?r?lDRhfO)_|ZmLPQ(Hvpl zsqxVntkLf3wAPZ@u9mTy z?(RV7I&(en5euyJKb|hsy64YogydOQG`SycSK-Ws_oxv7qThMpSGBNV}UP%BjbjFkEksIf2}`Kw5>BXW*i;G-H3yL9cg z=O3yG(@E%^FG{VTEKGYJ4QkPl+u>_LK$%c#%R!ThGZ@4$Ld3s-XVga&B3z)&4?qx^ zBy2?uh_eAKkaLF$zjZ*fiCROPYb6tS88{c)qD3hwix|lA5Is!uDyT5aF(pcwk67tt z)QZy;8lwA0KmbDw48L1GHW!*w?xNLBX1YB!8?3m-j{peXPmlkO$ z1t1!mGVZY4y*~>ET0x*6`&5q+AGdP;>V0+zB)3|Cy__a3 z?44bI-Kl^_u1Ze8KoUp$9!OF!vZi(b_C6ICbA^HLCq;{Fj8tGHnE84ahTOfat4CtO*2ez+-HrZNv z43CDF4o7Ug<7g`KnQJmg0~@okN=E}QW@SN~M*7g7V%26lFF74jG3L?b&~hb}UW*}C z>XQ2DT49TWCB4Bq=GNu&Bqby2G=JM`b_I|q5sXRM;vgHeRAm8a{hLxk9pC2JUP6>g z2%Fhz7PZ$np{XG^x&Nbv4>L2U;5du6c(9w$`n-*x^WbPS^+4V*BjP5ut4}Cxfv#g|~bPIfhC$eSq~3E{~&i ziN9r8%4kUkzZWZ7k22H0o01X4*lU)$EoI%C-@l6PYXYQm@hhW4+uUD)M~{i@*mex< zZ0sb`IJ3@tr}NO$)*~Q=;G^}b{cM%uqf%s-giTf!!}I;W5TzszSwqE+`$XJbC$Owa zxnipnRaUh^n*G6D()4nF>W3}zD6pHdnJNOE)oQ60H=huf9_N{1$XM;B2k$Wb=i0Jc zTff=F$@+UW#EZib{F1CwRUKPrx&x}86INkI5UG@~~p+TBd zfti*GSuI)4CZ@ZAqjojfb2JhkH1C%y$<)uSP8D$$msmU09~9s{$C@%h+4VuVJu%uz-jH zPO4nZ)AIC@P@tijiFD&N9nNCbx;`rw|$ilE5*7 zG$BGC#?w%<3aV)xaBwUk%>W=(PC>UoF5(je0A&Ojy*1ZFBN329L~2%V0KZ*E&86YG z(5_-=cW6aNthtFgt>!O7e!agumyfh)f<#tu1?0EJSCnkV0D`zqo4`#gANJoNETJEe z5IPOoP79d*cmj$b+bs{D)93O;11YmP(#oLY0gH5i!sPhfr{QWb_l2_1NqhqA|MKY% zg=NXwGO(h{O$qmzsCg~p#`s3SR&^24Oc0?A;U3n!X2I2Gc8>RWRlmf%)HYQ2)7QX8 zGfh%&@$>5gFalkhx!>o3q>iRl#`_5YNOz|eOgKvm8B>wnGC@QLpRG*P;|Qd^XXlKx z330y-@xl9pp{WJhXfhvud6l1@3Vk)u?xKVAYLeIk3pMN()&Fv=0NN|_c!?wA5UY?r z-`i-BH|Jg!G;!acKwEAdEt(Ok6AzHS4HXF3 zNq`=#L1XQL(|2!yYf-F20Bu^`zc|^^#A(#|(@#5riKPu(rF`O|0@=(KARs^Rbk*No z9)wZF7_p7Ulw;~#phV`t+p;T!qLTrA=nVgful;&%_K#Sh1&5`kna9W=|AXJd1YM#J z3O-Y^5pmztmHol5p#;dYserok&Q1~a;vp`o_t>*nJ<#ko=b^2ucRu3qtvO1x1!Hyl zsz2x2W8TyfKW&+RxZ@YMaaoc=w+54_j-jY9nDQa;FR_=2Q0*>3@OOX2o4_PmyseP-L4&pwQoCun!(jQlChU)>Y=Uc}=b@5Od6m+Y zuJs(iqT~|TUORz|3yd_7m9Ycn(t5VP{FXl=d%pBU(-5{H>>?3sD2I-Oo6}A|AP$jU zAI-R5{<{~z+opk2s4?a=pp*)MpFn!9t31JldND_@DMowZf{hIBI}{FQ;(oz359G*Z zTzT;E3C5cnTkS*cbf*s>EOaL+%ST{vK9+jHTqc}63@i8aGy~pxB0Maxo+6f2z-_!4 zRh-3{G9&(Gm{k&{@x#zBm_Sh3zO#hh9_@FSe*1QS8zoJPn0%B$C7pz4%mG;4Rl`@*TfK}RH7@E3A%{@Zrenyz(6 zVHu%W7L-^ZmxWzwDZU8x9A z;u7Qt6)4@s=a>3O&|WZHnRnk^>Hw8<(v5^Q4Pa&$bVekD9=jEvzLRvGkkeXFzJ2QkE0b7!yuQ#m zTWT-AJ+r+jL`hI1f(vky%Wea4nlgaV``7RXjI>e%NQQYBr5gTRlRjfaS632Fbwali z7f>t!d)thzC2svmD{JQh_0&?2OzLQNLh5U4Mn|bP1iS!nhA#H-Jge@iP z_B%b{w5LEfLt+Momymw&14g904N~1Cl)Py`NAyB7SinYC?<|nEJdnO@z7{jCTLBN? z{{ZO>>oNUA8iToAKZb4-H+`^C2kw1Uzq_~?lt{KLv@R)#Q^fcOb+!XdagRLmTs6kOeE*3MnqdMB3ot*F4k94 zYZw|P)immrybr_5xsD2@Of-k7LcDGj7iFXb-Goxj^38+0=N4rK{<=Cq2E? z?E8z(y*at=GF03wl+6chH-HYcxbEgs0zyqO;%{IXSjf1E&;lUQ)}kHN)v!rfPh^DK z5VpG|A9grUlTU#9id;?WV9P|0Y znuU~Kjn32?R3@fINCnQFlImfOr1q>KZztz{rD`j;|q;>eWZ+p$s=!@q2TIqJ%s%h;ifml}uXC-#v7>qr)g zQh#(8Kis8@I@u33-H};Y;YBm!caV{cn6B5${`vT$2|_Mv9$)%mDR0@OCQQ`IE-u8sQ#OttnSRUI>u9My z*ur6_emT~uR*g!;<@>ej5<3gh-sQH%oJ}JKEx9gY#q1~Y<>8(a&ZCcw7Ct1M*>U;I zlKgHs+PGnO-n$&_)6tY^Uwx9HJu-kKXhAQc+Hdu7lWx}cd8e(zFNk`*Dz0!``dh8g zK(%tZhP`P-y@3fld{QZ@JWYp(Xz;OYi}+Wm-mmQA^Wd@-I{yuK<&Oyvvqm(FV;s|w ztp5jgfGsEiVGT}RB;9NE8AJ9Va9YxRi=g2bF4-AJ~R;}Ov8?F?D<|9}&FpWiHq z(IFrck|HC|Gkrl6iLRrdwfJK-?3|Pe3Y2E5t)B zt@C|60=vG+s6xcWo~&LR)X&;8L$D9ie--VM&LkcASuf|~(C$c5-KW(kaYW$3GXcl2 ze5AbC{UdzBEI{j%@J#Uo?Y)QFVdx&nN+0>lWdC*syikV-H(Jc)zIRI=LKRoZnuGu2 z%;Q9k5JeGUuuT(+HMm#%*cK27ntlxaSUB2n=OgrQHv*0vebxZ2h6^W&H+LV87W$FY zF(bucGUrQPf9+nq-2ROl1^7D~$eWILl7f0*%*mL7430?dpx$O6d&Wdue{5LphUSE> z07U1f01@1Jrq>9RHk&@`*fz*?%Kofss>Oh1l;AhaE?XP_whTcJMl^v@igI@K{=;Vs zkzH^Q`(pM;w#9Iu&h3MyzkXIhO?DQcUmd_Lm$d%T!l^vEWTV>w+>!}Efj35rBIGl& zK|~I0dV+XzjQUD?EQ_u`-hYIe>-6qSzCbRe>8}j%Gy8%b-4E0?{pK`|I_^&hd|9i5 ztu9FNAiWF$+hze0-V4|=;QPae50TA^IAK>E#1k)S$22M{l?xpKg3m7W2|o9V!QBk1oFaVbV+Yw z33W8Eo70Zq%NAP)IF}CF+ys@}kt{#E6B97B7RVL}p6dZv9W!W*4{%FB>Kgap44GWJXJ5X4&4G4<3eBecedh^i*trcO#uGA{QAfKy z`A)od0YlQ;I6CaPCxiI9cE706}kF7vIbgNN%!RdsOg%>c1F+yU6>?Ke?cH| z8Cc^E#NQ(oXBg_Iq8}f558&U_*7{5?G!8Yfs4V0ngmP!`a<75Y+JagA#%dQ)3uWa$ z;QWOTlsa#r)Y193)EOY~F_N{Gs4u^$00r?hyGixK_>z>SYtZkJjc~sDtw~g08_>D& zP88VLjj0Q5eeofHeAQ{+*)q0SknRK|Oa-OLxWI$Bb`NYI)wVOozHnC*t4T-HjA^7e zcB5$MrM;lI5Tk;cl`mrGxK3SewAQtp`!4R-Kc-(=vg@z_2_H7yUm)>;oj&yU$J3ev zxSBr3|KX9;L4uvdO8XFH&o(N_9FnBvR``y{>S7O?xqRl2;SIOAQvPNOsi z7Yg;53e+XOk!MgxjyKR*k3ZjWenX7lMuDM-`(E=7JpVmvk*dIARGW}}`Y#sa2(TD; zUh?jZCq76==PKz#+r5XmA<C$c9JYiD0iEMx5^~%l! z{Q4!^TkGUrSTMI(gHgB4s&s2DaT6v8ZnL?&9h&V~)Qh;QE?GH)J@jsvP{&K6W0#_o zH0?7=cy=VQ3m3~2&R)3q$qd=!iz)+=z(A>ah^${^DHt|E!PMg)ybPiPl=dSzh)=L& zk{>LcutkJX^;-sRX6WzuExUldQZ_U(wWKpfGJHDcey+pvbPlu%&gZU97tVAdZbPsP zWCIy+L6`2*r3w!%poIQ*0LiWaiZXzZXVX>vVzmp|2?6O=LYpHyTEWk1v-53c)PL`q z1$_BcqdowaIhy4t+1shGzd>uHFbS8SQ>iEvEmKfrm}&d~U(Nw=fhuXLB1mj;^!s_! z6d>u1Pk~z{8+7jPP@Z9Pd+ig8VQ&~*&QSch!MaesuC2}WWKgE8zYA05^FYy5lL9SG zI7TkolZl`*$k=S4NBWS@(zahDI(TyWD^ol!RjX=Ch~?x2%uk% zOXA|(n02Ss0mxMS6HE=Si>c!nwqJGR~gGiGt35H^!2dwPKMj@1V`YPqYE~>=+ zMfU2NvCpmvp~FE0GLzWKDNe5o=Bh{65o1a>eu;9i)!uDm;BIaoqVqa>@gBi&+!76_ zIXZ|ML^+Dsh_c^X>{b&3P@6a23>7>=C`$|PW(oEdDg5TmD(!8yFe>dI%?DX7!WU9P z{$OunhB?w1(~$<|sNXxM5eJaJuoc$uPO;zO^sRys^j7#1x}1BAd!S1yBHo~AZl$Y9 zu_XrjpGZxFA815Di{Zj>Vo8V~18KEt8&2P|o8L+$rx;ZJ%Ikl<2al z>sT$3@U@fL-|cR#s8IE(1ly6UZO#`HrY^mfUXEr8c0 z9~-0|OdLo4lb+hP98IZc%2yzd^H2aWdLT?d)-@XM&KIHE*v6~QEKbe8B(t4BunhE* z(N__@QXH8cX4R?`Gt$8*pETOJ3cQ6{tAyx1U#wh1v}TP^3MB1dg?f_Dawb5IPT#x_ zEw(0*|L!*Auty?$FVtvO_k-8iLP;FTs(`D`waLK8u)=l_sUSQSmOyH^h8iSqmHu74 zJ!D~v;a?wiqS703u<;u#^clqeaA-L|W-A(dj)!pV1|Dt}?UOA-_5;m+S8WXYMy|dz z*)YJ3OF&^5tzT}WuQ5X5x|+JU9IZ0}HR(^3B-{E>=;4;IiUG7_b--%oqh2ff#pPtz zyG8~fTShJOUQ8t)y_272H@!GBH!w^80Bblh+k!y(71kZz<;y}bK9cSw4K&)Wb(aQT1z zmVd73ykmil3~u9~6%t|b^pJK_5Jztfk^$rS_ogw7;Q#ro2r<-`Uiu?!ArurTPc$v_ zSr`jG(=^B(pa-Oa)8rdM5&$XfK8ZKFXUn zz*lqs?5l8&IYMWW_&D>40rjyRcMOJBnE)ucNkN;l-E+HNJSpf3}c(K@9Ku|6%VfqpDiF_)$erus~1|NtIGkC8QBiKvI#AloF6`HjRP` zlG2SJA>AE{NOwqs64D?oednX^QO_CoKkm3+?x*{Wv4OSMUVE+Qne$gOx#-04Dx!1X zPe9_4XxmXd`>8iCe%kvX^7+d&@)=dhAM>#7CD<+M{&zShF3T%>3A{hjbOY##YVMMdwIzU;oo`^%XW zC*+bT^wM+SJrytF2?pN$F!Zm$idC<4f@PA!V4xr!sWw6FsR?&R@iuln((S=+l@7S< zaKeJUAX0Nc#aRGLQ6FsIdI*Y(VO<4*`~WB-(*ZomXucbCr4JmlhI75yh(hjZfz&2F zpjiuH3s;6v0t6}{rDrdgMGg&YWfX%uzjO(r*FFI-7xlgv1Qggcgwx)aM0|^wEhZZD zH%9DznN&-f9ydp8m0B+plrEMG-Em@T$S|_@mW<|Z-X!O-V`Q!Fv-k#tcScr~`_aB; z&ipK25$7i$i15KbxlzLXVVlxxrw+&Q#7s{vd^VcBF^o-L*hE7=raPr?{Bq}DlKrs5 z*opPM@BU|rocE1OmbPp^hPm2#XXu4~iQG!~^N2?x+gK;(TX#0Xse!^wv^9S&!&s!A zrM$tYTJlr01p8|q%EZ!H+fkha6{m5<=Ht?-xL2rSTt_7rnAqk(9b?`79HbFXIdGh= z00(7bGzb2-Z}WU!+F3e83+OLVw$bPIEIBmEx*cBjZ^ucXH4MsS#9t1jIfQg@!u z{fs|sq8oU5{;A=91#{Qlp^bb`lO!*r-lBTuvhPoAbL9%wd<7W63vR8tVgMrQU29hU zS)1-4NhaF8^UmevOIk}Ur+R6M&dmM3E=e?k-xl(I6y0FLS*X}HMn>}OYEhk`VY^wT zMheQvaTLeYXtz40p%l&qxn-!AR6Q%T7TAp3DUIWs0;;05fh5P}0xx@k#U1Q9wWib4MQFyp(K02&gXGvo8F?Rk zAp!F1pIf-L4T;OZRo400r1#unX!FeH@@j9R>KE~8X7LOvyHH5f4v?Sldf0elciWX{ ziB!aQPnAVFdhqkq$cgzfi&UNf-UpqQ#Wsi~az z!=A@(Jmvs1M4+sXEyt*2ffoDTD{uVhHI-Fi7efWgeK)*N^i@jXye)J zdIqJAEu{2Qlkx`!3wF$f5e8F}^fF%m75id&R=WW-w-Zl>|1*-{8WfD8I zj8ObmupYqL$E9A2X6-V&X0u|pWt=leE{K{~Dst>VjV=X3nLj&RPNK{3G1~kY#z5Q;s`O`kE)d`# z{bv?X(yz;3J+=Qp@Xz16iXNjk*bv!Kko*^ch>F`1>DjK0h3QNV#&)moCt`o^Uhsaa z(b9{%s}xzF>q*>j`+AmNh6Y6w`JKc9d3@qLm{WGU0r6p9=;ZCxIA`hcdwV0eaF9F5B=*EL0XWDHez%7U;e$W{QNz(&CW?Gzj|yW zt2}~FalGk@t$^t$8wb)s!WMLVbI5+gVMVf+$siI^Gr08~9mDJ&(<9d-H2HlfJ_smx zST6GXIy-Czl9@jZF6QjpRB!JdowOO%Zb=#~)v7(Y4cs50N_f}qa!q)w`O7HN8TacW z1dp@ z^CY#i*#4ho6F@veSOTuvuXQUNN_Pacfa`pK(Hx+P@LdEMvX|eC0UL3SRaw9_XK9Eb&hi32_pz-+ayb-6f}L?< zkFU!kfa?ge)Q1`%+a#R_zwc+zSXGu~N2hI?&fv6eXd9VR{QO)7N5AvgJY1=`K6{)B zNkuolu>*vFjE!i8hCohhw7U^MK%6EVN*CdE;1eDA^5L1P;P>st$^j^YV)XV=^Iv|? z_;Xs=bo2PW?xMsOqqOz?efHMt7d&Uqid_!WW1bFX(`zeVFkC6VW&=8`QX^pJ(oIGxke`Z<9x`~o@rojYLb`h8uoTzCX@lOZH*ocv@K6jm*Xw0o z(bXZ~su4zkJht{riK8fO(Ix}BaKxB~sIh1}LscfhGCimp;~3e70p2wo0Lu&}!dJ+U zsxQPq`XG__Au{#kZl|PXm`Afj;Wq}UUP%ID@4`e3R8}@R>kzU6dTLG0=>eM#F}gk| z>d2(=CK2_CA|k`VsL_7)9P1+&xirQ0zKgW{b=DYz{sN;}HP(H&XL#@feoQCCYbaAo zIdTDwoo#=)e9Ib$V|jp1Q0h05RV19sgqD(LF+Ro?q3@-6) z3~Hg04f&I9NOcJ~9Y+)^RA%FIKek8qjUo5*$$8R=X~IiG1Txz@Mcvsm?Y1{S9nfhi z%k%N-Xy0~vbvAZXjoa28>lb4(hBVdH4;?ejPW!w-YGYM=6t@m)V{X!}!$VmzluydY zop+Y3zqlR=&$z5=bDnN8+CJm@1u}yix!nY(_M-1&O#>-r3A1Py%*bS42ucJu1q#OD zq_rfwwu@9rp;|s>V+wPyLQM6Otmi5|pP0G+-dEgP7Ym!}z(L&8{8+XNN7Z9GM;$~3 z)vzQr+5LOQW#51-)*3>&psMPO%<9lqCo+rb>8Sj!IL%Hn4=&x68U6doWy{!4I+E)b zfk>aHEhTgTnMZNNafTS$(HG>_p(n_>yZCp$-$IOdlxY>-H}|NHxyt>$&!7dMlh=-? zEhbb0ERhq#4sSBXYe{(MC`u?G@LR+TXSG8$%QPkS|$Z|&>Yp{xx@X??t$a+urEE<++iC?ZhgpMGY{ATz9SM1-e__WZdTpLqB%br6|iwDKn-WU zF=DE-o*$Fx(B=eEmZzP^zo)17HkAL~xD+>W*DKkOa{P>c+xO`W&>1Uk zk9(v*5>Pn^s*GRHuOv%!CsaZcwb`j(04WoNM5%YZO9h2YqX)y?QEiFAT6ncS+&>VAUfN zsZ~11Qd&mUg_#cl-~KpFmp2}c*@?`)DJ$SWhzfUPTS+O*s!uUX=f%WN)R2ZSU)o0x zoM0>@4i26P&q#c;>F+}8ceEro)5H24wZ!V#WH$a-N%XV`rYFlyxn`1~gIDIw>cvKnUF0 zN0#Nc^ix~~S&kr=s95pR(@)Z!pAD#81dQHh{`Cv-XfaCdLTn$m*eYZrFC3Jb_bi}c zthJx7D#>$u5G`cn_R@^-vsoV0R}sz>?@m}!aSkDt>xrLvxo(j+XsR+}cLL{eFYWq;pI^`yLi(K9 zliG6}J0QjxdL8z3Kt<`W>(kqUShpw+3e@*#OKH}>N}e+7wUeX|QV6J#Nfu>nkR_H< z43gHt;HxS6tgl_Y$RZqP3u)Cg1Jf(X%$U17*&X$Xt54_FF{44L7U5Hkd!{2H(*tx% z$@K-ilFP}}$CfihS@nveqGh{sZsRQCoi^~OMY(zt@!awRzFABak@S>I`2l(z9ddj& zA%-%$%Z9fbk723}>~kgsg zU#p>1Nx5#JXlyAk#}gC6^lN<}!&=HC9nJW%%EIJ&0DIlVC7Px)*Tc?-B`ns%qO3lr z!Cyg6pe!fpX6vKrhulmbUMZ|c2Ztz6cb~*?PIO;sy6Je?m*OB6fy)7GDi905EPWu8 zcoJ9ez^_-(S8xD}OM)u8XnW+@4K5X~Pq+T{D*_k6mQ#X*6J*MFpTiM;{r#_lU4w%K zzDd0J--C%9FblCTyiD@q++&q^3c| z8W65w@2=Hh|GX~0KBoZgX`pQYS<*$c7Z{Hg{M%oa@>Si|#C;q59^!zEAbtU!Ja!bl z2uS6{{KGP&e=e0^10KZC*91e!Ov+)H155?dAAwz(tcM|;a z;Y75g1UB`rFOp;5mjJ&!)OJ@t<=-d&>y*?k$iT3bjnZTF{m+WTgHKOW`DtQpEd>H0 zkx(R`^6bwwuVcVwBOVN(?7B5L5fuILzjw|0EZ!U;Dwb2dAkaK-5m&2!5n@(< zzZtzL_K*A~teylm`c!Nu$P7ngYRF-&UI;5xHYx93t?;+~3Lf7asPYDY(YO`x5QEhp_=Aur;t>bl}VLN5#?tR4FP(&GEkcPoPG~1r)LOZZM<%SF?=s zcP4&*?Z58yf9}EtX>5=znSiGsMauR9?UW8!={gh-y`YoRMh-TRNB4ra%^0cfQIHda zzD1`t50qG?qUc3r$+^K3S6lpqEaont{1>a+m3pl@56jujns`g0M;m!SG zs%6Jq7}I7REXb>obUs(PYr>F$p8U@f8XHUa=;7m=^AG!j7V)OmjsXZ)w=o}k@UIUR z1`olbI0f@h45!S9eUDC3`5nOpB|r;`O67foNBjG2VI?_yuo;J)PJ)AK;Wf=|Zrrz_ zg5KxZ4PiUCUA*5EHS>Gn5mck1%8dH<^xqFk<>z*P<7#-pDw3%k}d= z_oWOj?hp0GuI>5tRgpCU8}~;pZPh#Ck3eJ%$^<3kKSYt0U>WguCVlqz(;{|CG54`I z6If3<40|8hvCHQiGz($8+;NlY6ZUv^Ko&|F4FZh+Q@-rqtC8`kw!utTdVY>dX&KYz zv*oo2QRcf-PEhCK60F%k?wi$k;B@=%uOs#VVH=rDY9ZU--?dA0b}BIVo(2irzgNTq zu4O{8(5)@l5Wmhp^7~X^jn_x`l3DtLBY!TCp8~EPb26;6|2yYDdkeb9>OR80gDJ9L zW!lDr1-TDWnZkB)Ce1xc;&UM;gH3*}UNxGH{PXyQu|FKrF6$o(`SDw-&98J@$&lRR^* z+dY+gL7m;Qzgmc&kANTr6|98#mRPi~p?VYpPX7=>4UE7Wi2`L|a|uH!2~w+(fN5Jp zszF!*D5GY0*UGhwhcjYgf=q$#jgpM!?c2SaSp~L=MKw8A%PAQokGIG; zB^JmF{@GGER#a>!!|ATGeQe<294Io=BBb%d{_|*4RT90o2pO>_*xq>g9(bL>MymXv z8v!m1klTu)?f5sxi8_y6qQPDh4?^n@3~?ABw;BAZMsayj5sB8E zM7S2!0G6ABb%T>HKFP+bZY;?X&;?%)ZuVp_`IPd_29usZ3*;O?a0SQ-iFeQA0Zt#t z(ANf8J-GjR^zKU>XjS!el~tX=tGhn=Y-B^(dDvvaz4KZNERUrVVf#Ci0_h;$LugPb z8ao1-5#$ZpxK9qV$}XFjZYnGespWiVx{kW?3OxcQtK}K2PEUF5N+hVipN0g`UWc+W zt)u+IjM;PUOM z2L+v{2=?z4drCxYb%FaA2=eQ8{Yo8M9Q)0!{&2Nw&RfwVuBVBTAuSgOw$qEMp2dGH z4|T_|$MZW?WGt$*4~;TEy#Mx@peNpxsukL1A(@C9pF*5XcJSa|PqMkI%QuJRUj38F z#j(!LX4ewm?k2p{HupP>MIcJz3iVgX#>{j^Go;E5v1lfyng3m4igNvepMg9Zyre;Q z>y*vqMdmAR@1sw(4TbX+Yvt-D1f2hK`C?-U&;~Xw)_?HNLIMl$=_j!M3JvYDQT+K^ zSVZXQVG+SepwmC{yF5abl1wrl)xuG$jZWJ?H!>U!4i3F*VDww^zpgG6(r;*8iWs_v zq{sfcBdHF!J{3A(rXXYY+WN085q@+JKQNjhVVtPTZ3?@Oj%w z+|z7WtrFKtcRmd%uf;frseU%!Sc!zjgIF$( z|H|F`pXm>IdLOK604f~bQUp`!0eymV%jc4INF6o`Q;c?K!bwTz!H=6ik)Dp>6N>jAb!qXYK4fa1(CFlD~ z5R$q6qPS$Jz$jvEaYVrT1e%nDa>qddv7e&0!>j2lzYWMO5X$U=P@mxWIjw^KKCGO1V#+ zPfUfPH*FAcz=)zabojXGCK}u{lkzY(v5{_x?oCg*y$uR|*&U*7UBSJ-_>4l0M z2?UJ+EYAZO9pe2}BZbExWJnW`sZ1n)LxnhkZb9^03(kqr`&RV4D^1rke86yCEs5ax z0cf}+qDwFN@^GE^VRPM1IQLg=IYS9jt$*xYQ)wt7Gv7(llIr{8tJ0$Yjo_7mRGa=_4)0j>g~K+b9#rfI4X9xfL*~cu|m#&F$NR zW_{Vu=Z8q29cUn>lMcZSaFYd3q67xf&vb)CDw%9z{b) zQTAqG(>=99WE9fzT5ceRQ4GeL3D_ag?E&mOK$a7iIaH$n*j$9uLz& zIVHUJw@z|Z2Z19FyECWZ`3cgJiCBPTvtS!H)A-z5F(b+n<-~eh=>BjuB0UbKB*YPV zE%(3kMkX@@le9Kf9wqtyOmzV|L2%t_Ba%uh?wUmHpPh!j4%>6CWT3p06KT=GJ$K!? z?kv<|bl7>=xlk}(HGnZ0GiACopmW4DtKMupM>BfuXhTwhzemT+CeJ4^H)K(3=}gq! z$(y@>b1k_=xbn&LtTam$|7+^+Wwou7{>gzhEcg88(NwH*NE5RLW{k&IJ1#Hs&vLmL zCCEGfe3H3x0NJNt%3jhCKSav=p;jPCh*;%f9)hLf+vXpm0^A4`R6=;?h^lJhzA;ok1m)0y&<^> zUO}kL%`ooY>)x-We4G`|?Btf8YI+hr5AuniMp9m-HssB@}1>IE^~6s0I#oUQ^Pk(rym!xH8AwFc|7=G zLGg({_#4~r(v!h$AP<|Y;U_T-f;xUINLh{sf20CRl|}By&6v%e#*g-(^gv9>8t9Wz z$2gbDR{t8wXFJ6|e#`>Zto^vZNR_PFM*O@-1ieQGUNU#%)4h`>neagAW!o?e(I{=83OD}HU* z*U@c8fjoRtXw)llzen@j!NOjqcZHSo#=(So-!g1aw`N1mU=JFD!m~9MKM!P5KB52- zb+iqaXNXI(3*^hwwBd+WMA3MNpfngP%7$g`s-*Z4NW(?5Wx!++PMZN6+BL}sU<5OS zRJthrr*gQW;a1t|#WjYEqAJ*o=lab-aNCRAe`?Wt&ifnA1wi>ImIDc5 zBSc{*@(6^{Y0zjg`!1eaS^#=(Y&X++w-L{NEo!d4nn$gzT2)h>nqvaqHKFHk{a=c$XA?4Rg3l8Y$M_;on+6uMXaoYpTcWvK?W|ATOLMl43gvxYuLA z64MxDt=~2GsM)8JRzgrE>VJxtMvGG%3H4zxPzLJ2P73UpQcl!()xZY$N`jM9+c!fj zU$sXE`uoTz2#50VW{BB@L9(V}D!Wcy_e2s%u9v{*9Th9pmlJq&k$#Dp5Ot@^12@T# z?PsgxGDPieOAuW07VvnTWwfkk;05JOf8SiDnfD3R0H?uJ)#btI{$txRoWWhbh_plj z&ffDQjvK0JswHQ;eDV2K+l*sKOPq9+<6*?pJJMwIBM|Sjr7PCTSc4xab6svCDS^9^qhj(3nC?T#Tn(CLGSDYFA%pM&XYPG?P61Y4w($Uaq9Q9zG~GsCO|9&+lo2 zf?sdDn<$a_(3xP{&T)APT1h8q-X-BeHzTNSkP!iqcPjiN6q4Tp?~L9gia>j)vcc4x%@FT-f}H3U)^-67A4`@%(j!X=Fndj9cbtyb|kl`2#4HAwNMIN*5b zUTt%eUT>U@=eS*brxr4;9H{SVkDzJ80FA%oQDd*57CcSe(UbOYZ0kzDh)2yEx2P&K zy<$r`ZXK?u&BRpr(%2`O{$l4wY$4=ruju&E9oiOiZmQK+AJbtK<#8|12&#B<>)W-@vAt@_4F}*M z9b&)u;amZfcWS0j7s3rPvXkdEO0_GiZOU3tcxd(o)9dZLYc6@t_Bd`g)j{KZ;_%yl zvH(=?@tj^9NOr_=o`1*aSfhV@_D(2vg;1cZr5C+qUXykP`^XD>J0rIk_mb(r6oWCS zb}e@YGE{kL=^Ad6oqk=;v3IxG8NfGAXy?oW_^obHk>X8BWfR+6`OFd#s5=2pdP}u* z+ira!+7B0(Xcv9U6bO%o6QD?;tC-Spxpr*UdotuH(g8Pc=EZRva=(_VFD=hVW%Ifd z66M^Sc62f-pAX*=KX(`Rhi+7t8eRh{eR;z@ZYJFa13TKx5=mmwwBHFmHAp-{-$`Kn z;%-h(=(G!~Q-o!yWs6qd;;0`ZIf|{%Q9&P?9Zkh<&fWPC~A5MPc~< z($Be90`6M0YJD@52_Zuo>iUuTcsZk8z9nZ*^8ff^d;13ed7`_swYFv1r<%#;Z)Jy^ zINH8MQP3C?&^~!5&%}Y>$VxK#q`Th!bF16)xC2wy7Pls6@2RIOo?(;P#n@=}2nZaG z)1p=j8fx9~ zrE4VvOd9bM2_?@mdEd-0Q#aTriY3N0)iu)iz6}cl+>C_5PbeUm^Zk>m1IMnQ05iqV@Rqu^AB%#hu#nt7#?WRH7_CU(5z`2k7d6opy5 zd0Eg| zDPJYg$UhMkq$_u!VPG;KiDmq}B=NGpU(b#9(7+HO%t!u>ImbSyh=ivU<@ zpC*kI|`CcTiBw=Rz>XY1#)DuTF%1M?)pZjL2E9Wa1t%0P1w0iJ*XR+-reM<@H z;w?oRUY`q@rX!Qmd6K@V%We*y zG*99aokjX52Ia{(mH6qZ)~W|;r0v#s<{L5$E-5kB0)X`yue#ItWoep40ygeADOR}3 zTh4cloF_iCVcisL9TGFG7k^zR8ab|kk%JeFk7;wGI2i;Wfn#n#qjGgDjmWhqY_u*Zx3yk>49%eqi87GwC?a(fH z4$qZW?29vg#JJcB>(PI=QwOkLUjV-OIidc48zD1T3V4TahW^DA{A5^2;B{?!e*hK# zB0F6KDd>O@9V2(c{Ojfa|L}-Sfr}%<>pSoQLqMO0Jq%J=z@D0n=SPan;vvctQyMji z{k!jV5&Vi^&cR*j*%j7hgpb*Jd-hops9w@e@Bb>nR1YDzg+^Q*q6&#HL zg*ndqdl_}mIyM885@@*u+|H{BN!oxJS<;+K$?DX?e_(Q|GuYn;6P{kP5~MnUXV{;2 znf6W|%hgW6;{sk703!|j87m@fh9HPX9`QOdKZxE0APv!GD8L6tj2wM(6XQ*nK=+f-w$#(EhyGZH(_lw1lv&o z!kxgSs0j_OSCBnQ5Zgj|WQ4&DE8xIXhE~-GK)l2iFpc`ITtkj(L~9@ku@O+K>%PuA zAJsth7Qw3VbYLIJG68VRN7R*Z@yvx6WSR|~K;V~x;SnXWWtSlsGCGew1|Xkmgo~kc z&c@WOarPip!rEO z%*sB*{*9RX4Z#)F;k?)I45+Xy?Rr9c2!Nc2pdVID9FhRgy{DEsy|-Ri`4GOAs9q!l z2x3<4M>Zos?+TX2YEdG0l*~YdW2rc0GmD7^@MlpnWY-^ikvn|(?C>6W=wMb+8tw)s zq~-S!Z9Ny-aFi_^NkqcTh9ZQoL%{-tpH`CxGX7^HJu#`773h#<5Oj9{}VLAs5{ z&P64IC}o9N?5$B>4$Whw#o_X(7l>;$p1rhVUJbE<1L=jsPhe1j<-PWuWrDi|cOM`X zY)d1`eS$XkljfSZHYhTiCwzmIb01408ZaFqmpCxX+97wMnK5H%yb6j$c7*6HsX@%Z z_`&1P$_$o;Q&jg}=su|2D-&Fqj>qg`T5Bn52U4PrMz1(-451l29vE>)3XcjTd00BW z{l3;9Lc&qQ?w2eKeX94-K(2g?Zo9~YeP2{id~bBu*0bfsO>vS5v+!#=o)QaS96*~pKp6ZO1i;4O=8(TTS*8KtGTZKD(OCUr zP3Vw+PF%rD3f8?lr_Yex8!v*-GoRP#aK<>*u4@lE|Gvvfk(w}$AsJFNT7lqLa8nCa zkf3HfBgDU4wHdobh=W%KO*oIq8)5BG7;>-$Pbq{)YxaHokyW9HW&L{>668SoxRxFD z!f!TbQh25i1za0(vU!)kBw;Q%;Q% z)fw{>`l>rDxlb3D!eYB1uW#K`sEiZ&&n6k$cIqYFf@1K)spkhzFdxSzu%6y9w_fo- zve>KTE2#*79g=nN;y)jsz6<-cGQM2$srG+UV+XJ>F(8~-+&Fbs2;C}w_@_EQc>R_z z^-D)Gftj#eW?QN~M3 zJo2q*nk!o3n_~n(8wX$dqs2?3{4(~y{l;Inx8*D@THX|cNc&} z@)*|ing{eJt8UCY!}^c+X&HiIUqh`j9DfZB)!H*oRZ29 z%{T3azUJ>=+*&CMXoeNYpL|PEo;X4siW>W^ygpg+WYPv-a(yb*z z%9bC%7Re??0!ZpR5K{}dC1RevyI?nv2h?5B{*!u>rLOWOf&+Cki{K5%62+cwC4mGz zBkD;2OA@S+i6x&N%**w`)*<#$*~ZUtE8d5@p=$3z1UMb+5ss7wPmaP@30W$l%TY3T0IRf~m9DcaufE zMZB4Yc0Vin*U8v_%>Dr+ZXW=iUwRpQ%bJ}G>pHh$_IGOWS`bM4ss2*>k|~e~+$OFy zamznN*KsCvI;=8Zuj0EVR=q+2p(Tk>;ngKGs0ek(QMGo3>4_Gh8-~zAG2fW+mt33NsF= zifE=+9IdUaNqoxNlq0DV14_RZi_EJ`W&%PXR6d9L^z_X5e!qTe{$eG2m z6`yUD9$h#77nbu=r9zy35amD_VQ|OjGy8aB%iKnAbpn4#w;H4nrGOEE^R`Q+zQA#Fc18*&Bfb9PB@Z->|C90iQw)r#>yxS1mmBFN4^IUU5S_m zq*Fx+wyPTAotKnHLx(rqQ^W$XgDbu`>J63T6A^_UXGoTiRB>z*7A86)IZ7>b_$1j> zbsX*3n-hemj}meKoS$#e!d2UM0Y8#9XG^F@TX8*;9IzQ6eT0o%;Bc^O)3f#5aj;*hBdx8B*$dYkuCpw6dl<*m0 zfF`s5+mbVEYAi)xusFY>9%M+-5L9Th#GmYy^D|>B&avtFk;V{?hWlOlVaG1kt$3U+ zUxOt4%ezII=R(#Md^tR1z8cP(9PdmX_|WR3iR5CUPj=jP=_1%%<+y{AuF_>@R|n(g za4E&WV3mXMSLw55AA$byt9=v$nw_ zpb7J>`VJ8>PQHj$iZSKZ+_K@!LPl@3L1y*a<=KV2$+WU3Npou#7)2%>wjCV;Z9@6` zV^YLzUQRG|X%D{08Y;QP_-%CZwr_`f*{8k@b=%<(;-M7Duh+dt-#C;U0yOZ|lXyeV z!)6`5_uDweY4?U{F(Tda-6Z|znOc35yd}_h8QU%{eyvee7yv(etJL5SIr$ zI~;SBtm$R5CHG=I5;x4znbr<6N~2ts!4mo(#StzjCRpLfb~KR5~+Vce3!_bAI)>R##JpJ7Jr44$j+S zrV$i2`5y~MChM6OW|F>Jw1g~@JdfdNZ^et@=mwv@k6k=9(aoM*;_y;! zV9y~>ZA9cvGk^LP9iwct7N*telE?+PD|k-t*mmmPd|Xl3HF-sRBmkoO%sI{T&Qp~W z_#~|M6J`onu3RZAuv}RJj$dMh-hEMdLi!sI6Q8ojGr>EcfFU_`kpin&R4@R4*ZrnC zwH>YCFuo(+<*CSpGJrbf7s`CBj@)Z38P{)r`>@e+e6yX9Q$4ZF9HjE5jdW)+CmxPj zGxaU0f7yB+$SGkHE*DaEX3Ly{*VeR&y7GZcqe>M)>)}rZVy$KS%$@Do!Qb@Xy_xGE z&W^_E;*z{$l|~a@GCR$uKWsg*c2f;8n#~iPo%4ng)^B6LjgIrrRlw#>twH#qLXPb%eeYY zo7r#nJ}Y)8b`m}sD*mi3LeYm*R#JRx4{FCC3@k51&8~ik9p6Y!=WgbnY^A=+lp-fN zn{^)J?KS;TYLi$+df`S>y8UeyZMt=Sx3POVTVMKqqzfz-YV2=X^rsvjVr-}GeihBi zujY83MKgIa_(4qBpk_Q?VLv(FI)^@qne7lm<(3kLEqi0T#OzHhDNc$=G!Mq2D@H>A z$#?J?S9IXRMm%_I>nPSFvP~0SJ9&cS`R?Ubt5u8llS>2ixx!XIR!Pi4raYW{gp0Rx z)&ooVpH;OMC#Qd%lv=f@O7i~v5b9pG^(#?jz5IH|XYNE9H~pySTvlc}(ybf5mv>w~ z2H(>cZak&W%Z;X9n+DW*eFIao>$O*uW9|{&Kib~PMK03V(zFrW5d6M_ozA47Y(%MG zVg9?3hm-E*7$G|&kM$QFsVpB2#79z>6`#z`KHzr$&NB~{y%*;0zUPDhcFqeye^ndR zJ*6W#sk}_O9UX*-n<>N-b(qf3walS6ajOX3CC>0+FJ8u?Q%f!LljV0Lv-N#0om#q0 z$X!yJ!E(jfMvmwXWgy)X@pHueRHbrB9pbh#o46kCtd+FkTbk?YUflA#)9zX1cZqf0 zSmX>1kmo))WiA=VN6HXWD@#D(^G+q|) zcy&6}Dc4?+wW-#rTs#uhYA8eURWZ=!)>vyH`#9M`>im<;YB&60j*-Q7twk~aU4DA+ zMb4miY+n^UgTJomlj?-%@jl0N4EV0cbj&2W1+VCfCC~66X07Bbn9 z1(RND&rjvmJiqW_I=&}jdD||K`5s1tq^i+O&&Ti4m |#nz?iNTq2Mzy|B=6=?)ouQ}Nj2XS%K%l*~$rN(kCSuRSAMwmoI; zBPiu1!Z(scO0+C0d`qf}IQ`k!5Z>vt3)6T<922K%Jfkydv?&jIGpVj@eZ3^Cyl$58 zwi?zUk3NDwO2nT40o4crU3ZsuV2@3!g+2crm~*? z7bf8%s0oLuHhlS)PWI=Unt=FfSyDlR{y(6^|MBC}N1HHylEFQF4GX}@T%?%?dC{?l zjrz=gj^KhD2x(cMMAZc?qQZSa0vj=ni>I*fOAA(IKobQj(c&%zDeu27OtI7>FavNv z9!|At#s>Cb$e94UMk-*AXT>k@{5i6q6O9Zq{$JI))A4PkNwp(c^uNB7MM6-e4OM)& z_8&Y&49W@`Z%?E5mlsiRn66F<`}nP)2<^<+o` ze?tKTJsoc*xvD7~JVIIs8YeUs^jg|0?7t34AnNN<9Vx78jmy*hY?7I;zj{I+3&mle zz7Ixy>q8h;!GLjTGqRJHE|km~qDU#IT?e|}$)-c)EuSbsVh@49Fe?qSpyLPKdk(k@ zK0~;XP^Wa$NzkSM-fPUQ4)8wA$tXZBvCrV6D4j`3)kMh+bTz_@WYduD#88TY20-el zs3NuKb)LNej53B`U@;#6cDRT*dKM?dZnJmaa4Z-zo-FEXxAFviG$_Sn2 zc5b>_JDyh@_?IKd&qYwa+)5++WvSoc?ag2p;n3i_J`kVlkxwLb;{(FXC%Z{`tkZZP zNZ29*5LdA-(be+h28N7s-AJ?Ns>oyyI@P|Wud4j+>1HO!@RIe|+CFeVMfzyNwYS^(IpB?~VLiVq$rXx@>p$_IZ# z;txoAxN#D|d21|%#rA+3e^jj?us;q@)YEof_lh$_v=XMHw}%<=BA`8c2-XpRGEU}- zP++P(LIJGrN3j#jKkCINKY~;{9mpT+>4Xq&-w@bsugG3}2X{g?O%$O#f+r@a8FRPD zVlo-}i~vBf7FU89#zQUBZie``R&RJ|QT}5`grvJGw=QaCX2;l>zMJYrA%C+l_7~YOhEgXD=*kV z323URSF2(ZUN6hIUu5#?*@NO{$o%$1H{os7qe>O$Sdu9|g}}OSo1uJt%`k@7mh0<@ zh#O{ckVkkWnk(|J=Z~Hmo3I&gOrMk2#$8+Hbl2l2c#q3sb%IH7cI!Ox)$%sSrZ|** zrCIPFN#U02?UMcD8vDtLUcxFndf}2#^)2wmi3-Bh2&Momzt>$V5-i3>iT@9nTR#yz z2hgoQ%rS(4i4PknSysGAt{Z~%ZXFQcUJ!MU(U?tEYEB>3 zgSWjJ-3Tm$MOD;Itmfl&-&vK{X&gY=^%xMdC?=&mdX2Ccr>%F$Sn#P8O$PC$h+;J= z!_9a6C0FgTZSOOe5&|^Fc_=-tZGGtCzWv4cb-IRH%%_Yi%3x#M+5T*+v&VB~D+ zm#4?(03gga$SnWd!oO_@4(3n*ADUqfh7lMO?3R} zK>9x@63rR`^{JWuc+d>Q-GFba2F)Z;aLOaY)SyJ#4WTt4)M`<-OPP6&bd{`Cqxghx z`8@z23jl!VhqRh`fP@Rdg^kktq9h3&2_+TOFbU!r#Fi;O#TJwOB)X9rFo8Y~;D;h> z$eDe^?A;Iwceug!{_e>B=93OXnwLR|fXA)Ffd+uZ)hBed6KI0S-gHY5tjf0z$wFH zMmsQtaSlfH75ooYiBptQ!b&Ny8=%p0(8;sGktw@~W7l$qAlY7ocmvUF zqqzc0fQ{qSytiES9}`9$HB<<+AN)^Xy`wUPXvUvNEUz))QM6}tKS|YcM^m)Y%Pf}N z&~`#D?u8QQ=V#RcZ&KmncVyJ;X@RF?Fs9{pqyK^XsxWXs`V!gNQ!C7@1FmoR2~XMc z9_;`-D8qg_%Kt(kPp>^RJx4m44O8eqD(A!Nv%CkEexVoH1fRR}4HW2vOiJfDko+{# zPmToObMFL&?L4vv1wRP->EER4;(Rm@l4AU*i(76K9Wp1!0|+S-oseT+PND5m0_2QR4 zB**gpqyl8xwJ=SvHB1`H4nm0EY_N(G%(N_kM!q<~U+Ml8mI&dfDsUZ*mH9xv9|w~` zmps-yVDvUiTM95CI-pRT;wDaCT!Br&kxf2vlcPBUMyXZ+P8{uRyfHN=E)p%w}7ex@*3VpeGsp7Cl^*O6m0|}AJsRVoV*lP$(_e$`fsJ&=z zCW18sN^dI)Hp~+4?=mws7SW-5b_8!@^8?pmL*TkYb=o?G+AdP-%;L=t%k&hOaesTi zXK#Q12h~0im@jumUgZ6o_;hi(uyF2Q^(z$8M-RY#b#O{J{8#bt`ydC*YR{oM`>&T} z4nQ+dwT4YShvKXunO)rR|6=aVqoMA@|6#^p5C&PwHg?G_`;sk7 zMA4!`mW1pHW6jvLSWC*96s?wokdQ5jiZqt&MP(UFcKThPmOFR%?|h&0ea`d8bB=Rv zcT@A3`OLiE@9TPP*T>FH%}K&nG$ikxgqU)zzK;Q>He~2x15KXF?eeEj7HuuwRKkoN zLBXni44G4cZW`_X%bunF|4mD@99aWIxhpWa%MF$j5u5I{W+~iJ2Rc347lx?34BzX> zjA5vrWz!&}FX|AYP?}oz+$Ow**%hkhmBne^^yPsmV6nc0gh5shaZ^o)XzqfRKVC(0 zT^ALd-{y+5HwR7?Ura!qxvmMNt}Bp4po{<>s|T8w$^O7;pRjw7uwDw88ZN*{AP06o z7RZtz1ZU*bQ!0n{;9 zJZM&)AZqXQ?00mM-)6m^L8WtJb-53`Y27eEW+FSBp%|zZWjzR;lg==`^`VHWa1&l& z107+>%|dXXx_}fSB^LMN-J9*v)Ycmwg__8R|LgblXWt#+kSjz)SIC@{jzCSp1*EX= zP#r$Yu4`8S0mNN-ro4W&_aP}JR>PkhgzomtO3>MzvD2?RV7Gth{-d^Hz}wrQ`kJ&B z4C!?%I|>d!OaJo&g|^}M>|ug+7g#GU)8zsQo~nWV(fyphX^oe>AtseOaNZE)9o+DA z+m-YXQ4)maE3GzM-n32<0?}19FB#~te%)G$vS!+vJhC*ZG;EQ-g**r`1S+rV5qqH- z%_ujoiW9QiihT2td6Tg3s}^Loy>Jm?w1FaOGK$l^5UQo|65xm15&I3&9;cIuLGTKT zF&vEkYe9IJ1Tz6$4HSd7k=|%+BW)OCMmqNhGf7*`=d=rO7j33(3o?JCvFsm zKw1P6xUvf3_RqTMYNp5Bm4cQ$fp(lucS^45P>xmhf3y{GB2|LE4#{jmhAMO;#Q@?t zd8x$u3<~CCrR4WUMk?O~#1S~T_lIJ}22S?AS)(g6ectWeQ1lJyX0;^x8S{GrsfJ9w zWHsEpvuQqL5-oOdes6N3GUR>^d_gu6B+#>Ha{rg}A~LL0{;vgF1#6foCE5=rjGJ$p z9gNJ}DN%4)-?U%Zik2C#0;BaR=U#(Kqb+vNJ0a8Tw>vJCikY{s8X5;M+VZQ)dWQ_x z$4>dzwvGz@@$7|a*5VSJOgKy{VF)z)#f6UZC_PQ>z31NGJdW$}ZM6~;*y`KD$zzmj zNZer{9rcpyc}3k=r=aAYN)h%_@V)zH$&69nD}?`+zCA|ym-K9VDp)fA*s-E3}eSWlmDs*KaI4q#dbx$nrt;b#(%PyhHkbUcO7^1eWT zy`5GSC5SQpFvMCprlHFx07!Zu@6oU3O1t{cLcsBXeVyhFmYmQhgqx8DKm8Bb4mx-f zZ1aWpg|<2(zJj_)O3OvKC6|!nR)Vz;R9>G=Glgg_AW@-ABgX}7Z=IPBn@8fRklqnA zJ(3ShZ_dJ|eG7aVPN%UutxzM}iUyEHb8o`@P~5~MBi10mh>a4=VtBEDPqoj1haOik_~`nN#d(@#{}APQE} zw!OIoO-XEmWH)Zi=Krh|;2K@z*1@9jrypVmRc;Ph1S=yNOk z@X55HlsRSM7E_+0ispHEVZ^w)2|Y`H*|waJ$M3b@$>jA?_4WMXTJnr9}DI z)aQl!G}F8fp7UK7USTgTYV3;Cs8GS3l=E<=m-&KhqNJO?c1UTgkJdcOKlhbgV+GASb2Z?j^edT!EF-D(rU|QCHD-dJdesn%8l`K*H+K z2B>6IsgAAO6?$lA2@T-;Qyv8?d}47rY2AN}=b1p$C1(*$XFlt1t^25_!E_uHVP-B-*6HmR8#aMG9+`hh<#6D;DQR7|c%EqI^$?5FvI7qKi#~CG4j=6wv5Jy{ z^^i7@;EV!gpl3V93M!{*BgozTue zdCmAVf-iup@nctYir1`w(33q`0lybbvoi`ptU4lgYyypuhD{UF$EVE5u8IBCCynlc zPR)encF^z3{dycS$jgn$Pu|^J(?E-m&;d-7^1jsB-`D%~crG+nl9UN|HbwmWxT*<~ z7O=~<<T-L3g%Q^ET~YS5@8z?Aib3#S?~=t;jz@A9YQj(6w6@ap1eb^k#3$ z1iDS2`H6pZZn-^#awA%nSX@E?irE*M@G^+%x>bGV^rjxD*#`x{d@+&~|Tn^Rqh%plIy@L^eqQ#?>e3?a}`0J^5dSTQj{tp8^=dKSu)mY5)N_ zKhhXCbzaCF_CplI?gKX4{?#Uv5prorF4qii^4nSqkzOedAX3%|(8`xUveU;yaz&fo zFB!@i^P}s6h<3lJ@tg6baCY8~9q6D?^9$U2alYGR5OLtc*tLnn58J-xo#>zoVDBrm zeLeyESzA(J@2}h%_d_p;Oo{@3l5voi$3QMMzNV0oYq)3V333BA3TCYplNYn&>GTHPQxq4eDP*AqziS|BhZKm7Pe zJ~lF}8o_0tz-mKW62L1JBlG`O7A9Sg{B}1Zuw3rM)optRzkBS8KB(%aUlxE=naD~BkhoNRGJH+{|&YR|tKi~S{9Ay4w9Jm+g z(+%L@ECtN5u3O5>VAHY}1$4)c@+L3c!JQy#^qBo*7;2C&df%$D3yCHL@cGW%-UgS# zsvwbc&oBVnUwlmVJg|)xSw7HzABT@Aqseq^^l`;62M3Z!Nd$uIY|p33S#&>~r@jrW zN0i79A`mF|UV->5##yWe_>PcT6QY1F?9LcD9^31LEyHV}q_(^nk&X-gv&0B%Mxl;V zvmOJiqA!KAM8G=i{({Zgws}h=3;um|CR!*N z%TF9BoEmwb_T;{--~HzXLNCM*vn)RG2i=X*3_uGSKORl~b6nx}E73Sfa;WT-&4HM| zUj$nxKwwA)Lm8L+Rpaca0y%BYQj3PyEgBI@O7J2 zf`f=>8rQlRK0-E}E%4{Emkl<(YvkqO;*pbOhM`Vv^IL%rBcA}Zc`MPIXQX%_tofG@!YL#Tcl2TA26!ouM61f~1mj9MyD_>C zP&MA+mE(jWPB9R0EHE=UT$AAc5M+B?&gJVb8t!u!ig21E=;!u zgu~4Bo}9ZS`vIiZYP`PJgQCDvws2bUkZyR45X0-1;>5r^1B-!ZR{u|oj z9;f^Sw;&rVqM_|Y=5ExL3Kz@YTsi1|s@{=*W81r{2iAbCm`v2?c_DhVZYd$w^s?)@ z<@u0%Uc~^>q^bu7?9<=2JmU1^&Xnqa1~?Cpk1mz0K--`-iUTt$MgRda65%-kLk4|( zVFzs57pHo5+y-V|7OjJ=!WU{!gbSHK+;%{#RjdP2r8KiEc;)QQ)$iS^jM6*KPflhD zJx}t+8Uj8=WynrRsTCG;{yabKbC_iU7g{$bbWn(v|A63Fev+UeLz3X$HsxrK0q^hf zC)}o6WjTo%AA-O7pQ@}JzH{P`&ePz#j?6;Lo#y%b`R;(sAt3<1CK50)D`m?zSp(2K z)VH^r&S{G0sIe_U|C0iViOnFq$ORum*b37ipHAhH*DG=gDg)S9>jwr-yv;L}0=?er za!`4E=4ZJO$YPSNbYpj;^65@dW&hdS(e|tp5W}+*W+Yz)Qt>5x@r(~!RmF42Xd^u2 zgFv9(n0JQ+ErTFL5css~jC7};^MmE!Vex|Dvyk;sxcgsZ5WLg1ulxXLQ^Wx>xC*`6 zU5+3)F;0RB^KG$%kyZ#XoCLHj&B_drL$B zf7A=eCeEJGuX@Ef{I2!f7~VEr#3Wr58FV{15T)cbJRW?}-*!r7o@oK7PMtA(GImP2t$p9HX&V`! zUW+q_Z~Q0}OlIJ43@)UcT3Fk|)0YNZ@s%ig&K5{j*y>bG{5G48HV8%AiIE3P*?nn# zG@xNhh9c{~3g_eaf}FVPV8ct8WPP4HCKlLl=iLB@@I$d;J~Io`WoxPX`C=$y*f2~i z#_CJ->f-q@Wow7US^ff=e8vlpp!mIqt*c|6M3C5%iLmLM=3=`>+G0~H57Db`s}RmF zhAAA>u>xek`$~9dO&FGLU+#mWkMw$X0P-P8R#aa09NZBP>E1#-^|&@W-8%q$D~dIj zY89T>U9riqA*=%Pe^0d5S3|s_s5w$P5);afxe$msM$Cjj-XqSI_Jk8a*jr85lQXOq zB}C?viNx57Cn57J2nJ!zC9Bbs;aCG~Ew)v-M%87JGpFMeJ=0^52(Zdi(r(>96Ip88 z0hMbBqwfja873Z$p!|{eNLjX8tk9|6EJ%r_<|Efjm6EDn%4w4qU#Z>UH`RxV?}f;J zpDnmiz6i*FyubVYdH-Sehu1<>;`4dEDRRh;uSy@`v*aV%-lKu3-LIoDHlfjEQ;pk4 zY}@_wtn%qbrbnmKO-*=C^<65|QBNIdbia6KZi8U)T>X5s7{;U*#|D{1=B#J2!fi86 z#NMg{(Rnl4+czX?sv4;0=y~ghcyy!}Y~nzr(Jg;OUS^Q-6aN&q+Mt(g-C+|EImf4X zj_@KxnYGKK-!gIuW^I=YEIb{0c%qT2Gu9M(^?B zPaC_rNW7pXN)Ve&Q-A(NhU0)?%~cwkA(V$9FeXq)3Q3w5VKxBd?9_>RfB@ReTuh{S z9y$Y-LGI9{FHmg7p5ZRSMZKpX*SA!qVC!GXwkA?AUZ%maizX|1*|Dk!^H|g4O1^ZHG^=2G`n@hC-ha@$a?n;Bt$g`vfaI1l}tIC>bLb3lb3MKVIox^&S~gYOSEsfyD5#OcPN-s<8ubuX8dMDy6^<`PgJwDa+ji6fS;0oRsNXTf8UZ= z4F$ureB-+p&HipJgX0q-pCr&+Q~TsHo1-^wsyjZLP$5lIG;)2<)D*YhNrK4!L*snB zVb`85^!X{C*tnW@&M*{hfIG#KU4Ef^q`iMtn%wniI6KB#3U7||q`g-Q$-#YJR|zH;KkQ*G%xnkf3;KS#Bp%^8RJd<)eXc(&p*u!T6C55!|sMIel0 zu}d2QWObi>666(sQyZjFVe>rY!ltGK$YVzk(M(as<|{`P6{)VKGO7w2O6s>6ikr+J z24JM9GMjs+Z`$6VWx(5g2dy1VDVyDKoLUH`aNrbqnvH7a%7_!&jfF6_kA)dqj_-XV zA}-7)hFd7KiC~|FG)ip+dM92wM{(&Pcc5f73{qlDxSyYV%HiS=DaNVVmB zH7<^@p5LCLpCP9@N>P=2>c&O40@3&fmj=fs=)TC8UK1F`x@JzbtV_NB{{2FvVn4`Y zZVseM5zQ{l)KpsBqbOal^YUna3?;+?_2BQ%gxeh(^+tpm@u^DqOwvb5(kbPp?Q=A4 zs$*3hk|h^Il$KS0e#%q#O(8=rdzCtjcbKC8=-eJDlivO9FxTvC<&IJwm8O9gt4BvD zwJ5Ez8>Csge*3mi-nd2{yypkX%ane2j*N@x?^C@qzw9|dnr7tTe+vG(hcj|+Dyt5S z44+e{%b&?SoAF?4v0s%?dwhx~HDK`ZcWBP8%s{*JjYpr?^PJsraSECQGMWUJSqO+dThOveKQlJ5y;$Y&KfaA{!P7wyW%HnxCAN*$nW*?wPs0W49T& z_NljdCpY1fNrL_87)cB+ur@NFFs43di|N2K24WZWD%O*p95o%agF@BzCQak2ZGBvx zf(`W-%@A+*FP=>(H>Fu{MF8wWAas;t@sP=%-Km(~gICr;JVTK77NI+Fjf2 zG4?p)eR{7CCui0>_REjA1(-AVOUJjC_c)LSs9~)Yj`churfDd}>*=bFyn38hRNAX& z-79I%rY~|Xjq>eeb@!OT+}8ckw&A{B)2S|(i`<@v)2JX-;y|WU z{(yP!)E8SWz{gKRzG$h<^V>q=u?` zHTg|xUreNgPw8JjHH(=2earo+ulbpABx_M{o0zl*VJkZ`TuHV2aUKUZhGUmw={i~ex|^FX?wAM7SN(Fz+FTS z78$`R<#4g}+H^|^`Fn8(a&*rO){qyx8dLSNzGER!DhGd1@TUCXUi<>U-<91dF z!~KvKJ0q4|$cjyqDZzSzZWCra6%9BJT@MTt#+8D3FDbf*XqeyT)hQ)KQqwYKfVFA<@J8x(g-oC z=QgV5zrHtx5>*&dI};&Cz@jZveWyVIl>C4T9qxeH9paI+tZ#iMRdlupT&AoU1vnq+ zZq!e~!1r?`uHBxoyt@^f)Ie(dehjEa>$VJ45s08nf`LXmvVf+b8LkZ@Z2I_c!!(y6 zHRWA?@YMM&Lo^Lm7=ldT5_70Uh5y{`H4s)pZU*OrH8^{cz=7}*yjS9RrdcTfaW+G* z=>SsH>r+)x280+;X`~*!cX;2i5~mv=(Oj4eE2#~q{yN<-Q~}qPl%be$ddo)zH%t<` zj`s>6b>0Cze==wr#~EY&KEK@q#E}SqogMR#U4jXTZabPMtXGo-n8Mw>4rm$U;Zo+R zd?)!bUokzqlq6}Tq7^XJ_k{BOHrbO2A?PL(-XRL}7u6gA2-g!7{Q3krqBw2^O zGEIqQKcM*Y)TR*)j)_YZ#zeAUr}Q*u)@nwFZm zL_R>eia|I-Xby9{3oz%~Y%Pip3N-P_bKCumo%*Yu07#;T;A%ZxGzF|0SXXGR&2EIR z!7Dsi8(jj2?w19sktiId1fgXSZf=7?a8U`MGr#q;h?LDMjoKkaJ%z8YSY z+9gUS#oJP|8s)c!L-S$x6?Pn;s$*Dw!{!>Q$mHM|Cvh>K+TT-Ged^0DpXhJpw$G`c zu`#x|XY0Rdn<0oA*K}Neo#8v8>URL2ee=<0Qf@c7b_<(Bn~S5h_a(O&VU8P454}n{ z_=YdyBMR#e>$A89PAqozy>o6M{d@0VG7RmN6-ZL(lN6lxj%kqSaeF zBThTtr+xw3VTen@Kq0?pVS1q8xS7BUw1Ux}eMk@+i^fe93ePL-@AEf0zifaDqZusw zLbCn$$>4$UJbqj8a%%LSkM-y08iG23M}l)0MbOgpmOAfuh3-(I*Gp1mcRx`M7CwQXYHX0Fk77Yz7hQX zahb>s?&;Slb6pQ#kJ7b!ks0+}@WnW1Wh}pXJjb(Tk_cUFqeA@H&$Xzb89LlXO+^q+ z2vtQv4pH>{)Q96>wz)&MIP^Ta@})3HCXx_=^FD9(&v$r|7hzW^h8$V%ZSGB!bZkym zFy)eQp={My4yjJ0t;UKVwLT3~OG5UJ}D(h^6y}t#FRt;=45FC-vk!KoRP7_$AW2RK{ zG4q|C!L&%FhTjNjX~upT5SU3<>x?Y*z{8~;13cqAKi;X=IzRwNVf)TLr>L#!3(fBQ zU8z>xA72=(7kWw6kE!XpM51O42IvAU5Qzx@zEhE+dS*0c{>wWfkTgoc>qvr_i{pq2 z&oD*&8gTVeXXeKbs3T&E^Lgrl3kEs5vFLAG#SR+4&dZ*g2^x%-V80R4iQ4iOQj%uo z<~r1{7eo=e(H&qI;4IY7RP*PDhLpK8o{Vu@&r_eTDO)(CHDOEU+t}Dhf{^adAj4~{ z74V$ySATq*j&e=eYdB(%S{cY1A=26ZE0p$a%ccJTN^|`G07_dP|9^(k#VbVOxXHI6TfEeb^I-CblL6Ba8B9EE_OI0&? zIjknbr9Lr~E4p+UPc|x}g&GG6ogk5b);Kvu?2y=FmUGg#o3G-uPC_KgayA^mJCCcqCTl`KUrbS;X`XfzjZ|%r4OXSdD@L zM+X8~zqEwyk(!Vex1{N!Ve10B;A2VQA**W|!4+Mxk@EHYY-yw=t=Dx6fWto7JF;E- z7Wl|2vZ?Kfj51_5=uEKBEr>`?pe(Se1OzObp@?u!V2nW`l}zu|D;UnRe4JR|GpT(FN4D6hR^|G%SE%)}j=pZ^CV97>gCv5ew0Aox ztWYNuPtA!Tv0LN$_Gd|Z0Pdruxr!;Z61_m?QL1jbUkZ)-B>f4^(Yqd%U!y}tbgBbL z@fJk4NLC_sCVbvUwB&(?esyX}#JrJsa%DWdx6P}ti9WbBQ@yg^JJr4|aEI4$y-L<# zLqj+taf?>eB(d?i%M>}0;y|>9Jx`j=0ELNOo6BXHb(!^D>t~=FUv2D`>d=T=cqR|2 z(Ook7=e!Z9BzJPv13V@HQX_-}tG0)~H})F>*qvt^EY7112K`xTa!NqvWdV{(z%*3#yv3bc^rAZ2? zU5yeMB%-K1IMqyu$6_eA*VEKfSDhk8MfsH%KBlG12j35^8j2X=1kX2P;fjPZl{wdb zjR@Vt{sjq%JT#$6vN_IOx=ouSH37lBatEL86xS?zN0+In7TbPRD(lp9-!@>QzN9?i zQa+RKNAJ%^HgqGbjP^JY=Q?Ps=^w}xC*e6L?b0Rg4~l`az1vH@Yez!KR^8YNX-XYi zQxC+SI&ev0GW5Z1qIHypkYSQ8B^lZPko-=%<+nysPl|5_yUK-gghr#S#kewj!dOaQ z)+JM$_(WaTk*e5sl$ThavTJ z&!OLgajokKttp>UZ=Vc1Nz30pOZjvp`ME-?t&0pip;drY5vD|vsjYjV<8tZ6?#3+i z`NoBR&>xLnihR$u?&l|E`&GVFZP=EgfB89^xqV(RBS+xG%{d;=rsh+pT6(^_rlON^-ZaL zAI}IkLGd}jUE*C6k=wu2YBTVY_cOUZmCf90X-~JUD(v=_iIP2-7J&~j+@@|d44s6v zPkqFXag;rtr4F-cH)m#R76!v!Q1@f`hzrq+nQD~tuej#iVg|W!Rg6wy07>Y-6Htp7XQ@taj0w%}VejEqK)rEukG`b$`t4vi zH5VyI_9vF5wi^~*d%T2;@Lx4P0V6PI(nlFQBT(0BtFyU9{rUUQ9ss7Q42pUFuJmJc z;TaP#S^JWIgJr)^Gfg}b08>&)_y5yq@FReUV4Y*f-=R6v61*+1pM8b;FzH|*~1^Cuy0d`^aHi|pWccWe~}yVFR)t(P%k&b zMllLSK<%g<^QH@Ho)y9>x?2LFav^tLTGu^Evp)aG*lPv=Q)m($UR^%~&AULgSLx%qM1(3u5(9B;qY-w=X^}RNDOP2Za(~oUgLyVCef#a~Y}y2V?{` zJ^bS?FG-T0R~_KyJf`>eo3jQqaBe%RT+&~kM(8v%Jn*6DhQr@CeNdh}0GD@7UwJf+pz}kW~u`@`H)ckh}!@ zhaePrvOv~ZZ`uE_7V7ZSqQ~7gx)2>3w;6b2_vv$e@lfUX1&&X ztwtzht&eMN^u^5+Sr@9)RsBqWz!8G3(JTtEnYS7M#VOQHochZK|z2$L~-*N%~K8E7aFt?I0`-veBUUem5X@_ zWvxp$^pxY%jXvYAYaQ0%kj{njOKcFAO43P0teBb{hXM3bkA^n&Dk#Vi`9Vn^cyK$@ zFhvmxiAV;Ab7y|yz5cOaGZ?cJTsJZ{me&M~{Ab3@rdSsJ!3Vqa*A(`GTNnKq)ER7+ zj?D>L!;P2j1&1n~+>9>7@W2AjX;RXAX`KtBPQe`}1)aiGIJH|qThRHOsy1bpv)MNd zWz{&|4ZTq6hX6&21;I_t@xr=5_cse3usa;jmFt<*ygef;=|Go{;5YeLZFRrte)^Y^1%mJNZjJp!+%k98F#?8&rn5{pA3I(&`H6a-&M!z!UJk z;xTi-G)sI50(T!Qd(IV+qrIwmu};)NsjWy6DMq%1a|kEhEq>LfAZy> zoIgx+l8R>JWpjNB8hpm^s^;@<*YgL0j*EP$RW6m+UW5B;(!Q_aj-px|NPZGz9aUm)K_~(hc=`2z)^+6_I+}{W15Bz4n!HVpjnA($%NSR=)37< zk+_o?nR*^CWqCL4S(=?9p^vjWo-kP!!0C1K`7UNSH2~FPa^;ji!ORkSyU=;lu|hDw zk=aJe-zXytw;eZY)kiTIlRY~W&G?fw`@OH>b#N()*ZzxQ8Pt>^pwzKZz{4!8XzczTK* z+j$DU)-$$we5m+#Z5gWV#a1<@E9ARRodb=_SXUqDbUwn@kMAx7%R){-GuRV#4l>I9 zb6Dykbj1O`2`B$uA|yz3Fo30f3sx_m^*HA)1inP%Se8^O?mZ=jFgr>LLF!?XqTWk4 z*?_2G;Qwdq=%nygl;|M<8NyyMl2<^xXfvlat(*1{7P|wW-0cqxV~U~oQGc`nrnoaqzKp*p#*w*LT*gmJCV-H}-J#>A&FQD~5lA)js{xD>4d7r|Tq5;hvhAsc-Q zvfHE2LY^Y{11+1lC<2f}N}+Rz_@|-e+W7m=pvx?V?Aj+m%f+B?)t?)Q?(Kc-B7!8x zU*uLjY}c?dAjcCE3$jzgg^BK4un1*A>j{)Vbr4`BV)tPr`kiM_s0%FXB4{3~<3Ah& zGcIt}=A5Qk8WPAB20KDC0Lv#Ar#>X{=}>)!v1W)^0{ST-P>$SM7y^;cEXbf@v$C>4 z8g&%3SbPF{7hfwJe|-8@&el4XZ#TGB(D6s(dDKA)BJvj0!ONgiu?j|J9QBX@Wi$ZI zl^_^ad)&coD) z8{qx-zzM+WhWOG?BhH$Jfq~uogW*0MN`r+x=6he7Z6Vceix+(@Vt|PCZhgbHf|?3m zUAO|_#h8^NVBvX8In(U@`K{1rV$sdgOS^$mV`|L^Vu|~tnwjO!W zuPcCp@8#j?{Rq71!d>Np6$Cuy2Z9F&+I_ox0LjI6ZC7v=1^y=q)P4r=-%d`dL{t&g zG%wp4yu$?W8?}JsO%NPKlD3L)GQfr(r&&{*rU=NzgG!i2Pz>3?tSlskq3|Hl?=ZD^ zFMJLkL2^i|%k73(hRy&jxDAB2v|4K%fxsvoO3+N_he72>UY9}J@m1b6G_{V=N4xw} zbD|F1S`m`8cD^=AGrJ0)3^8qBthjRv@|{4PC??2vX7EYaQY80y^k)HdKOFKUC&nK= z>4(t`v>ot&UlzV_cg|drSXSNbk5a_7UXOVwVRA;f1wz8YbyAZHur~pI#i&3R5Z>=nf}^ zJJJr*^AEz__$5|{9KV=Oj-tv`?Tq!sji;0I$YV4dHMy$nF-jFL!`eCnBJb*o`< zDvPeVU9}^6EuS}iLgV_1v4)?0-GoZaZ-sG?USNV-Y{N!}gyPax7v zHpx&igpbI|j>?&IU2CiDJz-sDU2t1dxnQb z@J7EjemkGdiGa^SwQMhu84icG_8u&1U|A3Kd)s~FWJDQLe*x?WEwF*!&wL282Ms{o z)Mf z0gG~{Xlbi}^em@Tv>s$_(xc-OG zdvhW5M2)%C`y(@81l$Kn*xR25H1{WHZWRuF5QFs*=I~%u)55g5Bs22x;%hIK(em)& zQ%TiqRS<8PYnvv5&N5fZX29nftEp)9m}{k34$(Ut8MsOtwLD<=e zqL~lpb|ft)UE=R@;nxG99?+D|J($Vu=YG+jbfQLBnK9RwoI} z>hSb5@64q~dp6ZE1OpL-76D-*rok#V9!-xUNHd2vNy2Vzdq1*aGgq4_L-tz zp^Fq1V2cq3@xwdL2XHng?LHT>!=f--+_HSX`#`k>6c6v!;52@_6oV=T1KN{w->d86 zc~8V&lXZB@tJcJ5Io#C#N(Kmrm2Xd=YCGa_61?Q2VBk$s@i~piqH)zwtT8z#^!{_2 zLpxQ7shP0}3w9sY4#+L1+adEQ-V8l>MKx%tunLk4!~$&AjHI3lB4iI(e~*IpTL7xc zt4L+{j20BFV^~vY2M->w01*nS57Okq&1`|*XB3PF32?stsEdF_M*12It6$+HytE#T zIM6P1@T$eLh{V-!I>#-!ZN-ZvW~%zR*ZP1FOVGWqJZ#`i_+R~=8fu8|%f)Y7{i4wE zZ;~_tAU_nORezC7*^Kf4ggxAXawSRps4S~C+yk1oi`0xf^>A9hRF+#_UHw{W z%Egz@FPm$S$Zy~ca0>%-GzO!hs#Gw!EAyWs85S?p$!pqI@>P9H`sh$ZU#BW_Voo^} zBHuhAT+b|yI>?_^&63zp1mU^niBhvWWI5O#IuO0&g7rG_ z&8~leBP1qNW>*Ag(8?TEnzP?rjNyX@#)eJ-Kio&7>Zl>ny!&69%HU0OxkQIPb=0Xu zvWRg=lEQ@j*;);7QOq^RUMq=I!C11N6goeFtUA*B`^NgpgOtSAYH6EsnV6F(tgi)2 z0H^3wl~6;FAhs4wI_|Ud?)k(*OhDh@@b*l|Lhw5{_NU`m9x@D$+Thgs`?VLv@sX zFNS!^ATQ+_O!R=WR=$2W_00Td^I8!x^jIn~t^N#DoB1{YIL?gqa#(J0R@ugU<@ovW zM8wX3Xi?&CL0vK;Lr3#clE5wlDs39=fC z*C472!A-g$wj*65xaaF_n8YOrjBFy*yO1ormh%xoLckmH&RcxJZ-U4N=I9RI*rxb! zsE!UVLj>bN0LrqLd3J}014H}t{bZEF2uL3&E=?l98mQK34*4wLBkzVuZ`IxnIO3R{ z@501U?#kDPpTGnngdg83y1&Mr6)?*!NiYX~*z(8XU1fG}K-%bXjm;seZkdG9d?V})uy*J=dY{@#>Y^3+!nizxwf?~F7#;N*0T=N) zqFFEPc001)ix1KcVJabb^-fqPPdt=!pHoAFVOzIMN2WwPruM>0FA>Zzaxp~ct7+<| zAyUE8;Z^yKX(xmR7P|;1e!jg7v`-GM@$Uhnq+EZIz!y&IOw!^|^2`n>fs`}>2xesH zYy@M?6^O%+ZN2EJ`U=+v96s_0X8DK7T0$<8+)HZLu^PiaPVS zoV85=w7uLn0ernn?FOwyF$4*HB##?BSw>iZ&Q27LMswB4S&lh4p<2N9Dgv$d+Xb6P z>OAArC|!-z1~?Oss&1=2>>0WrN$NwW_Ulan7quO@X+s0`V`BKl2>_#-Cd)+gP z6WAGXH8kXNObRHSh2$M-2g0zdy zujqJcv^8{=2e;UAZm(iMdQ5(jacwVw>_7xrJi1Ejl-B)3@^gbP!bG9jU|T4Ua(sp1 z*jKWF$|QGaI}Be01qftB2N z<{=r`T50c;$kaxKLl-$)YBW4OsV+CEY1J@ke+9dvdHm%UU(-3Ab_0TVeL_6mUPs~($uX>qq2>dyx67@ z&aGyLMFV(PUFy+D;oChi#4TIvPCZ5{sdb6)Lc|Zd0Cd}bRL;Gb+Jha8NOO|QfN{`o?)X28B>}|E-3`X@U?C~!A z1LO2cfl|5c9z3(p!^0a?QKewl5~+`$X-+LoV83vdCEjJ^&ZFL$tsY}CW4GPCFKN`w z4R7Tt+}5vTO6P9g&vhxfiFg`(Gp~<0Rv9iXU{nuW{rs#_b>2uesZ*mcDhNQ*j1x#$DDyVa-zdB&Lyv_7id&{)1Cd2n;`GxTVHi3eJ z6ljtLH`^G{JKxA%oU{+($l?Y2&BGmA)po@gRL-~y)eBX<{L`lMPt|jmIh;9_pt(gb z^a1qmSY{O7?@iS+j-)d~SJ)W^)con5-=pvPUGN>qAbYl7=x#i2Qsi%Hl??jcbgIA0 zJS;tQ(0jtQPO|^2!$RQl;W+OfsQKmxa>#*(b&`&mK>b}6?(g$r_)mMj3kMxNJyoLB zzl(Ax(ax*3{q+LLnPaGslC2h3O!xPz)bwgn-rU6h`29_&X1ddBYF`36N1g!loDj?% zA@C3(zSD;zzHxtwZ95h6-Me?sEG}M!a>f9(Z#og-!;-q?sn^i_DK)TDkHV3W1htQ0 zmd4Y1z*g<(ZCp0L2qu$3I1Zt`RYqXaD#)6!E;Ie%{&U5jw-!qU-w@l-rkn%OHLy$Ej4K+l`3&#+TknWd9H409F_u6wp>Ar(rOg zs^9ichSQ2(=+lfLibcfaGK9w(iye6=4lPm&NLvC*yrH(^>BzCK10t<&s(lJ9iq51ogqkOd;o7!rRpNp^#bOa*VKt97uA9aT?+dRGi^{{!C8KNKv) zgP6YHO&JhSbZVz;4psWP$@HsLdfb+3W*pjL%2T(#y7(;_#w2{a4&Qps)tcI`2)hAv zjdJix$r@avIB?N@8w|B7c88p@PcYs!>P#i@m|b+Gz)*BBrfwh{d4P)FlsJ4=$zTll z%HeeCpHhMuM-bhc4KRoqj2K|`#Ci)4a^)~MFGYafJTisrynrO2uVzeC zGSQrv-6El6KrcWOjd~gt8ZJUtN8vv+c^O)huE}#twatKHd~L^Ox536oX&9}Dt&??Z zOCR3Zs{!c2y|BALtE{AnLN$K{QOE+0{@4S`(8GM`K)n0IZM_A!K{4EQT(G$&`MDa} zx+efXZ}$PSjz6UDeX9a;K&zUBl&dW~y`n&dhygW{1iFG20Cqa5f^JFGTSFWsI!q3_ zJGeC0$L|no<#fD|Zg(F|5e)$&a}2;^)+>#Yn~*!)UFKAIm%})MBb{n)q!7IONS>D~ zTM5u;-j#lyq7@Sjpxa$)XFwKC=XLLOx)|jMQ2W_WX22Zfg*EHe7_o|&aIFV3;mI;S zi!#obL+`lbM0M2;wmbSGS0b2*Eiq&T?79!u_ZdN%`7TcfYmF^wtGVPtG7m`FCuyobgoXiCAny7o9Eh;s z7v6tBzL;XPE5T9C*Ot{cRLhIqArDPYO&(aA1@G!xwr$!FY-XT;eG|r52kz>VpiF=0 zR}W2$2oxv@(5*VDpnJf;D*&F8Bm}{Ps-80QE-2y0R~_5t5tZpv6C#Snc9@Rbj;W2sy-Glkd!NnC)$SCOI(fv9s(jnL;`t7^06I#(RQTmLnlLJeYK400+ zwSLeX`3Gpk9m7ha7<;9k>k!G$pQ!0r&WmDDV@|ksAYA6;mrVbu`%UKLB^S=6Tol#Uz<38S8AIi! z&T6mr=b+Rz`T-vee=l3PkitQ{lWI`I#@CMlV<)~G$h!P;PdDAfp=h@-VWkc}uBXmT zm*Zn@z9O4cF1SRGbze#yoJceDPKoxD*j0NpK2OEC(su=d+ig$$Ob+;UOxMtpw@cD1 zUfZ?@^(K+5pYHk9qNQV@dDu*?O}jCU@WXMkDxd3kAiF$}jqi4{rXW*j6A643iJdBG zLYvO!7*~`9T~B3mrUPTchesHh3^ac%SxDUwEYkV@JDZ$*fiHQ@&~s@VBS? zWenjbXu^T}&2Nwt=z%}|T;h77G{!aQ&)LkMO4b!*v1&^nGk|Wq{<^nD>flVu*11GY zK`b6dE6Mg9z@{8|8r};dQ4CaaEYX z+YFyCaa+4R+AL%vLK|?VUdg%d6OL+WN>VI5^qs zpU^=>g*Uqd?0i0)?FN5d6=@GVd$p2SNh}(L*}|o?A9hF~U=I?1yG4>QGBv+(q$l(E z`P-85kvge`KQSRZ#^_0V$oOl%qtIcl)`wbDeuwQg5#Ws{v#@(1?vbgAQd1ZmEy>8M zQF3!Ws5XpJYj{E-Oi*?cM#-P3IZ=QLbLPE}1+3e3BV=!cKLaJeH@`^)A6bTI$CI#w z%bwc^I$DJ<8U=9;0LXlZ#2sJ&J;1i|cAr@WU=PuCtpWLNR%oO3dEnVIh(|S|-71Ph zTsUh09-LX8bzs$kN(^!H89@6g2wk6;J0v}e!I_l|N~XOK>UHbHvk_~>lkW5GBP?0$qwxP@=l9bFtrjRi<8<{CWRLGP#C}l_)vdKITWynV6 zkZGIe>ARovp7%ZFe1Coaef|6)?7i3Xto5w>zOVbbt_7h5>Be+v1G~qvF-f|pFA8?V zc<^45FGiSpxV=f}S%YFR$7=y23_s9$;sH8X29gy5f;j-%)j+iHPMw|bs{?LxCiim_ z0xtrKDjMi~EVR|dz_;iq!??#^a7ac3uk{!Cez5&Bv*RAdFm6-51(|@AUmEmUzDlPI)mAhF{bo2h98uJCyxrfOf1vXP z;XLGOktlXSPGu>eYZKtn>II*vSl6_P<&^aS*F zXaf&VV}a1LHV;N`BF;Zl>5_(ngiI<9fw@j{MX8m)DFrKa{^@`{U$S3VJc`iqD{bIx zcT;13N(7wAanNFJA?VgoEO`7B-wjx&BrrS7ngt?_*O@th$`MlC1Uj9V3 zscJMKi);O}<`G>p_aL=R;kj44kg(etDt|Aza>4E8RXYnY4!2nx;fTew=we0$5J#-H zKzR!UKnZ6+r*6^X?o1N~3~xCcO{K({_{Ri1RKa9Xf%`>*@A|5GX{e~T0xK@;5TFRk z3sk>s*g`OHQsTA=RrU`MNd2V-;lPDWID_I2kbVSGi4fSxftKjRpjH6M(JJ$amiSNS zgaI@?>jt8#T#pNOxR*Sp38#oS3a?(emMUWxGuxdVdoMGP5wQ%uA2tpyy*JQDVkz~h z^Mb%QC;yYo32{*QYGi06y5m7PS9$Fb%M5+f&7 z445@zN-eMU!l5QpYwABP?k?Q9$R0e=_tXy;SaHdF!hp|p$1e#t$O!D&t4?cQ(OvA= zM4QtlTf?tYG$=RR9bh(>;5OdHD3)&G*fppB4+Lpa$D_G`tHesP?$@+b89 znEtmrtFlW`4@g9iQQP;>Z$I`WdUY5s?x)bB*Pe+fmu`=^kW0xjoAz9UexFOFg#qc;{(L3MX& zv_4W07-TUBMFc|6pYTWbvWsCq1UCX(AL(jf@o>ZTjgZNtw@MN*??+0+>MsA&EoVPU zJ6zau8if{1B9cGES`P5-EpV75j|Yo`ylc?);D+Y@b1=4Qg5dT8>N64WVvDo@b4z~c z1CU1V0ac^{a>{_3kXtnn1Gy3T+%&3}+Q>ftmptU3)|Bw`3ZUnvLj(}9!wJPpx@3TN zz%@jLi8y+ll=CrYw}ssrp_Ia+N1Ek#APOSN%!jm-`_l7>ei|qNPlV0uigk_3y>3I# zD05J@i-6{#L?D=%{XAb2ONPWxgwDFRoU(7N4+dV^!kfU11@5+r*c?=-vCt|mu|tla z@5%tTA?x$huaTA-;tc?L)sHfENmfJQ`=pa=B7jepCJ`rHC2kd1#%cgaeqgoZ4MKmkFLs-I;mOBgmjChTFKgON%5Q%k zCz}ytvabdUz&EaX+XITkConOeJQ0zx+SAidPN_!8vqzzh#5_l0=J%2UV9<-HeuJJ) z>9jDbT$e*2`_YQAVD}Z-%^$RC3F7aLieraJ@=2)JXB(h%Rz3rFRKnYVYW!LX&HdsC zI=<)km}*N{zV{wV;E?}ybIL#-t|?L9-Syjq3l$~XODAfi6`+T41IIDg-roLf2TUwg z;n*gmPu~F^?wi2aG_;u@+T_3kW|B5PJN_SjvsLtJ=)30&ec)}V4O!Bk$rnNkpvat} zSC3&DRIrV zj4pVIo^E>S9b<`oSU7Onwtx6-O3y!g6ty;Kap%32@3l|ATFII76J%~UlMq%>R_+J8xeVV4Yc#U2hXm;A8X;^FUr5TtgUQ zR8qWo{Y*$rY`K5k#N@j;Djb@_rOcJC{Igm7XA7_30w^=mI_|)(Do>~t0^4U76QADY ze~_pDjGh%C&?r_D{k}m1{3(Tmng7S)#8-uIBXtS(9G!2u#)42(bb0}^XfbX`y9%g6(khlIE+mJ{~b z9GxRp3ab55n6u#_9%3}`Np zFu0|{i9b&hQ6ATqCffxek9`I%#%e%|(vipjl>}r<+@E)r!cGDW0K6+Xp`rW?>`M^O zmJi9l^x~251PqyoZzPeo;12zlmi%rTFx?I~^h7OAC>2aY6?S%Zx@e*A&-U>ngeF4G zPB=!72Ru!lgFCW(PXM@DnQAz29YNvU#)?4%uw1fU_?9ve`!ST zkq)I{lPT=o2)_aReo~z;!>)(;1stV2o1TK8>j1_6SRZauNxX2%#L1_67jpKJ37a{L==M=?3Y9eH1$rWi_Cdxz)|+w zIzr&OwPGXbHXDb~Et)0jiLmwrM>&qppG6tO=_~&%gVV>ZmwDcg^Z?^#E(lcJYv3n3 z{7trn9EWIVlG3t8|30-Vk+4>+4NZ_@#M5f zphl2lQ2y{=V-uD|a5Gt0fk#WliJQ^zlj#UqK)&F;oQ#?<&@?Gg8O1!6D{&r8yw+;gEb}tSLpMnFWO9Zhg{J;KkfDM8ig}hj@Uj z!l_4EWgK8laf4$Wc;t-`m~~Fei}kHRiKLcy{zTX^a?DYQfuihVBT{8 zL;CJvA}*{ZX$ETAHC^l-_4B>&5;>b(nmY`dYJlm%GLy=#izBE1W2)q3HJq;_zPtE3}EoOvz%* zMw(2~op6D%Qo945K6%3+_R2NkP%ct>O@dA8;g7!VB!j0y6+(H@PpF5xg*a8Y2>00c zff%wvD`LqcrM74@*`m}sQr_m%yOzq2)uYZ{@RB@?%F3$7ji}du zjEQUv5Wcj3oLA$mktQwGb_E%mmE)2;Teyj+$J`z}rH6V7YCOpC-L+KzHkN`TT`}Gn zEa3&EB{7h0dSCPN!H9-vrO2qrJga`Lj*g;9^bX9VAHPPmW$QmBy%ktKwrBEp^6!_W zj^J9*by>64JTyqmkEfYcI#c-M7>m>mhHRucT<$O#=(nRgTRlTUWrCn9z#$L;?K7SJ zLIgX4BOr*ze4i;_8Vge6uF6)@64IE50L3Ny=lAy(VJG-*suwv{r3Ib~#$ApRG?r~O z0=&Gk6s_x}zz*!ETQY{YqmOn9y;bW8vEX<0$?!eYoE;@DR&*lZK=cIuGgYXLUZwut z`;sg|E{nm4nSU@}hR&!2QsgU;xfmMQm!FQX4_df<$>0^mCD@4$_l8Jxkr9NL^bok= z2FY?cP!_nQDT)TF+^p964?+3d#HhT_4i6`?QuM$7De?4ID<90bPUM!Y5N^tsPGf`jjCAGS;kY)eR4G|QjN)0lbdr;rz^sC4L6fMdxb^i7Wr;%Pk+E{4FDHV|xy!W3b_ut}(N?bPP0d{=UMf?H&9AJHjLd6Ad(XO9$+~z0 z{e(_-gZMh>QOtIleM;jzKGcia2ft;vlpyR}Pcr`1UDG_=HJu}ph1y}c;v>_8aNfAl zGI6X`@H#`vGlnU2(QzXMX;iZ;247)L@s(1VB64^luYhXp3^~Ki*B0)b^`C<0 zyZ;`x-FlsclZn;Y&fDUDYwgm1`q^jGRHW4^R7fE=*9R=B)zu+Syb(EpNIBTP~M&{7BkTg8oHk-vilAR!PZ zaMzH$*BsvK;$L=vln}~;WW0^?@0kxwkuV7L3|m+qtR?^ccI+<@oP_6aoAm0d?E4iz^075^9hQNi`9Il!lh|x#Sh|}nYGpOm63`%$Jm73~=t?%Om z)zBO#R&!qK^N92sDXJO*K~uyFtv^70M)ZJ=YH zsgGofjrxWGyc`0I*n&v*aaOpFh3SJ7&=o@3RX)g9t#(R(qcvnu6*VJtA(QarIKj4XcPH zMW4e%06GVhp{Ib`Gy{p_ubb2w2${7u5VW|V0r+JMZqgm-Q}EmdDB%>K8ZL(YynkC} z^=o-jR#Fd+wiTXH4QLmxT5;M~7|FT$cZ0*#Fl6<|Y;S>-Y@27Ix0{jla>&Xb$pcpB z{i_ zC$6GeUjTnTP7snkgZUzvCOLboU6T2Q6Wq=sp_5PC%J9W6W_5RbprH2jm}p^Ibklmg zy#wcGigXu8aJ)Vo)KX@NUxg(2^%r-YpAuwK=-yqI8{^%7b|&lQo007aBDhuHhg_rc zjOskg4qe==4E6?h(OriE5%m{;-_Tha-OZ;J$}& zX8)2%AY@*oa}Pk#HGBVKg;#a6c7ZFr1Vvsm*x;vwH1v~i?ek73IR9(Zk5nw@A|*a( zfye(D@PtNM9CP;FZ=MOPz|D96miu+h-4Fd>|TkAo8Y#WdSRq5g~eqBRp<5pm=Km zQpFCXZl~>z-@A-+IP!LW-6ES#<(Yukmr$=dgRb-9CL9M~%e0{E6A1OA1{35Ww{sV* z;6(_0i0Dk9mBkTt4vuH($n3~sHh&Hziq*a<0n|HCk-YDEr+*7Ews)y%Vd=7!kf=Xl z#2;=0RK&kD++PUB5<#uvjq`nPVjtNJi+mhpd!2g^7Ai@QQamZ;G}LJG)-sIS00T9G zb&xB61<7i^IcYGAb^zK`mAdA_wuBQGwnl6Qs|4JanZnMC%2MkyV!*V0A8L&$?*LC4 zs|f{YA3a?M%yS&DLy9gdb1L05LEWDgpf5qhC~8n@e8n)V%L9kkmC}U&Yhg)!1r6b$ zld~oMytAQ)3xF!0RUx)cSJz!G2&MEr^{*Zl6WkNA1IFP61%tzQ;}wgA;r*V$O%nb4 zI__S6szi?iFMXk@iX@~_)#q&xi>fo8kg@%p7&J(7jGa2V@klCo~^~YVC{=wVF z!>HJ=CR7*ws9Vl1hDV9^kz#AjOXa3Go-@MlR%|#Y9{%Aykm6#1T@{}!$FR*C;e*x< zMdy<+ZM~SeGP&(ZDccl`!v}yo=`Awngz2B~)*bE>vRIbA%9eA>_=ilPj!2tCcXzi1 z7>nis;`UkSz3Ej?tYyH<6XMS$h)~eIM&X`eXWCi z|3;UveLM=ywwON(g`1L0Z8;(bs`~N*R5xD>J+7(r2Ob$6H$V9@vd*V*SAw{T{dxSR z|Jv+kDy3lA%Jo-FaFG-pMn^|S+Bo*zLu2Zi? zEZtak(bYckG3qf6Z!=iaM=tb{C#18W%=%U z;)$c_teUxkJt{^cji{i>d%z{C)n%?{an+_uZ#8IZLp%c4B{T2EWm?~orK(w!ty|6e zIPpQxTxjkhCm|<0p~5qHg=A?Sx^N)|de5B_$4H@%cc2ugRjf&`_m5IK6ZRO&I(k~a zdh<&)QQ&~8pD$!mIjkulYyhJ5YmDBk$w72slspxHw9qNj_Zy?%ggVu5J~_e{^M}4a za&~#-U5{klK?eFt_BN>|h|uCtx6_}<_E6LF{+I&gngGwTt_Hrq@xH?A z($aqD*y;U92%^($rU^&UALF+)h|7{WM<4rx#5|acF?Hv=6|;cm(DG6~qxq}y={MO1 z7ETCu66RSW->`gXKr7`b*%(9WPU4VTzr9jffum_Y;Y2R=*B{(*)53#k`%ZZ$MhRvxM_>q5i* zNi5C*i?{vQuh(O~`-R>*gddQyjZsdvoC^+APXl~nVoO4w?tN|R)d=O4T|4$Uh0R9a z$XICMGwxmJdacBA3 z(Q1p${{_|($woop7- z+OP92Z{h8W&byB*Wd|oMzLb!L`jS!{A*^OTb4r=9pEI7?W#o@_Qf*B%=cE+)xZFUE zAmYL&wQAv!Jpr{LA(O0{ud|8gVB2J%eaP0k7FZwVm!ia?%u3G46K&AY8Phlh)aY-c zYFu@^!6*A4;a>Qgika1fzVceM8HTn<7zV|}ZHy)pl3Exod6|F_emm40scwW$)WtrL zWj)^JVfHZJf7tZpNxQ{L3{!Lb%$OGh-6IS@$nV_R&q8cvb0k7UgP#?h zkF1t)==o9qSbB+;JCcNov4_?n*JowH2Vbu%_u+^u#sfuJk7I4f?a?u^tU8`@MEpLv zd&gZxGjG$b343l4^F_w(XEW<=W0O8BZt=0P+giCHlc71-{Vnf4)?Efuey7xOvy==6 zvFpb9vp<_=Dmt52F`rJ_C># z;&=@N&F#zb2dkG39dckP)m}nj80Efw()9Kmh@QmyaB269*T+3Ti{9+Wd7W~$G9i+t zPN7ah9F0@<@Z8X=KRXb}?cFpPozipnmX4F5$~zAtR#hF$Lb22%U((QuYaCyqoJhjM z1U_Zyz65W#(2>Y?io);ASqrW&GRtQB*N?=_6a#%YY|h7SYD|q=nQ*A1(TxMEA>e`f z9HFtY{FIK1CIB%yretl4R3}9@G*Ho=)_m(>lgL}Z?}iJm5`VQZI0PATm=d@0sZH-; zKN94~w;;c$NxtA!4Ei!UmrO9xSb<7ESSZh=iT-5Asyp-PW=IU|?=D@-7kV_l^4`(a z8#;3QSb8jJ`}xt~GT(7vupDhamfRFaAC`f^mt>NXy9X+v<}nL5m}GN47sv1AKYO|^ z1i;btu4l&ew$r%L9&>7yEkSqa0w zGdU$8ihY-F+}#md)QrWZGpsJ<@mwB!u%hZ|D=gnaT2{h^Z7OYos}flhpsMoVTIwh!Hpt6$ACGTua8x234dPKdP1xuQZtO+X{j zOGa@;ld5@F?sdA?nM3;gZvsu!QR>8uZlp%1h^;9E*u1hwzkQ)2T-G)05Cy;nA6DD)qAUY6L{&|YMW zZ1>Rpthu2_%xk)1lg@mbRgl$GwOr`an?Ny>V9F&`G>TdPC1c^l(&>MAbLsu@=i5)y zZu)$k+c7ArA5+~D78F+BD`90Q3|``9^GJ%8!?J!Q4-%knd!qT^zLL?BL|55N%X}?% zVtq+GCf0?0GT$durL2~BD2K0*1kcswU}T9m#Vrd^67zY7$$qikUs`$7cXU1RcA1Y7 z?hUfNIEK!gYxmq=kEQIN5*ie0vLUhSR#@6WH8Vj3@Tnw4Z7O=zAyRbZ# z?P%C83dy~jkgtg@-uY=!k*4<2=1ufE4wIW6tQQKiJxw28L8o-?eD7RZlkZRUI?U3( zgq<=VQj{l>N|Jvz_btz9GH8rUOwf!A9p}~mVo2^Am!{rr^azVh#)2#Zxl8iWWerNg zH=UI|T;%SB>m4B;an2&-%Cv*}b#H7&lHSLZwD2nQ3K@+SMU8$OnMadR5eqj^W3|y- z+^b|lvdaP`S9~CZM;s>8r!($>k5x3uqOpGDbfN3zYb+#dzkPkNA$k*DI$h?K^xS1! z1sUXTUoVXbMetj-X$il*2;Rfdj5^B6-K;Cd`ONQc$WFL>Jj$s@kage$0kWF^`SPO; z@C`4eO-p`y<(HrS^%p;5<=Msr_Hu52&Ue-ReFQL|muaL8#WPvc*DQY<8}b`jzq9oQ zY-9J}WG^?s3ASFGxb*LrpCiia1yI8KMxS?hDb&=xa4xg0jEs!Rk**^LM?&qlcD&+d zHF%CT{~77zzBQHE4+J@T=vOWckEgo|9K2ZjQ@-_-`o|KE^`DD1ZCsLWy6O&ADl^m5 z@A3G19*fRqQVhS|1Nh!=Ox+jC%|{RGbDHwFq@UFdIJIR)(;oOM0vg6sezN@{B(JZ0 zRXQ*!@()QH5kU%%u<$r_4nd9F?! zKQID6aT=IMo`uUd58lxiYVhfzHkV_6e7Mc)Bg0Y3A{>l z=le%8Y&6}$Pq#!?k@|}c?tk5JPN7#5R@qc+Z;IwE;^^vdDI0m_p75i_Wli zG`DNpiGptO7J+#Eq>mbJa+Q~)-}0*6*K*bQ{i0spCi?cEZ8jsRwSz~d^_1i0r2^)m z@3**CKQ2pKvgw)?u6(piGwNI4Ta?{iY;VC2Sh)>&Tast8B^fVqjp5Nfk2-#xK^V@$ zp)&jaD84l^ong)LvYr4H?|~hq0+RjoU1dW`8m{?c53CCDMVRFo)0MWQm@ittjYm%r z^hD8ZJk&Fx?daLQxp&!|%E=A-Ex92vPLroxe|xh0=xK&oq}8lwL+{sE6`Hxdi7JXS zZqE#t=1ooeZGt|8`j(^qR5D4(68}b%BK_5NvXB`rb)vDrc7hFN&DNu z~WiEm?#;C~|uhNpdchP2exBtNl zxEDPGYVF*Xn3VJVSiW(NKU*g^Ut=Q;?yWt)Gn;h$E#v-9*a^J${OOW~Ag)N+7@sao zT<^w>jD3usftaz8y4RjqejPhYa>u2;wTlIF#+q;I61+#v3eGe}B}vrH-l~tc$0YQ! z?Q3uCVtHEzU2=N)G=#TRMM#ZzFBi0zm4?g3?N^h~-gY{$n)I$5a_D;OAkO^c-FLRj z!M(S7;_Z74eG0~2Hx6GCV$`@2Jd(37B0Z*8pySd!v$-#sE0S=Y!=o$uNgb8BadZ`n zy7Cv>oHLKhbgb6vaIqB41DY@Fuh#K6k8hrt+ZPxcz1_cftYFzHgYB+n9kbM}^0wLj zA-?J*w!^})_2sr}%#C@9X19ell6QP;T#c4<$9D^O<3|>y$HWS@J9f{G^mFxiW%S^< zDIi0?`^@BoCR4vH?n&E{q~&~^mD~QFhz`ZXzOL=s<2x^9cMTdB^Z8o#ein7icYCLz zMlAv-O}K4219UPs4(y1noWAu_N$%VZ-Sw>t$CYkxX%)=xX6;nx#V>!GCLi)6~XGKqI&dpV@+T zcbJI{>#vnV`D%UHPl&lfMc-q7TVlUnrL{b9rFggmW4siV8X__>Hzrfw*qHaoU?Gl0 zmAETg^PG8vnlfIrz4ZA6o7&{V9HWTzygM%O=2OnqpA*V#Zi-CH>Ut&$ z3AoRmlkvSUuih^mle*d7m@ru--maGUESS;g)1-KYedv(7QK7d*s4jiD%BklgwI9k( zR3CE~4j#AMUz%I;#;Wwh_W#k$IKDr$yKNLerO8%jnH`8V+Rpf4fvucf->aMrXzY}b zeYV>f`GV!LolE@lLd)Y;wKof>9yHFj)Bm}#o-vnzX>$J~BonjkUoRSIJnyBe8SUxk zYW&;ItvHM$qtL&QSB(COJ1a>&k|bEZ^220lqWd^jjgbvqWH2gi^S!>m)~#AOaOG39 zdw%jltoOT(CDsxsK?)0<+d!ici|nm4Am^PUFJcJE6b*FCOamXQVZO=*i(q1ivwwhJ0v zbem_?b}Wz1D||8yF+#oEC7W0Jw82od;lUN06w(?gf_LWpJ<0Lop*10h46!^-Zv4_2 z74$Ci@DuAhi%f^5%R?ln4c}2-88q{eDZ68S`M`dvr#75;=3SS-Kr1^E`1WK?L|rfF zlX!$}-rp6$Ck96R_7HvHB+O>`pqk$${#gDkm#ne-P{k0&PS0{nE3hX5Tf5`w$mFhZ z>930Fe>o_uP#*>SQqZ~U0v`i-jE%H5P5?? zwhGn%6-47I3?t(P%KPm!w>_hcp_=0ozR4VWArf8{3a6d^tdr#ut zbN}Sp+4m8FRC-ifhXa`c-@JT{qce<^ZSyMdQ~S%FBChy4X%2VQ=Aa0Y^T*z8xIgr& z3a@%yoR3FJl+PsfIeX!FiF#e~68Ez9I_7oy2P9i{bc{YZE*)a{i=)vG8Ek0R`gp@(ygN)8=*e4FQ%`1sXBhxR06 z3YCQ($z0;SOYO4!U2 zO~uZ9jrrOoetaq_Dqc$+U2fUicYl8!{*UjHzO}VEHw%lMogK3s8?%|E9?NwuE-sd9 ztSqdoOz;UND+g0+Eqf+YtIPkL+}D& z-~7AczHdJK_f5{59Q(hy?>GPRn-8qemcnKxa7kooB;FYJ|e7r2yfy(w9=v0zyr zSXK_e)r&6cR(DFDEOx2bvJx;dJNo?XBcj761+lRI{^fDwRPC#)=`DCTcvS9KfB$kn zQ#)bTQ)HEBGEmr>Z#Ha-d*Z^4SE{ZQ`KR`Mn+k(Eefl(`O1`l|j373Ha&FRiLl{fo z;Xr^#RL?#%UZz&on_c+e`bdAV`i+TiX`xvbEN`xjL)%-ez+;k>;hj zP$&)~Izy6gRi4LsO8S-P+`h{pxBW9(uq#c;%$4uo;vTh8I3RRy9q2DIs)21ADZjSYv6l4K3vECcNl&R zNaah^3ct^l@U%m?ggv7lp9MIx-#jpe*oQA2CK97d_z}ifD%8?kb@2P<&N$oJpK2y+ zdJo><6D%Qx!?+p;&g3z6hN_mEU!dvkzE^~tzU@Zs=2(Eh-1@LvKq1!u_>%qU+R(nL z47HN3A?IZYqt29&D4Q-NkHkUib_v_@5Jlxo^)j4*ik-Foe4V<}?G^sceFlk2%M)MH zZ$CfnVUuUIFi;dK;O3et8!wt|!+BtQ@N}+t$m?aZoAl{?e0HKBghA13tHNehp})k= z>}Lu4$_Y!8-t5nwL&}_59}aJgJU%fu8SR#@7wyu;T>kUX*6!Bg;D(`y$H2m1$;bIY zm-Rt*?P}le0>Nqdt0!EhH6A4FpLJL`q%u^ULZKDQ_}&YJV}vCmo&;%zohj_Pjjz9J znRF-1)tu)rHFn!sRkW`tkV#j*NycIN#$~Nn&$OF>rE~-*+i`WKmpV-K5!^&M!Kc#A z%+en(9;C?Exo%F=%yy+ms#&+*QAkx_a+=GkDW!MbKOy1bcSl}(rri&^+MA}7GZ(Ih z$ui0)s@`0ipJf$4AL5zHF=YP{U3%B=e8`-jl)#QPiLb$i=B-QHAwfTO%6TIKunUr&De@uLt^UvY(oGm&FTq7D^WT3Wi;0^TooL=lNIXx;m2O;Ps+SH=_Hex5Sz)Tvl2| zOz+3c*v|E|PBcfG^(j=(z|tykSe__iTWKSpP${*~qTqM#K|L&UTF?LRlt85!!{?Ho z{rq2OfuD4ad0alCq#Vkj*F@f}!qm>QSh}3{=<|!U&mA5RF(t9OQ~ANkeOcNfuV(e{$Ar?;r^d%}({KD3w`#U5 zV%dIr;1SLmy!IZ> zVI@)n_9=q>bMI3rM4v{fi--1ySC9W~rwx>dQYyAKxI1&kMd(0ed!$f_Qo3o_;oXbf zVzK|W1xIx78C46fef_~m;yW^O;O40yq#joKUyP`D*_SwfdLDRZ5>fAB^ zj{291;U`XhIKkNRnDK#&QQdNcQBuw!s)$Kz658LOsXV{ z-ZNPbP}3sIr@Uu5C`X`Epl3?2O>zFLn58epzmt(F!s*AFj`R5(^7w|scwEgR%pVt} zG*%N(aL4DY(om^GI;_pEY_wRz%gZ9<-q&ycxjU*cm~rTBuGnYc4=WoqsmoPZ>S)ho zM3cQ9mHk{7M58iR?Z;%dFtFCdv)CiXQl=B_{Nwpn#@N>SVgZEMVu8&IYJ?Yf^`Ad~ z9?IvmHYGf|n4Ekjqw!yu6nyBem;HgrnCheo&LqYuBhR3{8l{AvL}WbQn^R-hk)#!- z;aaph)%wx2aP)}Edrc3rhr{JACSN~2?@E@VDVd7(Q4P%3{c_%@FE^Q|+-g!XRiz-K z-?Td;Dpf8~lEP`k1NRYu*U;ZYK%?YNHG4%0D@=rn>9BIHzE;KVW-1cV2+27$+4P!n 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 MM_wXbOxyea0(6~Q2mk;8 literal 0 HcmV?d00001 diff --git a/docs/user/app_detailed_design.md b/docs/user/app_detailed_design.md index c3bf1d5f..ccfa3967 100755 --- a/docs/user/app_detailed_design.md +++ b/docs/user/app_detailed_design.md @@ -52,7 +52,8 @@ To learn how to extend the app, or update its default YAML definitions visit [Ex ## Detailed Design Diagram -Here are two diagrams detailing the SSoT based jobs in deeper detail. +Here are three diagrams detailing the SSoT based jobs in deeper detail. -![Sync Devices](). -![Sync Network Data](). +![C4 Onboarding Overview](../images/device-onboarding-4.0-Overview.png). +![Sync Devices](../images/device-onboarding-4.0-Sync%20Device%20Job.png). +![Sync Network Data](../images/device-onboarding-4.0-Sync%20Network%20Data%20Job.png). diff --git a/docs/user/app_getting_started.md b/docs/user/app_getting_started.md index e58b1748..0c012bed 100644 --- a/docs/user/app_getting_started.md +++ b/docs/user/app_getting_started.md @@ -38,6 +38,6 @@ Navigate to the SSoT dashboard and run `Sync Devices` to get basic device and in You can check out the [Use Cases](app_use_cases.md) section for more examples or try out the job inputs with at least the required fields. -![job input](../images/do_job_inputs.png) +![job input](../images/sync_devices_inputs.png) The Nautobot job will pass the job execution to the worker which will initiate an onboarding and will reach out to the device and attempt to onboard it. diff --git a/docs/user/app_overview.md b/docs/user/app_overview.md index b4758f3c..f054aa42 100644 --- a/docs/user/app_overview.md +++ b/docs/user/app_overview.md @@ -9,39 +9,7 @@ This [Nautobot](https://github.com/nautobot/nautobot) App allows to easily onboa ## Description/Overview -### Original Implementation - -!!! info - The original job and extensions pattern will remain a part of this App for the near future, this will allow custom extensions to continue working without causes issues to users that have taken the time and understand the original framework. The newer SSoT implementation will be discussed in the next section. - -The `nautobot-device-onboarding` app uses the [netmiko](https://github.com/ktbyers/netmiko) and [NAPALM](https://napalm.readthedocs.io/en/latest/) libraries to simplify the onboarding process of a new device into Nautobot down to, in many cases, an *IP Address* and a *Location*. In some cases, the user may also have to specify a specific *Device Platform* and *Device Port*. - -Regardless, the Onboarding App greatly simplifies the onboarding process by allowing the user to specify a small amount of info and having the app populate a much larger amount of device data in Nautobot. - -In most cases, the user would specify: - -- Device Name -- Location -- Platform * -- Transport Port * - -!!! note - * `Platform` and `Transport Port` are necessary for onboarding NXOS API, Arista EOS, or any other platform not using SSH as a transport. - -And the Onboarding App would populate the following: - -- Device Type (Model) - Creates it if it does not exist. -- Role - via a Role of content-type "dcim:device". Defaults to `network`. -- Platform - Creates Cisco IOS, Cisco NXOS (ssh), and Junos Platforms if they do not exist. -- Manufacturer - Creates Cisco/Juniper/Arista if it does not exist. -- Management Interface. -- Management Interface IP. -- Serial Number (when available). - -The goal of this app is not to import everything about a device into Nautobot. Rather, the goal is to quickly build an inventory of basic device data in Nautobot that provides basic info on how to access the devices. -For example, getting the Management IP and Platform data into Nautobot allows a follow-on tool that uses the basic info to access each device, retrieve data, and then populate Nautobot with that data. - -One example of a solution that can retrieve that additional device data and import it into Nautobot is the [Network Importer](https://github.com/networktocode/network-importer). Other options would include an Ansible playbook or a Python script. +This section descibes the new implementaiton (SSoT Implementation) and the Original implementation. ### New SSoT Implementation @@ -90,6 +58,40 @@ Additional References: - To understand the lower level details of how the Network-SSoT framework is designed see [Network-SSoT Design](./app_detailed_design.md) - To learn how to add additonal platform/OS support visit [Extending](./external_interactions.md). +### Original Implementation + +!!! info + The original job and extensions pattern will remain a part of this App for the near future, this will allow custom extensions to continue working without causes issues to users that have taken the time and understand the original framework. The newer SSoT implementation will be discussed in the next section. + +The `nautobot-device-onboarding` app uses the [netmiko](https://github.com/ktbyers/netmiko) and [NAPALM](https://napalm.readthedocs.io/en/latest/) libraries to simplify the onboarding process of a new device into Nautobot down to, in many cases, an *IP Address* and a *Location*. In some cases, the user may also have to specify a specific *Device Platform* and *Device Port*. + +Regardless, the Onboarding App greatly simplifies the onboarding process by allowing the user to specify a small amount of info and having the app populate a much larger amount of device data in Nautobot. + +In most cases, the user would specify: + +- Device Name +- Location +- Platform * +- Transport Port * + +!!! note + * `Platform` and `Transport Port` are necessary for onboarding NXOS API, Arista EOS, or any other platform not using SSH as a transport. + +And the Onboarding App would populate the following: + +- Device Type (Model) - Creates it if it does not exist. +- Role - via a Role of content-type "dcim:device". Defaults to `network`. +- Platform - Creates Cisco IOS, Cisco NXOS (ssh), and Junos Platforms if they do not exist. +- Manufacturer - Creates Cisco/Juniper/Arista if it does not exist. +- Management Interface. +- Management Interface IP. +- Serial Number (when available). + +The goal of this app is not to import everything about a device into Nautobot. Rather, the goal is to quickly build an inventory of basic device data in Nautobot that provides basic info on how to access the devices. +For example, getting the Management IP and Platform data into Nautobot allows a follow-on tool that uses the basic info to access each device, retrieve data, and then populate Nautobot with that data. + +One example of a solution that can retrieve that additional device data and import it into Nautobot is the [Network Importer](https://github.com/networktocode/network-importer). Other options would include an Ansible playbook or a Python script. + ## Audience (User Personas) - Who should use this App? The Onboarding App is meant for new Nautobot users who want to start importing their devices directly rather than from another, existing, source. Even with other sources for device information, they may not include everything that is necessary. diff --git a/docs/user/app_use_cases.md b/docs/user/app_use_cases.md index 1c7d30d4..65d48c1a 100755 --- a/docs/user/app_use_cases.md +++ b/docs/user/app_use_cases.md @@ -60,14 +60,14 @@ The Onboarding App will automatically create Platforms for vendor operating syst ## Onboarding a Device -### Onboard a New Device +### Onboard a New Device Using Sync Devices From Network Job A new device can be onboarded via : -- A SSoT job execution. +- A SSoT job execution using the `Sync Devices from Network` job. - Via Jobs menu - Via SSoT Dashboard -- API, via a `POST` to `/api/extras/jobs/TODO/run` or `/api/extras/jobs/{id}/run` +- API, via a `POST` to `/api/extras/jobs/SSOTSyncDevices/run` or `/api/extras/jobs/{id}/run` !!! note The SSoT Job's ID (UUID) will be different per Nautobot instance. @@ -85,10 +85,10 @@ The status of onboarding jobs can be viewed via the UI (Jobs > Job Results) or r To run the SSoT Sync Devices Job via the api: -Post to `/api/extras/jobs/TODO/run/` with the relevent onboarding data: +Post to `/api/extras/jobs/SSOTSyncDevices/run/` with the relevent onboarding data: ```bash -curl -X "POST" /api/extras/jobs/TODO/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"location": "", "ip_address": "", "port": 22, "timeout": 30}} +curl -X "POST" /api/extras/jobs/SSOTSyncDevices/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"location": "", "ip_address": "", "port": 22, "timeout": 30}} ``` Required Fields: @@ -113,7 +113,7 @@ A existing devices data can be expanded to include additonal objects by: - A SSoT job execution. - Via Jobs menu - Via SSoT Dashboard -- API, via a `POST` to `/api/extras/jobs/TODO/run` or `/api/extras/jobs/{id}/run` +- API, via a `POST` to `/api/extras/jobs/SSOTSyncNetworkData/run` or `/api/extras/jobs/{id}/run` !!! note The SSoT Job's ID (UUID) will be different per Nautobot instance. @@ -126,13 +126,13 @@ The status of onboarding jobs can be viewed via the UI (Jobs > Job Results) or r ### API -To run the SSoT Sync Devices Job via the api: +To run the SSoT Sync Network Data Job via the api: -Post to `/api/extras/jobs/TODO/run/` with the relevent onboarding data: +Post to `/api/extras/jobs/SSOTSyncNetworkData/run/` with the relevent onboarding data: ```bash -curl -X "POST" /api/extras/jobs/TODO/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"devices": ""} +curl -X "POST" /api/extras/jobs/SSOTSyncNetworkData/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"devices": ""} ``` Required Fields: diff --git a/docs/user/app_yaml_overrides.md b/docs/user/app_yaml_overrides.md index d86fdab6..34240bd9 100755 --- a/docs/user/app_yaml_overrides.md +++ b/docs/user/app_yaml_overrides.md @@ -12,6 +12,7 @@ There are only a few components to the file and they're described below: - `parser` - Whether to use a parser (textfsm, pyats, ttp, etc) alternatively `no` can be used if the platform supports some other method to return structured data. E.g. (`| display json`) or an equivalent. - `jpath` - The jmespath (specifically jdiffs implementation) to extract the data from the parsed json returned from parser. - `post_processor` - Jinja2 capable code to further transform the returned data post jpath extraction. +- `iterable_type` - A optional value to force a parsed result to a specific data type. As an example: diff --git a/mkdocs.yml b/mkdocs.yml index 68bb3d8b..2fa3f308 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -113,6 +113,7 @@ nav: - Compatibility Matrix: "admin/compatibility_matrix.md" - Release Notes: - "admin/release_notes/index.md" + - v4.0: "admin/release_notes/version_4.0.md" - v3.0: "admin/release_notes/version_3.0.md" - v2.0: "admin/release_notes/version_2.0.md" - v1.2: "admin/release_notes/version_1.2.md" diff --git a/nautobot_device_onboarding/command_mappers/arista_eos.yml b/nautobot_device_onboarding/command_mappers/arista_eos.yml index 9fcd995d..9636a4df 100755 --- a/nautobot_device_onboarding/command_mappers/arista_eos.yml +++ b/nautobot_device_onboarding/command_mappers/arista_eos.yml @@ -56,7 +56,6 @@ sync_network_data: commands: - command: "show interfaces | json" parser: "none" - # jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen},{ip_address: secondaryIps.address, prefix_length: secondaryIps.maskLen}][]' jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen }][]' # yamllint disable-line rule:quoted-strings post_processor: "{{ obj | tojson }}" interfaces__mtu: @@ -85,7 +84,8 @@ sync_network_data: commands: - command: "show interfaces switchport | json" parser: "none" - jpath: 'switchports."{{ current_key }}".switchportInfo.mode' # yamllint disable-line rule:quoted-strings + jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | interface_mode_logic }}" iterable_type: "str" interfaces__lag: commands: @@ -104,12 +104,12 @@ sync_network_data: commands: - command: "show interfaces switchport | json" parser: "none" - jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans}' # yamllint disable-line rule:quoted-strings - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans, native_vlan: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interfaces switchport | json" parser: "none" - jpath: '{id: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId, name: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanName}' # yamllint disable-line rule:quoted-strings - post_processor: "{{ obj | key_exist_or_default('id') | tojson }}" + jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans, native_vlan: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index 93609a02..c6aa6ba8 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -43,6 +43,7 @@ sync_network_data: - command: "show version" parser: "textfsm" jpath: "[*].serial[]" + post_processor: "{{ obj | unique | first }}" interfaces: root_key: true commands: @@ -108,12 +109,12 @@ sync_network_data: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}" - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" - post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index d02336d0..996a09b8 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -25,9 +25,7 @@ sync_devices: - command: "show ip interface vrf all" parser: "textfsm" jpath: "[?ip_address=='{{ obj }}'].subnet" - # jpath: "*[].ROW_intf.{prefix: prefix, subnet:masklen} | [?prefix=='{{ obj }}'].subnet" post_processor: "{% if '/' in obj[0] %}{{ obj[0].split('/')[1] }}{% else %}31{% endif %}" - # post_processor: "{{ obj[0] | string }}" sync_network_data: pre_processor: vlan_map: @@ -42,7 +40,6 @@ sync_network_data: - command: "show inventory" parser: "textfsm" jpath: "[?name=='Chassis'].sn" - # jpath: "TABLE_inv.ROW_inv[?name == 'Chassis'].serialnum" interfaces: root_key: true commands: @@ -108,12 +105,12 @@ sync_network_data: commands: - command: "show interface switchport" parser: "textfsm" - jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS}" - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS, native_vlan: NATIVE_VLAN}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interface switchport" parser: "textfsm" - jpath: "[?contains(INTERFACE, '{{ current_key }}')].NATIVE_VLAN" - post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS, native_vlan: NATIVE_VLAN}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml index 93609a02..c6aa6ba8 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_xe.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -43,6 +43,7 @@ sync_network_data: - command: "show version" parser: "textfsm" jpath: "[*].serial[]" + post_processor: "{{ obj | unique | first }}" interfaces: root_key: true commands: @@ -108,12 +109,12 @@ sync_network_data: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}" - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" - post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/jinja_filters.py b/nautobot_device_onboarding/jinja_filters.py index 6d80f878..160859d2 100755 --- a/nautobot_device_onboarding/jinja_filters.py +++ b/nautobot_device_onboarding/jinja_filters.py @@ -79,7 +79,12 @@ def _interface_mode_logic(dict_item): # pylint: disable=too-many-return-stateme if "dynamic" in dict_item["admin_mode"]: if "access" in dict_item["mode"]: return "access" - if dict_item["mode"] == "trunk" and dict_item["trunking_vlans"] in ["ALL", "1-4094", ["ALL"], ["1-4094"]]: + if dict_item["mode"] in ["trunk", "down"] and dict_item["trunking_vlans"] in [ + "ALL", + "1-4094", + ["ALL"], + ["1-4094"], + ]: return "tagged-all" if dict_item["mode"] == "trunk": return "tagged" @@ -93,20 +98,29 @@ def interface_mode_logic(item): # pylint: disable=too-many-return-statements return _interface_mode_logic(item) if len(item) == 1: return _interface_mode_logic(item[0]) - return "" + return item @library.filter -def get_vlan_data(item, vlan_mapping): +def get_vlan_data(item, vlan_mapping, tag_type): # pylint: disable=too-many-return-statements """Get vlan information from an item.""" - int_mode = interface_mode_logic(item) current_item = item if isinstance(item, list) and len(item) == 1: current_item = item[0] - if current_item: - if int_mode: - if int_mode == "tagged-all": - return [] + int_mode = interface_mode_logic(item) + if int_mode == "tagged-all" and tag_type == "tagged": + return [] + if int_mode == "tagged-all" and tag_type == "untagged": + return [ + { + "id": current_item["native_vlan"], + "name": vlan_mapping.get( + str(current_item["native_vlan"]), f"VLAN{str(current_item['native_vlan']).zfill(4)}" + ), + } + ] + if current_item and int_mode: + if tag_type == "untagged": if int_mode == "access": if current_item.get("access_vlan"): return [ @@ -117,6 +131,18 @@ def get_vlan_data(item, vlan_mapping): ), } ] + vid = current_item["native_vlan"] + if not vid: + vid = "1" + return [ + { + "id": vid, + "name": vlan_mapping.get(str(vid), f"VLAN{str(vid).zfill(4)}"), + } + ] + if tag_type == "tagged": + if int_mode == "access": + return [] if not isinstance(current_item["trunking_vlans"], list): trunk_vlans = [current_item["trunking_vlans"]] else: diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 5dcba0e2..4df60113 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -531,8 +531,7 @@ class Meta: description = "Synchronize extended device attribute information into Nautobot from one or more network devices. Information includes Interfaces, IPAddresses, Prefixes, and Vrfs." debug = BooleanVar(description="Enable for more verbose logging.") - sync_vlans = BooleanVar( - default=False, description="Sync VLANs and interface VLAN assignments.") + sync_vlans = BooleanVar(default=False, description="Sync VLANs and interface VLAN assignments.") sync_vrfs = BooleanVar(default=False, description="Sync VRFs and interface VRF assignments.") namespace = ObjectVar( model=Namespace, required=True, description="The namespace for all IP addresses created or updated in the sync." diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json index 95c5fb0b..758d4c33 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json @@ -36,7 +36,7 @@ "type": "1000base-t" }, "Ethernet4": { - "802.1Q_mode": "trunk", + "802.1Q_mode": "tagged", "description": [], "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json index f8a1cc64..4b3fe8c0 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json @@ -25,12 +25,7 @@ "link_status": "True", "mac_address": "52:54:00:15:b8:13", "mtu": 9214, - "tagged_vlans": [ - { - "id": 1, - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": 1, @@ -45,12 +40,7 @@ "link_status": "True", "mac_address": "52:54:00:07:8d:69", "mtu": 9214, - "tagged_vlans": [ - { - "id": 1, - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": 1, @@ -58,7 +48,7 @@ } }, "Ethernet4": { - "802.1Q_mode": "trunk", + "802.1Q_mode": "tagged", "description": [], "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json index b756789d..7cb38097 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json @@ -41,7 +41,7 @@ "vrf": {} }, "Ethernet4": { - "802.1Q_mode": "trunk", + "802.1Q_mode": "tagged", "description": [], "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json new file mode 100755 index 00000000..ab9133bb --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json @@ -0,0 +1,914 @@ +{ + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "90", + "vlan_name": "VLAN0090", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "239", + "vlan_name": "VLAN0239", + "status": "active", + "interfaces": [ + "Gi0/1", + "Gi0/2", + "Gi0/3", + "Gi0/4", + "Gi0/5", + "Gi0/6", + "Gi0/7", + "Gi0/8", + "Gi0/9" + ] + }, + { + "vlan_id": "255", + "vlan_name": "v255", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "955", + "vlan_name": "v955", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "1002", + "vlan_name": "fddi-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1003", + "vlan_name": "token-ring-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1004", + "vlan_name": "fddinet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1005", + "vlan_name": "trnet-default", + "status": "act/unsup", + "interfaces": [] + } + ], + "show version": [ + { + "software_image": "C3560c405ex-UNIVERSALK9-M", + "version": "15.0(2)SE8", + "release": "fc1", + "rommon": "Bootstrap", + "hostname": "3560-01", + "uptime": "1 year, 23 weeks, 6 days, 10 hours, 48 minutes", + "uptime_years": "1", + "uptime_weeks": "23", + "uptime_days": "6", + "uptime_hours": "10", + "uptime_minutes": "48", + "reload_reason": "power-on", + "running_image": "/c3560c405ex-universalk9-mz.150-2.SE8/c3560c405ex-universalk9-mz.150-2.SE8.bin", + "hardware": [ + "WS-C3560CG-8PC-S" + ], + "serial": [ + "FOC1541W2SP" + ], + "config_register": "0xF", + "mac_address": [ + "2C:3F:38:99:15:00" + ], + "restarted": "14:57:03 UTC Thu Dec 22 2022" + } + ], + "show interfaces": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "EtherSVI", + "mac_address": "2c3f.3899.1540", + "bia": "2c3f.3899.1540", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan255", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "2c3f.3899.1541", + "bia": "2c3f.3899.1541", + "description": "", + "ip_address": "10.35.255.75", + "prefix_length": "24", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:02", + "last_output": "01:39:59", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "22819901", + "output_packets": "3049", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "2c3f.3899.1542", + "bia": "2c3f.3899.1542", + "description": "", + "ip_address": "198.51.100.1", + "prefix_length": "27", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "1000", + "output_rate": "2000", + "input_pps": "1", + "output_pps": "1", + "input_packets": "73202704", + "output_packets": "69356133", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1501", + "bia": "2c3f.3899.1501", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "1000", + "input_pps": "0", + "output_pps": "1", + "input_packets": "29688889", + "output_packets": "83895657", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1502", + "bia": "2c3f.3899.1502", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "133000", + "output_rate": "7000", + "input_pps": "17", + "output_pps": "13", + "input_packets": "1093822263", + "output_packets": "735080587", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/3", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1503", + "bia": "2c3f.3899.1503", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "92000", + "output_rate": "6000", + "input_pps": "13", + "output_pps": "11", + "input_packets": "694320395", + "output_packets": "572920151", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/4", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1504", + "bia": "2c3f.3899.1504", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "145000", + "output_rate": "8000", + "input_pps": "19", + "output_pps": "14", + "input_packets": "874533402", + "output_packets": "662307510", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/5", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1505", + "bia": "2c3f.3899.1505", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:17", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "1916000", + "output_rate": "19000", + "input_pps": "154", + "output_pps": "36", + "input_packets": "929711050", + "output_packets": "290370091", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1506", + "bia": "2c3f.3899.1506", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1507", + "bia": "2c3f.3899.1507", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "11w2d", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "38", + "output_packets": "75", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/8", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1508", + "bia": "2c3f.3899.1508", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1509", + "bia": "2c3f.3899.1509", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "Not Present", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/10", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.150a", + "bia": "2c3f.3899.150a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "65000", + "output_rate": "2319000", + "input_pps": "109", + "output_pps": "209", + "input_packets": "3816965695", + "output_packets": "3762396995", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + } + ], + "show interfaces switchport": [ + { + "interface": "Gi0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + } + ], + "show etherchannel summary": [], + "show ip interface": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan255", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "10.35.255.75" + ], + "prefix_length": [ + "24" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "198.51.100.1" + ], + "prefix_length": [ + "27" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/3", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/4", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/5", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/10", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json new file mode 100755 index 00000000..bc117064 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json @@ -0,0 +1,7 @@ +{ + "device_type": "WS-C3560CG-8PC-S", + "hostname": "3560-01", + "mask_length": 27, + "mgmt_interface": "Vlan955", + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json index b14ca27c..d4e5073b 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json @@ -16,7 +16,7 @@ "type": "1000base-t" }, "GigabitEthernet0/10": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -31,7 +31,7 @@ "type": "1000base-t" }, "GigabitEthernet0/11": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -46,7 +46,7 @@ "type": "1000base-t" }, "GigabitEthernet0/12": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -61,7 +61,7 @@ "type": "1000base-t" }, "GigabitEthernet0/13": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -76,7 +76,7 @@ "type": "1000base-t" }, "GigabitEthernet0/14": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -106,7 +106,7 @@ "type": "1000base-t" }, "GigabitEthernet0/16": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -166,7 +166,7 @@ "type": "1000base-t" }, "GigabitEthernet0/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -181,7 +181,7 @@ "type": "1000base-t" }, "GigabitEthernet0/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -196,7 +196,7 @@ "type": "1000base-t" }, "GigabitEthernet0/7": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -211,7 +211,7 @@ "type": "1000base-t" }, "GigabitEthernet0/8": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -226,7 +226,7 @@ "type": "1000base-t" }, "GigabitEthernet0/9": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json new file mode 100755 index 00000000..9b4c9258 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json @@ -0,0 +1,200 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json index ca790922..b260338e 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json @@ -13,20 +13,15 @@ "link_status": "True", "mac_address": "6c71.0d1d.3581", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/10": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -46,7 +41,7 @@ } }, "GigabitEthernet0/11": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -66,7 +61,7 @@ } }, "GigabitEthernet0/12": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -86,7 +81,7 @@ } }, "GigabitEthernet0/13": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -106,7 +101,7 @@ } }, "GigabitEthernet0/14": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -183,7 +178,7 @@ } }, "GigabitEthernet0/16": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -215,16 +210,11 @@ "link_status": "True", "mac_address": "6c71.0d1d.3582", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/3": { @@ -240,16 +230,11 @@ "link_status": "True", "mac_address": "6c71.0d1d.3583", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/4": { @@ -265,20 +250,15 @@ "link_status": "True", "mac_address": "6c71.0d1d.3584", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -298,7 +278,7 @@ } }, "GigabitEthernet0/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -318,7 +298,7 @@ } }, "GigabitEthernet0/7": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -338,7 +318,7 @@ } }, "GigabitEthernet0/8": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -358,7 +338,7 @@ } }, "GigabitEthernet0/9": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json new file mode 100755 index 00000000..a215066d --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json @@ -0,0 +1,256 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + } + }, + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json index 96962297..4f9f3159 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json @@ -17,7 +17,7 @@ "vrf": {} }, "GigabitEthernet0/10": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -33,7 +33,7 @@ "vrf": {} }, "GigabitEthernet0/11": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -49,7 +49,7 @@ "vrf": {} }, "GigabitEthernet0/12": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -65,7 +65,7 @@ "vrf": {} }, "GigabitEthernet0/13": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -81,7 +81,7 @@ "vrf": {} }, "GigabitEthernet0/14": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -113,7 +113,7 @@ "vrf": {} }, "GigabitEthernet0/16": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -177,7 +177,7 @@ "vrf": {} }, "GigabitEthernet0/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -193,7 +193,7 @@ "vrf": {} }, "GigabitEthernet0/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -209,7 +209,7 @@ "vrf": {} }, "GigabitEthernet0/7": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -225,7 +225,7 @@ "vrf": {} }, "GigabitEthernet0/8": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -241,7 +241,7 @@ "vrf": {} }, "GigabitEthernet0/9": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json new file mode 100755 index 00000000..72f72c85 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json @@ -0,0 +1,213 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "type": "virtual", + "vrf": {} + } + }, + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json index a2f656d5..a187166b 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json @@ -10,10 +10,7 @@ "mtu": "1500", "tagged_vlans": [], "type": "1000base-t", - "untagged_vlan": { - "id": "1", - "name": "default" - } + "untagged_vlan": {} }, "Ethernet1/1.1": { "802.1Q_mode": "", @@ -76,12 +73,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f6", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -96,12 +88,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f7", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -116,12 +103,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f8", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -136,12 +118,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f9", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -156,12 +133,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fa", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -176,12 +148,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fb", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -196,12 +163,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fc", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -216,12 +178,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fd", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -236,12 +193,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fe", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -258,10 +210,7 @@ "mtu": "1500", "tagged_vlans": [], "type": "1000base-t", - "untagged_vlan": { - "id": "1", - "name": "default" - } + "untagged_vlan": {} }, "Ethernet1/2.1": { "802.1Q_mode": "", @@ -288,12 +237,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99ff", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -308,12 +252,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a00", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -328,16 +267,11 @@ "link_status": "False", "mac_address": "286f.7f7e.9a01", "mtu": "1500", - "tagged_vlans": [ - { - "id": "136", - "name": "vlan136" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "136", + "name": "vlan136" } }, "Ethernet1/23": { @@ -392,16 +326,11 @@ "link_status": "True", "mac_address": "286f.7f7e.9a03", "mtu": "1500", - "tagged_vlans": [ - { - "id": "67", - "name": "vlan67" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "67", + "name": "vlan67" } }, "Ethernet1/25": { @@ -1014,12 +943,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99ef", "mtu": "9216", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -1322,12 +1246,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1c", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1342,16 +1261,11 @@ "link_status": "False", "mac_address": "286f.7f7e.99f0", "mtu": "1500", - "tagged_vlans": [ - { - "id": "200", - "name": "data" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "200", + "name": "data" } }, "Ethernet1/50": { @@ -1362,12 +1276,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1d", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1382,12 +1291,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1e", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1402,12 +1306,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1f", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1442,12 +1341,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a21", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1462,16 +1356,11 @@ "link_status": "True", "mac_address": "286f.7f7e.99f1", "mtu": "1500", - "tagged_vlans": [ - { - "id": "201", - "name": "fw" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "201", + "name": "fw" } }, "Ethernet1/7": { @@ -2496,16 +2385,11 @@ "link_status": "True", "mac_address": "286f.7f7e.99f1", "mtu": "1500", - "tagged_vlans": [ - { - "id": "201", - "name": "fw" - } - ], + "tagged_vlans": [], "type": "lag", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "201", + "name": "fw" } }, "port-channel7": { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json new file mode 100755 index 00000000..bff659be --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json @@ -0,0 +1,7559 @@ +{ + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [ + "Te1/0/2", + "Te2/0/2" + ] + }, + { + "vlan_id": "11", + "vlan_name": "v11", + "status": "active", + "interfaces": [ + "Gi1/0/1", + "Gi1/0/2", + "Gi1/0/3", + "Gi1/0/4", + "Gi1/0/5", + "Gi1/0/6", + "Gi1/0/7", + "Gi1/0/8", + "Gi1/0/9", + "Gi1/0/10", + "Gi1/0/11", + "Gi1/0/12", + "Gi1/0/13", + "Gi1/0/14", + "Gi1/0/15", + "Gi1/0/16", + "Gi1/0/17", + "Gi1/0/18", + "Gi1/0/19", + "Gi1/0/20", + "Gi1/0/21", + "Gi1/0/22", + "Gi1/0/23", + "Gi1/0/24", + "Gi1/0/25", + "Gi1/0/26", + "Gi1/0/27", + "Gi1/0/28", + "Gi1/0/29", + "Gi1/0/30", + "Gi1/0/31", + "Gi1/0/32", + "Gi1/0/33", + "Gi1/0/34", + "Gi1/0/35", + "Gi1/0/36", + "Gi1/0/37", + "Gi1/0/38", + "Gi1/0/39", + "Gi1/0/40", + "Gi1/0/41", + "Gi1/0/42", + "Gi1/0/43", + "Gi1/0/44", + "Gi1/0/46", + "Gi1/0/48", + "Gi2/0/1", + "Gi2/0/2", + "Gi2/0/3", + "Gi2/0/4", + "Gi2/0/5", + "Gi2/0/6", + "Gi2/0/7", + "Gi2/0/8", + "Gi2/0/9", + "Gi2/0/10", + "Gi2/0/11", + "Gi2/0/12", + "Gi2/0/13", + "Gi2/0/14", + "Gi2/0/15", + "Gi2/0/16", + "Gi2/0/17", + "Gi2/0/18", + "Gi2/0/19", + "Gi2/0/20", + "Gi2/0/21", + "Gi2/0/22", + "Gi2/0/23", + "Gi2/0/24", + "Gi2/0/25", + "Gi2/0/26", + "Gi2/0/27", + "Gi2/0/28", + "Gi2/0/29", + "Gi2/0/30", + "Gi2/0/31", + "Gi2/0/32", + "Gi2/0/33", + "Gi2/0/34", + "Gi2/0/35", + "Gi2/0/36", + "Gi2/0/37", + "Gi2/0/38", + "Gi2/0/39", + "Gi2/0/40", + "Gi2/0/41", + "Gi2/0/42", + "Gi2/0/43", + "Gi2/0/44", + "Gi2/0/45", + "Gi2/0/46", + "Gi2/0/47", + "Gi2/0/48" + ] + }, + { + "vlan_id": "12", + "vlan_name": "v12", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "13", + "vlan_name": "vl13", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "14", + "vlan_name": "vlan14", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "19", + "vlan_name": "vlan19", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "41", + "vlan_name": "vid41", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "50", + "vlan_name": "voice", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "60", + "vlan_name": "v60", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "80", + "vlan_name": "vlanname80", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "90", + "vlan_name": "v90", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "91", + "vlan_name": "v91", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "97", + "vlan_name": "vlan_97", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "98", + "vlan_name": "vlan_98", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "99", + "vlan_name": "vlan_99", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "111", + "vlan_name": "data", + "status": "active", + "interfaces": [ + "Gi1/0/6", + "Gi1/0/8", + "Gi1/0/11", + "Gi1/0/14", + "Gi1/0/17", + "Gi1/0/23", + "Gi1/0/26", + "Gi1/0/28", + "Gi1/0/32", + "Gi1/0/34", + "Gi1/0/36", + "Gi1/0/38", + "Gi1/0/40", + "Gi1/0/42", + "Gi1/0/44", + "Gi1/0/46", + "Gi1/0/48", + "Gi2/0/1", + "Gi2/0/2", + "Gi2/0/3", + "Gi2/0/4", + "Gi2/0/5", + "Gi2/0/6", + "Gi2/0/7", + "Gi2/0/8", + "Gi2/0/9", + "Gi2/0/10", + "Gi2/0/11", + "Gi2/0/12", + "Gi2/0/13", + "Gi2/0/14", + "Gi2/0/15", + "Gi2/0/16", + "Gi2/0/17", + "Gi2/0/18", + "Gi2/0/19", + "Gi2/0/20", + "Gi2/0/21", + "Gi2/0/22", + "Gi2/0/23", + "Gi2/0/24", + "Gi2/0/25", + "Gi2/0/26", + "Gi2/0/27", + "Gi2/0/28", + "Gi2/0/29", + "Gi2/0/30", + "Gi2/0/31", + "Gi2/0/32", + "Gi2/0/33", + "Gi2/0/34", + "Gi2/0/35", + "Gi2/0/36", + "Gi2/0/37", + "Gi2/0/38", + "Gi2/0/39", + "Gi2/0/40", + "Gi2/0/41", + "Gi2/0/42", + "Gi2/0/43", + "Gi2/0/44", + "Gi2/0/45", + "Gi2/0/46", + "Gi2/0/47", + "Gi2/0/48" + ] + }, + { + "vlan_id": "112", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "113", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "114", + "vlan_name": "data", + "status": "aFctive", + "interfaces": [] + }, + { + "vlan_id": "119", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "145", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "160", + "vlan_name": "v160", + "status": "active", + "interfaces": [ + "Gi1/0/1", + "Gi1/0/2", + "Gi1/0/3", + "Gi1/0/4", + "Gi1/0/5", + "Gi1/0/7", + "Gi1/0/9", + "Gi1/0/10", + "Gi1/0/12", + "Gi1/0/13", + "Gi1/0/15", + "Gi1/0/16", + "Gi1/0/18", + "Gi1/0/19", + "Gi1/0/20", + "Gi1/0/21", + "Gi1/0/22", + "Gi1/0/24", + "Gi1/0/25", + "Gi1/0/27", + "Gi1/0/29", + "Gi1/0/30", + "Gi1/0/31", + "Gi1/0/33", + "Gi1/0/35", + "Gi1/0/37", + "Gi1/0/39", + "Gi1/0/41", + "Gi1/0/43" + ] + }, + { + "vlan_id": "200", + "vlan_name": "vlan200", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "235", + "vlan_name": "vlan235", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "239", + "vlan_name": "v239", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "242", + "vlan_name": "storage", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "243", + "vlan_name": "storage", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "244", + "vlan_name": "mgmt", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "250", + "vlan_name": "internet", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "255", + "vlan_name": "v255", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "600", + "vlan_name": "v600", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "700", + "vlan_name": "FW", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "939", + "vlan_name": "v939", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "955", + "vlan_name": "vlan955", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "1002", + "vlan_name": "fddi-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1003", + "vlan_name": "trcrf-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1004", + "vlan_name": "fddinet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1005", + "vlan_name": "trbrf-default", + "status": "act/unsup", + "interfaces": [] + } + ], + "show version": [ + { + "software_image": "C2960X-UNIVERSALK9-M", + "version": "15.2(4)E9", + "release": "fc2", + "rommon": "Bootstrap", + "hostname": "2960-01", + "uptime": "8 weeks, 2 days, 10 hours, 32 minutes", + "uptime_years": "", + "uptime_weeks": "8", + "uptime_days": "2", + "uptime_hours": "10", + "uptime_minutes": "32", + "reload_reason": "power-on", + "running_image": "c2960x-universalk9-mz.152-4.E9.bin", + "hardware": [ + "WS-C2960X-48FPD-L", + "WS-C2960X-48FPD-L" + ], + "serial": [ + "FJC2304W0BB", + "FJC2304W0BA" + ], + "config_register": "0xF", + "mac_address": [ + "D0:EC:35:07:CC:80", + "D0:EC:35:07:CF:00" + ], + "restarted": "12:56:08 UTC Tue Apr 9 2024" + } + ], + "show interfaces": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc0", + "bia": "d0ec.3507.ccc0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "07:08:47", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "39727", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan41", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc1", + "bia": "d0ec.3507.ccc1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:01", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "2402278", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan255", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc2", + "bia": "d0ec.3507.ccc2", + "description": "a description", + "ip_address": "10.60.255.59", + "prefix_length": "24", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc3", + "bia": "d0ec.3507.ccc3", + "description": "a description", + "ip_address": "198.51.100.1", + "prefix_length": "27", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "13000", + "output_rate": "24000", + "input_pps": "9", + "output_pps": "8", + "input_packets": "43261775", + "output_packets": "42012824", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "FastEthernet0", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "APM86XXX FastEthernet", + "mac_address": "d0ec.3507.ccb9", + "bia": "d0ec.3507.ccb9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/1", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf01", + "bia": "d0ec.3507.cf01", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf02", + "bia": "d0ec.3507.cf02", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/3", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf03", + "bia": "d0ec.3507.cf03", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/4", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf04", + "bia": "d0ec.3507.cf04", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/5", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf05", + "bia": "d0ec.3507.cf05", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf06", + "bia": "d0ec.3507.cf06", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf07", + "bia": "d0ec.3507.cf07", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/8", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf08", + "bia": "d0ec.3507.cf08", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf09", + "bia": "d0ec.3507.cf09", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/10", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0a", + "bia": "d0ec.3507.cf0a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/11", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0b", + "bia": "d0ec.3507.cf0b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/12", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0c", + "bia": "d0ec.3507.cf0c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/13", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0d", + "bia": "d0ec.3507.cf0d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/14", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0e", + "bia": "d0ec.3507.cf0e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/15", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0f", + "bia": "d0ec.3507.cf0f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/16", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf10", + "bia": "d0ec.3507.cf10", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/17", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf11", + "bia": "d0ec.3507.cf11", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/18", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf12", + "bia": "d0ec.3507.cf12", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/19", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf13", + "bia": "d0ec.3507.cf13", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/20", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf14", + "bia": "d0ec.3507.cf14", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/21", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf15", + "bia": "d0ec.3507.cf15", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/22", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf16", + "bia": "d0ec.3507.cf16", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/23", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf17", + "bia": "d0ec.3507.cf17", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/24", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf18", + "bia": "d0ec.3507.cf18", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/25", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf19", + "bia": "d0ec.3507.cf19", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/26", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1a", + "bia": "d0ec.3507.cf1a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/27", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1b", + "bia": "d0ec.3507.cf1b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/28", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1c", + "bia": "d0ec.3507.cf1c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/29", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1d", + "bia": "d0ec.3507.cf1d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/30", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1e", + "bia": "d0ec.3507.cf1e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/31", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1f", + "bia": "d0ec.3507.cf1f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/32", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf20", + "bia": "d0ec.3507.cf20", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/33", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf21", + "bia": "d0ec.3507.cf21", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/34", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf22", + "bia": "d0ec.3507.cf22", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/35", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf23", + "bia": "d0ec.3507.cf23", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/36", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf24", + "bia": "d0ec.3507.cf24", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/37", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf25", + "bia": "d0ec.3507.cf25", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/38", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf26", + "bia": "d0ec.3507.cf26", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/39", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf27", + "bia": "d0ec.3507.cf27", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/40", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf28", + "bia": "d0ec.3507.cf28", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/41", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf29", + "bia": "d0ec.3507.cf29", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/42", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2a", + "bia": "d0ec.3507.cf2a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/43", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2b", + "bia": "d0ec.3507.cf2b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/44", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2c", + "bia": "d0ec.3507.cf2c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/45", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2d", + "bia": "d0ec.3507.cf2d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:07", + "last_output": "00:00:42", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "96000", + "output_rate": "2112000", + "input_pps": "31", + "output_pps": "248", + "input_packets": "1007688320", + "output_packets": "3637308419", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/46", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2e", + "bia": "d0ec.3507.cf2e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/47", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2f", + "bia": "d0ec.3507.cf2f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:03", + "last_output": "00:00:10", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "54000", + "input_pps": "0", + "output_pps": "59", + "input_packets": "349234942", + "output_packets": "1404218469", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/48", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf30", + "bia": "d0ec.3507.cf30", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/49", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf31", + "bia": "d0ec.3507.cf31", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/50", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf32", + "bia": "d0ec.3507.cf32", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet1/0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.cf33", + "bia": "d0ec.3507.cf33", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:48", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "53000", + "input_pps": "0", + "output_pps": "59", + "input_packets": "686710", + "output_packets": "240867522", + "runts": "1", + "giants": "0", + "input_errors": "2", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.cf34", + "bia": "d0ec.3507.cf34", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "Not Present", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/1", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc81", + "bia": "d0ec.3507.cc81", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc82", + "bia": "d0ec.3507.cc82", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/3", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc83", + "bia": "d0ec.3507.cc83", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/4", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc84", + "bia": "d0ec.3507.cc84", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:25", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "3000", + "input_pps": "0", + "output_pps": "4", + "input_packets": "581662", + "output_packets": "35834976", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/5", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc85", + "bia": "d0ec.3507.cc85", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc86", + "bia": "d0ec.3507.cc86", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc87", + "bia": "d0ec.3507.cc87", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/8", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc88", + "bia": "d0ec.3507.cc88", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc89", + "bia": "d0ec.3507.cc89", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/10", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8a", + "bia": "d0ec.3507.cc8a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/11", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8b", + "bia": "d0ec.3507.cc8b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/12", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8c", + "bia": "d0ec.3507.cc8c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/13", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8d", + "bia": "d0ec.3507.cc8d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/14", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8e", + "bia": "d0ec.3507.cc8e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/15", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8f", + "bia": "d0ec.3507.cc8f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/16", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc90", + "bia": "d0ec.3507.cc90", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/17", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc91", + "bia": "d0ec.3507.cc91", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/18", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc92", + "bia": "d0ec.3507.cc92", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/19", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc93", + "bia": "d0ec.3507.cc93", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/20", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc94", + "bia": "d0ec.3507.cc94", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/21", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc95", + "bia": "d0ec.3507.cc95", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/22", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc96", + "bia": "d0ec.3507.cc96", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/23", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc97", + "bia": "d0ec.3507.cc97", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/24", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc98", + "bia": "d0ec.3507.cc98", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/25", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc99", + "bia": "d0ec.3507.cc99", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/26", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9a", + "bia": "d0ec.3507.cc9a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/27", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9b", + "bia": "d0ec.3507.cc9b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/28", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9c", + "bia": "d0ec.3507.cc9c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/29", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9d", + "bia": "d0ec.3507.cc9d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/30", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9e", + "bia": "d0ec.3507.cc9e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/31", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9f", + "bia": "d0ec.3507.cc9f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/32", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca0", + "bia": "d0ec.3507.cca0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/33", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca1", + "bia": "d0ec.3507.cca1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/34", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca2", + "bia": "d0ec.3507.cca2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/35", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca3", + "bia": "d0ec.3507.cca3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/36", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca4", + "bia": "d0ec.3507.cca4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/37", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca5", + "bia": "d0ec.3507.cca5", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/38", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca6", + "bia": "d0ec.3507.cca6", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/39", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca7", + "bia": "d0ec.3507.cca7", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/40", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca8", + "bia": "d0ec.3507.cca8", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/41", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca9", + "bia": "d0ec.3507.cca9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/42", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccaa", + "bia": "d0ec.3507.ccaa", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/43", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccab", + "bia": "d0ec.3507.ccab", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/44", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccac", + "bia": "d0ec.3507.ccac", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/45", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccad", + "bia": "d0ec.3507.ccad", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/46", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccae", + "bia": "d0ec.3507.ccae", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/47", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccaf", + "bia": "d0ec.3507.ccaf", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/48", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb0", + "bia": "d0ec.3507.ccb0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/49", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb1", + "bia": "d0ec.3507.ccb1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/50", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb2", + "bia": "d0ec.3507.ccb2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet2/0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb3", + "bia": "d0ec.3507.ccb3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:01", + "last_output": "00:00:02", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "2083000", + "output_rate": "135000", + "input_pps": "256", + "output_pps": "46", + "input_packets": "4844777200", + "output_packets": "1399160106", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb4", + "bia": "d0ec.3507.ccb4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "Not Present", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "d0ec.3507.ccb3", + "bia": "d0ec.3507.ccb3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "unknown", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:01:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "2083000", + "output_rate": "135000", + "input_pps": "256", + "output_pps": "46", + "input_packets": "4844777007", + "output_packets": "1399159965", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + } + ], + "show interfaces switchport": [ + { + "interface": "Gi1/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/15", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/16", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/17", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/18", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/19", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/20", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/21", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/22", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/23", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/24", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/25", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/26", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/27", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/28", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/29", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/30", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/31", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/32", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/33", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/34", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/35", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/36", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/37", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/38", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/39", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/40", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/41", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/42", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/43", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/44", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/45", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "244", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/46", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/47", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "244", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/48", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/49", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "trunk", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Gi1/0/50", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "dynamic auto", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Te1/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Te1/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/15", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/16", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/17", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/18", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/19", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/20", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/21", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/22", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/23", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/24", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/25", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/26", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/27", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/28", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/29", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/30", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/31", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/32", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/33", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/34", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/35", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/36", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/37", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/38", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/39", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/40", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/41", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/42", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/43", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/44", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/45", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/46", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/47", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/48", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/49", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "dynamic auto", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Gi2/0/50", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "dynamic auto", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Te2/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po1)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Te2/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Po1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + } + ], + "show etherchannel summary": [ + { + "group": "1", + "bundle_name": "Po1", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Gi1/0/49", + "Te2/0/1" + ], + "member_interface_status": [ + "D", + "P" + ] + } + ], + "show ip interface": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan41", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan255", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [ + "10.60.255.59" + ], + "prefix_length": [ + "24" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "198.51.100.1" + ], + "prefix_length": [ + "27" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "FastEthernet0", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/1", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/3", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/4", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/5", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/11", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/12", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/13", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/14", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/15", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/17", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/18", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/19", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/20", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/21", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/22", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/23", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/24", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/25", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/26", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/27", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/28", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/29", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/30", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/31", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/32", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/33", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/34", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/35", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/36", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/37", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/38", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/39", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/40", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/41", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/42", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/43", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/44", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/45", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/46", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/47", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/48", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/49", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/50", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet1/0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/1", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/3", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/4", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/5", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/11", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/12", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/13", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/14", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/15", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/17", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/18", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/19", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/20", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/21", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/22", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/23", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/24", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/25", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/26", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/27", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/28", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/29", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/30", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/31", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/32", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/33", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/34", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/35", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/36", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/37", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/38", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/39", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/40", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/41", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/42", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/43", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/44", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/45", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/46", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/47", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/48", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/49", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/50", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet2/0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json new file mode 100755 index 00000000..65ab30f3 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json @@ -0,0 +1,7 @@ +{ + "device_type": "WS-C2960X-48FPD-L", + "hostname": "2960-01", + "mask_length": 27, + "mgmt_interface": "Vlan955", + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json new file mode 100755 index 00000000..cb846d70 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json @@ -0,0 +1,1655 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "type": "1000base-t" + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "lag" + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "type": "10gbase-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "type": "virtual" + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json index a781f5ca..5222ed55 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json @@ -106,7 +106,7 @@ "type": "other" }, "GigabitEthernet0/2/0": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -121,7 +121,7 @@ "type": "other" }, "GigabitEthernet0/2/1": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -136,7 +136,7 @@ "type": "other" }, "GigabitEthernet0/2/2": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -151,7 +151,7 @@ "type": "other" }, "GigabitEthernet0/2/3": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -166,7 +166,7 @@ "type": "other" }, "GigabitEthernet0/2/4": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -181,7 +181,7 @@ "type": "other" }, "GigabitEthernet0/2/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -196,7 +196,7 @@ "type": "other" }, "GigabitEthernet0/2/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json new file mode 100755 index 00000000..cb846d70 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json @@ -0,0 +1,1655 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "type": "1000base-t" + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "lag" + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "type": "10gbase-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "type": "virtual" + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json index 6570bc9c..aa480d15 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json @@ -15,10 +15,7 @@ "mtu": "1500", "tagged_vlans": [], "type": "other", - "untagged_vlan": { - "id": "1", - "name": "default" - } + "untagged_vlan": {} }, "GigabitEthernet0/0/0": { "802.1Q_mode": "", @@ -123,7 +120,7 @@ "untagged_vlan": {} }, "GigabitEthernet0/2/0": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -143,7 +140,7 @@ } }, "GigabitEthernet0/2/1": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -163,7 +160,7 @@ } }, "GigabitEthernet0/2/2": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -183,7 +180,7 @@ } }, "GigabitEthernet0/2/3": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -203,7 +200,7 @@ } }, "GigabitEthernet0/2/4": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -223,7 +220,7 @@ } }, "GigabitEthernet0/2/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -243,7 +240,7 @@ } }, "GigabitEthernet0/2/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -275,16 +272,11 @@ "link_status": "False", "mac_address": "ac3a.6789.5d57", "mtu": "1500", - "tagged_vlans": [ - { - "id": "500", - "name": "VLAN0500" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "500", + "name": "VLAN0500" } }, "Loopback0": { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json new file mode 100755 index 00000000..8c7eed61 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json @@ -0,0 +1,2181 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "244", + "name": "mgmt" + } + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "244", + "name": "mgmt" + } + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json index 4b14c6f3..9b5825a6 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json @@ -113,7 +113,7 @@ "vrf": {} }, "GigabitEthernet0/2/0": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -129,7 +129,7 @@ "vrf": {} }, "GigabitEthernet0/2/1": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -145,7 +145,7 @@ "vrf": {} }, "GigabitEthernet0/2/2": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -161,7 +161,7 @@ "vrf": {} }, "GigabitEthernet0/2/3": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -177,7 +177,7 @@ "vrf": {} }, "GigabitEthernet0/2/4": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -193,7 +193,7 @@ "vrf": {} }, "GigabitEthernet0/2/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -209,7 +209,7 @@ "vrf": {} }, "GigabitEthernet0/2/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json new file mode 100755 index 00000000..57e09409 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json @@ -0,0 +1,1765 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "type": "virtual", + "vrf": {} + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/test_formatter.py b/nautobot_device_onboarding/tests/test_formatter.py index 574876a8..f60173fe 100755 --- a/nautobot_device_onboarding/tests/test_formatter.py +++ b/nautobot_device_onboarding/tests/test_formatter.py @@ -180,7 +180,7 @@ def test_extract_and_post_process_result_python_dict(self): self.assertEqual(expected_parsed_result, actual_result) def test_extract_and_post_process_result_non_json_string(self): - parsed_command_output = "jeff" + parsed_command_output = "baz" actual_result = extract_and_post_process( parsed_command_output, { @@ -280,8 +280,8 @@ def test_extract_and_post_process_result_pre_processor(self): { "command": "show interfaces switchport", "parser": "textfsm", - "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}", - "post_processor": "{{ obj | get_vlan_data(vlan_map) | tojson }}", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}", + "post_processor": "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}", }, { "obj": "1.1.1.1", @@ -298,6 +298,7 @@ def test_extract_and_post_process_result_pre_processor(self): "access_vlan": "10", "admin_mode": "trunk", "mode": "down (suspended member of bundle Po8)", + "native_vlan": "10", "trunking_vlans": ["10"], } ], @@ -461,7 +462,9 @@ def test_perform_data_extraction_sync_network_data_no_options(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest( + msg=f"test_perform_data_extraction_sync_network_data_no_options with platform {platform}" + ): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_no_options/expected_result_{command_getter_file.split('_')[-1]}", @@ -526,7 +529,9 @@ def test_perform_data_extraction_sync_network_data_with_vrfs(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest( + msg=f"test_perform_data_extraction_sync_network_data_with_vrfs with platform {platform}" + ): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_with_vrfs/expected_result_{command_getter_file.split('_')[-1]}", @@ -591,7 +596,9 @@ def test_perform_data_extraction_sync_network_data_with_vlans(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest( + msg=f"test_perform_data_extraction_sync_network_data_with_vlans with platform {platform}" + ): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_with_vlans/expected_result_{command_getter_file.split('_')[-1]}", @@ -657,7 +664,7 @@ def test_perform_data_extraction_sync_network_data_all(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest(msg=f"test_perform_data_extraction_sync_network_data_all with platform {platform}"): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_all/expected_result_{command_getter_file.split('_')[-1]}", diff --git a/nautobot_device_onboarding/tests/test_jinja_filters.py b/nautobot_device_onboarding/tests/test_jinja_filters.py index 89f9dc81..ec047070 100755 --- a/nautobot_device_onboarding/tests/test_jinja_filters.py +++ b/nautobot_device_onboarding/tests/test_jinja_filters.py @@ -169,7 +169,7 @@ def test_get_vlan_data_empty_item_data(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "access" expected_value = [] - actual_value = get_vlan_data([], []) + actual_value = get_vlan_data([], [], "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -177,7 +177,7 @@ def test_get_vlan_data_tagged_all_tagged_all(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "tagged-all" expected_value = [] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["ALL"]}], [{"10": "VLAN0010"}]) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["ALL"]}], [{"10": "VLAN0010"}], "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -185,7 +185,9 @@ def test_get_vlan_data_tagged_all_tagged_range(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "tagged-all" expected_value = [] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "VLAN0010"}) + actual_value = get_vlan_data( + [{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "VLAN0010"}, "tagged" + ) self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -193,7 +195,7 @@ def test_get_vlan_data_access_create_defined_name(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "access" expected_value = [{"id": "10", "name": "DATA"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "DATA"}, "untagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -201,7 +203,7 @@ def test_get_vlan_data_access_tagged_vlans_defined_trunking_as_list(self, mock_m """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "10", "name": "DATA"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["10"]}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["10"]}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -209,7 +211,7 @@ def test_get_vlan_data_access_tagged_vlans_defined_trunking_as_str(self, mock_mo """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "10", "name": "DATA"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "10"}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "10"}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -217,7 +219,7 @@ def test_get_vlan_data_access_tagged_vlans_no_name_trunking_as_list(self, mock_m """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "12", "name": "VLAN0012"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["12"]}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["12"]}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -225,7 +227,7 @@ def test_get_vlan_data_access_tagged_vlans_no_name_trunking_as_str(self, mock_mo """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "12", "name": "VLAN0012"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "12"}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "12"}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) def test_parse_junos_ip_address_values_as_list_single(self): diff --git a/pyproject.toml b/pyproject.toml index ec219787..fca660ba 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.0.0b1" +version = "4.0.0rc0" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" From feab3db923ade7164c922d42e497f40f3b01864b Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Sat, 8 Jun 2024 22:37:22 -0500 Subject: [PATCH 06/81] fix ci test to match new 2.2.3 lower constraint --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd38edcf..fb5ff9fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: fail-fast: true matrix: python-version: ["3.11"] - nautobot-version: ["2.2.2"] + nautobot-version: ["2.2.3"] env: INVOKE_NAUTOBOT_DEVICE_ONBOARDING_PYTHON_VER: "${{ matrix.python-version }}" INVOKE_NAUTOBOT_DEVICE_ONBOARDING_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" @@ -152,7 +152,7 @@ jobs: include: - python-version: "3.11" db-backend: "postgresql" - nautobot-version: "2.2.2" + nautobot-version: "2.2.3" # - python-version: "3.11" # db-backend: "mysql" # nautobot-version: "stable" From 14871f71e316fb2017b7d7e0dd7c6f51b0ba0121 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Mon, 10 Jun 2024 08:38:36 -0500 Subject: [PATCH 07/81] merge tasks.py from develop --- tasks.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/tasks.py b/tasks.py index 4d592625..9ca1b536 100644 --- a/tasks.py +++ b/tasks.py @@ -49,7 +49,7 @@ def is_truthy(arg): { "nautobot_device_onboarding": { "nautobot_ver": "2.2.3", - "project_name": "nautobot-device-onboarding-2", + "project_name": "nautobot-device-onboarding", "python_ver": "3.11", "local": False, "compose_dir": os.path.join(os.path.dirname(__file__), "development"), @@ -149,15 +149,27 @@ def docker_compose(context, command, **kwargs): def run_command(context, command, **kwargs): """Wrapper to run a command locally or inside the nautobot container.""" if is_truthy(context.nautobot_device_onboarding.local): + if "command_env" in kwargs: + kwargs["env"] = { + **kwargs.get("env", {}), + **kwargs.pop("command_env"), + } context.run(command, **kwargs) else: # Check if nautobot is running, no need to start another nautobot container to run a command docker_compose_status = "ps --services --filter status=running" results = docker_compose(context, docker_compose_status, hide="out") if "nautobot" in results.stdout: - compose_command = f"exec nautobot {command}" + compose_command = "exec" else: - compose_command = f"run --rm --entrypoint '{command}' nautobot" + compose_command = "run --rm --entrypoint=''" + + if "command_env" in kwargs: + command_env = kwargs.pop("command_env") + for key, value in command_env.items(): + compose_command += f' --env="{key}={value}"' + + compose_command += f" -- nautobot {command}" pty = kwargs.pop("pty", True) @@ -327,15 +339,22 @@ def logs(context, service="", follow=False, tail=0): # ------------------------------------------------------------------------------ # ACTIONS # ------------------------------------------------------------------------------ -@task(help={"file": "Python file to execute"}) -def nbshell(context, file=""): +@task( + help={ + "file": "Python file to execute", + "env": "Environment variables to pass to the command", + "plain": "Flag to run nbshell in plain mode (default: False)", + }, +) +def nbshell(context, file="", env={}, plain=False): """Launch an interactive nbshell session.""" command = [ "nautobot-server", "nbshell", + "--plain" if plain else "", f"< '{file}'" if file else "", ] - run_command(context, " ".join(command), pty=not bool(file)) + run_command(context, " ".join(command), pty=not bool(file), command_env=env) @task @@ -674,7 +693,7 @@ def pylint(context): def autoformat(context): """Run code autoformatting.""" black(context, autoformat=True) - ruff(context, action="both", fix=True) + ruff(context, fix=True) @task( @@ -804,8 +823,33 @@ def tests(context, failfast=False, keepdb=False, lint_only=False): pylint(context) print("Running mkdocs...") build_and_check_docs(context) + print("Checking app config schema...") + validate_app_config(context) if not lint_only: print("Running unit tests...") unittest(context, failfast=failfast, keepdb=keepdb) unittest_coverage(context) print("All tests have passed!") + + +@task +def generate_app_config_schema(context): + """Generate the app config schema from the current app config. + + WARNING: Review and edit the generated file before committing. + + Its content is inferred from: + + - The current configuration in `PLUGINS_CONFIG` + - `NautobotAppConfig.default_settings` + - `NautobotAppConfig.required_settings` + """ + start(context, service="nautobot") + nbshell(context, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "generate"}) + + +@task +def validate_app_config(context): + """Validate the app config based on the app config schema.""" + start(context, service="nautobot") + nbshell(context, plain=True, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "validate"}) From 95566de652e7ff1eed5df41aa3bb95997d400295 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Mon, 10 Jun 2024 08:50:54 -0500 Subject: [PATCH 08/81] add back app config schemas --- app-config-schema.json | 1 + development/app_config_schema.py | 65 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100755 app-config-schema.json create mode 100755 development/app_config_schema.py diff --git a/app-config-schema.json b/app-config-schema.json new file mode 100755 index 00000000..27ba77dd --- /dev/null +++ b/app-config-schema.json @@ -0,0 +1 @@ +true diff --git a/development/app_config_schema.py b/development/app_config_schema.py new file mode 100755 index 00000000..a779b14e --- /dev/null +++ b/development/app_config_schema.py @@ -0,0 +1,65 @@ +"""App Config Schema Generator and Validator.""" + +import json +from importlib import import_module +from os import getenv +from pathlib import Path +from urllib.parse import urlparse + +import jsonschema +import toml +from django.conf import settings +from to_json_schema.to_json_schema import SchemaBuilder + + +def _enrich_object_schema(schema, defaults, required): + schema["additionalProperties"] = False + for key, value in schema["properties"].items(): + if required and key in required: + value["required"] = True + default_value = defaults and defaults.get(key, None) + if value["type"] == "object" and "properties" in value: + _enrich_object_schema(value, default_value, None) + elif default_value is not None: + value["default"] = default_value + + +def _main(): + pyproject = toml.loads(Path("pyproject.toml").read_text()) + url = urlparse(pyproject["tool"]["poetry"]["repository"]) + _, owner, repository = url.path.split("/") + package_name = pyproject["tool"]["poetry"]["packages"][0]["include"] + app_config = settings.PLUGINS_CONFIG[package_name] # type: ignore + schema_path = Path(package_name) / "app-config-schema.json" + command = getenv("APP_CONFIG_SCHEMA_COMMAND", "") + if command == "generate": + schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": f"https://raw.githubusercontent.com/{owner}/{repository}/develop/{package_name}/app-config-schema.json", + "$comment": "TBD: Update $id, replace `develop` with the future release tag", + **SchemaBuilder().to_json_schema(app_config), # type: ignore + } + app_config = import_module(package_name).config + _enrich_object_schema(schema, app_config.default_settings, app_config.required_settings) + schema_path.write_text(json.dumps(schema, indent=4) + "\n") + print(f"\n==================\nGenerated schema:\n\n{schema_path}\n") + print( + "WARNING: Review and edit the generated file before committing.\n" + "\n" + "Its content is inferred from:\n" + "\n" + "- The current configuration in `PLUGINS_CONFIG`\n" + "- `NautobotAppConfig.default_settings`\n" + "- `NautobotAppConfig.required_settings`" + ) + elif command == "validate": + schema = json.loads(schema_path.read_text()) + jsonschema.validate(app_config, schema) + print( + f"\n==================\nValidated configuration using the schema:\n{schema_path}\nConfiguration is valid." + ) + else: + raise RuntimeError(f"Unknown command: {command}") + + +_main() From 8ab3f3d4729e9658696681313b029d73dc4928d1 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Sat, 8 Jun 2024 22:29:58 -0500 Subject: [PATCH 09/81] fix vlans, fix ci and app schemas fix vlans across all platforms and more unittest fix ci test to match new 2.2.3 lower constraint merge tasks.py from develop --- .github/workflows/ci.yml | 4 +- README.md | 2 +- app-config-schema.json | 1 + changes/181.added | 5 + changes/181.changed | 1 + development/app_config_schema.py | 65 + development/towncrier_template.j2 | 2 +- docs/admin/release_notes/version_4.0.md | 14 - .../images/device-onboarding-4.0-Overview.png | Bin 0 -> 117159 bytes .../device-onboarding-4.0-Sync Device Job.png | Bin 0 -> 231857 bytes ...e-onboarding-4.0-Sync Network Data Job.png | Bin 0 -> 321418 bytes docs/images/do_job_inputs.png | Bin 80113 -> 0 bytes docs/images/sync_devices_inputs.png | Bin 0 -> 81547 bytes docs/images/sync_network_data_inputs.png | Bin 0 -> 86695 bytes docs/user/app_detailed_design.md | 7 +- docs/user/app_getting_started.md | 2 +- docs/user/app_overview.md | 68 +- docs/user/app_use_cases.md | 18 +- docs/user/app_yaml_overrides.md | 1 + mkdocs.yml | 1 + .../command_mappers/arista_eos.yml | 12 +- .../command_mappers/cisco_ios.yml | 9 +- .../command_mappers/cisco_nxos.yml | 11 +- .../command_mappers/cisco_xe.yml | 9 +- nautobot_device_onboarding/jinja_filters.py | 42 +- nautobot_device_onboarding/jobs.py | 3 +- .../expected_result_1.json | 2 +- .../expected_result_1.json | 16 +- .../expected_result_1.json | 2 +- .../cisco_ios/command_getter_result_2.json | 914 ++ .../sync_devices/expected_result_2.json | 7 + .../expected_result_2.json | 1 + .../expected_result_1.json | 22 +- .../expected_result_2.json | 200 + .../expected_result_1.json | 66 +- .../expected_result_2.json | 256 + .../expected_result_1.json | 22 +- .../expected_result_2.json | 213 + .../expected_result_1.json | 184 +- .../cisco_xe/command_getter_result_2.json | 7559 +++++++++++++++++ .../sync_devices/expected_result_2.json | 7 + .../expected_result_2.json | 1655 ++++ .../expected_result_1.json | 14 +- .../expected_result_2.json | 1655 ++++ .../expected_result_1.json | 30 +- .../expected_result_2.json | 2181 +++++ .../expected_result_1.json | 14 +- .../expected_result_2.json | 1765 ++++ .../tests/test_formatter.py | 21 +- .../tests/test_jinja_filters.py | 18 +- pyproject.toml | 2 +- tasks.py | 58 +- 52 files changed, 16780 insertions(+), 381 deletions(-) create mode 100755 app-config-schema.json create mode 100755 changes/181.added create mode 100755 changes/181.changed create mode 100755 development/app_config_schema.py create mode 100755 docs/images/device-onboarding-4.0-Overview.png create mode 100755 docs/images/device-onboarding-4.0-Sync Device Job.png create mode 100755 docs/images/device-onboarding-4.0-Sync Network Data Job.png delete mode 100644 docs/images/do_job_inputs.png create mode 100755 docs/images/sync_devices_inputs.png create mode 100755 docs/images/sync_network_data_inputs.png create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd38edcf..fb5ff9fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: fail-fast: true matrix: python-version: ["3.11"] - nautobot-version: ["2.2.2"] + nautobot-version: ["2.2.3"] env: INVOKE_NAUTOBOT_DEVICE_ONBOARDING_PYTHON_VER: "${{ matrix.python-version }}" INVOKE_NAUTOBOT_DEVICE_ONBOARDING_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" @@ -152,7 +152,7 @@ jobs: include: - python-version: "3.11" db-backend: "postgresql" - nautobot-version: "2.2.2" + nautobot-version: "2.2.3" # - python-version: "3.11" # db-backend: "mysql" # nautobot-version: "stable" diff --git a/README.md b/README.md index cc2b1beb..541b03c7 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo Device Onboarding is a Job that allows you to provide a few required pieces of information and onboard the device. -![job input](https://raw.githubusercontent.com/nautobot/nautobot-app-device-onboarding/develop/docs/images/do_job_inputs.png) +![job input](https://raw.githubusercontent.com/nautobot/nautobot-app-device-onboarding/develop/docs/images/sync_devices_inputs.png) ## Try it out! diff --git a/app-config-schema.json b/app-config-schema.json new file mode 100755 index 00000000..27ba77dd --- /dev/null +++ b/app-config-schema.json @@ -0,0 +1 @@ +true diff --git a/changes/181.added b/changes/181.added new file mode 100755 index 00000000..677ed211 --- /dev/null +++ b/changes/181.added @@ -0,0 +1,5 @@ +Sync Devices from Network job was added which utilizes the SSoT framework to onboard devices. +Sync Data from Network job was added which utilizes the SSoT framework to onboard devices. +Git Datasource object to be able to use a Git Repo to overload new SSoT job YAML file definitions. +Create a Nornir inventory `EmptyInventory` to support ondemand inventory population for `Sync Devices` job. +Add `nautobot-app-nornir` dependency to reuse `NautobotORMInventory` to support inventory creation for `Sync Data` job. diff --git a/changes/181.changed b/changes/181.changed new file mode 100755 index 00000000..0c57e433 --- /dev/null +++ b/changes/181.changed @@ -0,0 +1 @@ +The `OnboardingTask` job is changed to `hidden` by default. diff --git a/development/app_config_schema.py b/development/app_config_schema.py new file mode 100755 index 00000000..a779b14e --- /dev/null +++ b/development/app_config_schema.py @@ -0,0 +1,65 @@ +"""App Config Schema Generator and Validator.""" + +import json +from importlib import import_module +from os import getenv +from pathlib import Path +from urllib.parse import urlparse + +import jsonschema +import toml +from django.conf import settings +from to_json_schema.to_json_schema import SchemaBuilder + + +def _enrich_object_schema(schema, defaults, required): + schema["additionalProperties"] = False + for key, value in schema["properties"].items(): + if required and key in required: + value["required"] = True + default_value = defaults and defaults.get(key, None) + if value["type"] == "object" and "properties" in value: + _enrich_object_schema(value, default_value, None) + elif default_value is not None: + value["default"] = default_value + + +def _main(): + pyproject = toml.loads(Path("pyproject.toml").read_text()) + url = urlparse(pyproject["tool"]["poetry"]["repository"]) + _, owner, repository = url.path.split("/") + package_name = pyproject["tool"]["poetry"]["packages"][0]["include"] + app_config = settings.PLUGINS_CONFIG[package_name] # type: ignore + schema_path = Path(package_name) / "app-config-schema.json" + command = getenv("APP_CONFIG_SCHEMA_COMMAND", "") + if command == "generate": + schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": f"https://raw.githubusercontent.com/{owner}/{repository}/develop/{package_name}/app-config-schema.json", + "$comment": "TBD: Update $id, replace `develop` with the future release tag", + **SchemaBuilder().to_json_schema(app_config), # type: ignore + } + app_config = import_module(package_name).config + _enrich_object_schema(schema, app_config.default_settings, app_config.required_settings) + schema_path.write_text(json.dumps(schema, indent=4) + "\n") + print(f"\n==================\nGenerated schema:\n\n{schema_path}\n") + print( + "WARNING: Review and edit the generated file before committing.\n" + "\n" + "Its content is inferred from:\n" + "\n" + "- The current configuration in `PLUGINS_CONFIG`\n" + "- `NautobotAppConfig.default_settings`\n" + "- `NautobotAppConfig.required_settings`" + ) + elif command == "validate": + schema = json.loads(schema_path.read_text()) + jsonschema.validate(app_config, schema) + print( + f"\n==================\nValidated configuration using the schema:\n{schema_path}\nConfiguration is valid." + ) + else: + raise RuntimeError(f"Unknown command: {command}") + + +_main() diff --git a/development/towncrier_template.j2 b/development/towncrier_template.j2 index d2ec61bd..76ea3af7 100644 --- a/development/towncrier_template.j2 +++ b/development/towncrier_template.j2 @@ -1,6 +1,6 @@ {% if render_title %} -## v{{ versiondata.version }} ({{ versiondata.date }}) +## [v{{ versiondata.version }} ({{ versiondata.date }})](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v{{ versiondata.version}}) {% endif %} {% for section, _ in sections.items() %} diff --git a/docs/admin/release_notes/version_4.0.md b/docs/admin/release_notes/version_4.0.md index 42cc0ca3..f8610e60 100755 --- a/docs/admin/release_notes/version_4.0.md +++ b/docs/admin/release_notes/version_4.0.md @@ -2,17 +2,3 @@ !!! warning Nautobot Device Onboarding v4.0.0 completely revamps the applications design and framework. The original `OnboardingTask` job is still packaged with the app to provide a backwards compatible way for users that have used its extensions framework in the past to solve complex problems. However, that job is now hidden by default to avoid confusion with the two new SSoT based onboarding jobs that v4.0.0 exposes. - -## v4.0.0 TBD - -### Added - -- [#TBD](TBD) - Sync Devices from Network job was added which utilizes the SSoT framework to onboard devices. -- [#TBD](TBD) - Sync Data from Network job was added which utilizes the SSoT framework to onboard devices. -- [#TBD](TBD) - Git Datasource object to be able to use a Git Repo to overload new SSoT job YAML file definitions. -- [#TBD](TBD) - Create a Nornir inventory `EmptyInventory` to support ondemand inventory population for `Sync Devices` job. -- [#TBD](TBD) - Add `nautobot-app-nornir` dependency to reuse `NautobotORMInventory` to support inventory creation for `Sync Data` job. - -### Changed - -- [#TBD](tbd) - The `OnboardingTask` job is changed to `hidden` by default. diff --git a/docs/images/device-onboarding-4.0-Overview.png b/docs/images/device-onboarding-4.0-Overview.png new file mode 100755 index 0000000000000000000000000000000000000000..228045025d04e8917a813ee0f11644cec865b8e3 GIT binary patch literal 117159 zcmbTdbyU?`)HO^gq5=ZajdTdo-5gT7Q@XnwB$e(CK{`dcI|W3#8|m(RH}~p&o_DA(jmMpC@3N*abW>P7wz3Nc$e6&>l*K`7uwI70&$X`QNDlmDiVo$>IwQTnX;_F zU3L#@gsQ-`_`o)JN|=>Ov7_0 z$uTL$5@`bo^g2&pAVfm_&r30iUr{mEjf9+hqfiEkkQc8b5Rqv@t=a-R{;ih!GE=b( zFPRQfGxEe8Z|`u>;o+g(gL|0}cFBs2mNEr2D$(B;CD|AByDV`jQhpdxqK8Y;oHaf% z?0i|smDm6EZ4&$yxW{>oI+Qe?iRfZJaJ$Jq&$go8h!UyoM?biTU{~!-e)RjFaeey{ zg8loW=X!g4pC`;JEj%{|qfIeEcO2hF^NCVspWi|h8PBt_NZ8rgBVYYpl}{R4BDX7} z$k@;#G*Sj!B@xj>IoVB@h**v+q$<-az;bPUUH9(#EI2&8`$(T6GCKNW>Kxu{42+fI zb&^=_$wKKg&U}R)=b zT+O!8q16mW3YBQ8)-o8)L=UMS+H}}wRiO)z8$i%v2*Z^ z@ngcn$6H=n%3m9m6_yV9{9H~|G5BMa$LrS{#Poddu1`36>3aiGinwsttU?9Y5Ib9a zVfTV5gCt-cx0xTNT86(O%YNg>w>w`ufABZPn-8j%0@zhp$1__dCmVy8whJ=sxXu`k zOHjyc^tE*^ZG+Qj(MQFmQ7_G;y~yp386)FjdOT}A}p2d#`P>JuWG5R~hSgCJ1?*RR!rx-I`rW}Jv9NltrR9?{0bA5N^56edO)uGvUc57nuo!$J8C-lEwW3muWBy&uzi01*jnGRB ziIro5VRaq_yWMe{;iVjedgUHqYDW}Rryma+5zRDI)Ddpgw1**;$j~;YRpI$RH|C$K zlZKKRx@{p?h&nVXBeK%jhxY8W03I2iu8+m>rCQxqZK4y>U@~)u`+;cEHP%klU!zlv z^uhaJP@B5&alV2E49P{rk6qO+J~S}U@%7Wi8#W3;f#$R2%_W0?Y)YiM@_Z;v`PHTE zjZpgLTf9dD=E8U?{nv)Xe4ImPR*LPUNHdYamU{m1>yt}mw}lzzyZBh2Mb_Go-Z#9} zw32gr(o56ZtzrEDKbXui>RuZf@n{&&0ei4C@*~AkA12X*$+=n1m%NfNcXkLLo(b8ze=#4Xf5EP!#ZNjzRfNuj@i8Gb!Qu?wNx6k&V+4E)Srz1^K|1}-{95`CK>>hn--NjNr zcH2|t=PzDFVR?W1g{20jka-O!xc#(!WCUff1Gl4N6xJ{BtiVfu+$EY(9nmD-Wi5wFk`HS`kdr6190p1}k?r`(ct&atx+GBHhMchsSy*+{6oyjh$p; z>zL(nTt(!oP97N*|AbJ-dJOSJoBs_Yi3g`Ye;P%l$#2#QADPYA`qBkX`A!$torG?O z#O`?XX!MrQ(!u}_>Cb*mu|cZ^(vYaj%0j6)8}aYmST1dzL5R3$klzjsxma~~7`+IC z$4Wx9Jj3G zlrZ_2;g>uk%F_E~YRO~yYuC$5*Ok%fjIo!D8RUOMDMOMEhxDjc^^!~{9xw3D%p6F{ zq|m7OJTOV799Zr>vXwhOB}R!Tvy)ef)$~V3MiN=~$e5p5A&A1~C9@d$$zWojFIoJO z`;mI({dnElQ0&D1OgNJdW+QUMdgC^93N5dWTg7{HFjy>86UOdWX-qa#dfI(tuK%BL zV<`CGu2kT?%YG)a7<9-`7?ZY+&LZ0L-i!r`_I>%|iF~}Cnb2j^Bv`ig8}6V?Fo^N_ z8IXeSibH)RQ>Xt6%aO1^Ie@Vcy$`4Qjk|~;BMw{;6O9{seAn~{){i8nAa_yo%b_FN zKTeS$z-NN7ezRwNs^x-#yK(non^U3oI}*ZXm=B)O>yZM)ZYiunHIrDmLD`AoFQy7Q z?Vt4XUae`g7$Hu#jbi><`B^NYU!|E4@Yl-!z zu4ivBbBjbVR6H>))b`Ww4i$-%@vP-MF*)gfwy|L>;P0^9{v=Lm{o;?0@PRWE<2T2S z+tD=0i3y=OKrdMyJG4bDr-Y7@R3^(PhzOuU3E`p=0g27%>X|A?Ke)2ZY{Ycm$(hld-=sPl0)ZYee;jg@C#1f12h*6DGJj{fa!2{Y(Z43BB`oa6ZHM@$jcTeck0Pep+GYC+OUv+sqKEJBrGhfdcuIk_2;}c zda;MaVfQsGBDUkr zzuVmWUnDiSA8t?L_Y#}_-tn}@ zGwBnyPbB>S16^XMSYK?fCjC+O8@n$ylhM*tl)~Y~^D39c>R-AN5SZi|vzNMkg8xNl z9|sx;uYsv%7dTbUGA#5|eKj$xXqK#1Y=m#+q-Uvx)h8;`ni|L?C2{`5(} zrPe8k?l@hJ%hi@$Duoo-^cT~d&>RYzA&V-F}!Xnfc z`2XurTSpztgWMh65TBj;H8kK3b&+N68e$_MA=%hFD-9YMuWKINZJ!$N8^ieB%9ROd zv9og$-D{GduF@-F)s$r*Z%@4N&C6>j#B^p|pzb!Y3RJI=!5&XGp{vHk#}8A{P7i>x5B;^aZ0^J|%E9}2H zEI&^T4^zl++@B%1v)(Rg)@HEA){{vsIP>MX-@UVOvJLFKK62N=Sw*lO#q$d~Q&^-? zd;TJ%T=xuPcLv4scB*F*ch!pU=>t>?qvMNjwtK9*bJaByJ*JW%Hd>mpLjSpSvDeGG z`a;aJHfuV!(i8;k(PWZ8Cg5@Z21j?`)y6My8IHcpE)yxX5cK4Q7cu64PLc_r^<;$Nr-Rj|gyCP_ zSTk2w8vpjHO0CjQaC%lmSjfv}fNzLx-hfmxX58?w5V2cqfk;wYfzUS;uSKFMCmNCP zCL5X0Geg~scKug?L9uEzhO6sUt*wnUS)u&#$&1602A$T?0a#>Sr-W--8YbM9yZYx; zeWqC4jeIz)Z%b*on;*=4)w<0h!sH>A784Zj8wmsI!Vk|6YraJ#d9!b+_1W0bwEx!m z!QySa``7AsV}Y}2LF2nRYFJ+1D}d2FyK&o{_56vodlxYWjUr2>GkhgSr;pEGS$2K% zkuagaGj3=|8jIEK6%LCf6a|H7+!v`(nfCZIuCa7UA#8@P$Oc=*MMWXe%?cF5db1l^ zV$HF~)@f~?Kgmfzb}=LYG1S?fQA)ABY#n(H9UnJxjo86(zb^-=OXb-~k=JuyTswO9 zjQT!JZDwfbNB2)T*s;Zjg=);5hqQ{HIVe_L-G?_@mKbJPrCkbS#gK)}zMj39lj0VH`21tA! zzfa`po<4!kG(CZAe^2b707xO5<~$S$m+4u_408)fG~f_^cs<}682?_XZV>$<&{0ma zE#@R|@Q$7hxn_X_1`&6X-dT7@*|K|R@23AwTMc_}yo{?}XE8^WRmF)@O{v}RTYq$p$7zyyVatn8m`8(i zS1NlAyU-9@Nt`_M9%9`hY=4il=hZ|s%ak5nZM)*Zwn&W>y) zpLg$m4c@q_g_F9>3l}@89^_KOP>zR_oDB#FNIaXEvs*7O4qdS8v0*loPtCk?+V>zO z)23x1?{nZiy7k*;>f60P2+5$CV@ghr4s2oFSG+M)t9%1)Wq6L2Iu4WDOAzeay6Rj! zxh2=(j*smlW8H9GVA2&gGCp!Q|GpGc{)H=5Tvr(vp~~*m5U-nTr$l#&=xvw3;aa)f=T%k+F{ z@N8@KQVCM8`#JN9dTBRb*SinD-E`-i0Un;w`;*cP~eknrCAKKE!#dc zr}gseIXk^cEArhuvi^L;p|j)lfp-_*>1Fvg`w5@2vTME%eC@o9Mc`tC8u$`BOWfT8 za4LTiVn$$XGq$X~sg#_W1>rE+c zVedlSC0deskQ3hK=1ZCVHV-*)POvbp+2Jhe2>Tk_*y3=RD9}BO`EU#$j?dxR)jH5` zauWZZVS8d_anImWDeX9&8f206^`JVlGNGmF9p>|p&p)##S+);Ce$&%CZp!!3(v&%m z?5B;YLkw}DE<(-N_{ObFeqzE$fWzJm>j9*BukMo|*F_lyblB4ma%Oit`D5P`T3N>5J>VpKN-s-GFBv^48rPj zq(+Y;d!f9vxs0aLyV>=kubYc=T`g*w(-BIgMi1rnQ7DIlCcfR;=4K{u44V1+sWugf z|M!J!DSRo#W2>JPwyErH&qFp6T8zIpg6&$<=4iVx>ndkc(u>-$f=YjVzqB5Bko8A&<@)(1Z)dq8lH61l6CiALEtsh z$sUg!~-9obL5q&LoZrr~hXH8fpUk-qa zToC-H&Ulqj#^kh+h{c;?@od9kusr1QLC<`iZX9%Wj}k z&^eHW2tX_=p5t`?S|2ho6CM1$_Lurl8Ds&n|I%YcsQJjBM4cHj%n~MQj3hZA{a1ET+ZvJhMMT4JAMD^`*6sY&QbY+z0x%{1MQ8;KR)REr6tufmF}K3?B~p5L3B5)!oC zHGZXY#Oz@dxL-E2mUHS79Q*WYqQ+seYGE;8jGgQY^n#-~S$t|E?YOnoeT%bYpD{_% zQ{tS&iT<&2g@4VMhWv3B$8M+fPkC;f6r9b5u9h^Uyl$<|&L|E%1LnMiOT|whSX}o; zXLl7BALDnwXy3_JT8!cWKqv3oqm;kAw;BLX*zn>p1j{S@D!pDieCPL*yAc5oKP2Ww z61Li<{SGnPu>JqrXsADzF?{2n%o0k`Dy z{4(QmIl;4Yc{1`0Wl6`oM!{2zmd*Up0f?Slk=}wEa zSbnDpwG4%zhwBAO*>-LXqmRrad_Tz0T!YU_z}5=+WbaVID&V$9bdxN z<9{nBNUOawtgfsly~6tkDESZ|2#bgiGcwA5|4Er0mrW}JQHWLmc~4NreGQheOh$ts zWY*E-EMkr04IK-9%We6~bZvs#vmum7!RWee% zZqQ#*t!-#n-r?XQ;cIDS?-gKM^a+->WVpyaP~@SC9^Z4)q5$~}(gn9m(e)yLC>OUCYm1@h z&i|0gfgXftUcC~2)4dWRY4zAI#7OGo|`^l$3P3Yb4SL# z2;&8LwOFu>eDvP(R(Mc)ql%#%E=y@d`O`0|4SHxZjus`|3>T{h3^rmqt1i)~Z)3Uk zkr(e^YUX*KBjN-u?wD z%$>ECrFYo>*>9Ik$?AuF37e@_tcsjKyiXIv`J`7S9bxn^g?BCUKjHg{u7KPdg` zMvZ_1M)`4#W4B>_!duceM7@iN-{_D90D!d7$|!w?grKOVPIco%s7PWlB}4t~VtW#Q zzU<(mnzd&j7kRiJphmnN&SdcTa6*u@W=J-cY#p{H+Sm#DQk9waaf40;#7tiCdi-9@ z83Gro=k@?2`+Y;a#4kP<_tO3qdB}TjTdHjG3P!PfJTU{h0o(W3>bi2!(eguuJYTCE z%Oj|4m8-(>#z@_T{qAsDN7@PsBX+8JbN(gw{=w5yq_XJPS~XVq6JKweVSkg6=Ube=2gz-K3J^KCy+Hs4@pau|Msqd^RwCy`FIQC!Q|Zh z`DTJkw7siKjczoKtWy%RR1uyF`@FS3df{`o=lcl2I-Dy`>r%-yGhlPo>~(clX^dnk zDOAB-W`l&rRt`erO@YWlnN40EO;#rwky=iLK*zH?5E)|>@)nc$XI{F}KuYgfSEap8 z{_5fIr#45aMBSYt5_wL8OQ=;{(Fryfh}1t(|3evEAxU<7zUgRga9CJZC^l1noP58@ zy7jMdgR$u@> z-$EGkqnBgJDyP*rBuFPqXF^5aP>`IjsnKfG%2zpp1kFrsH&tzs8e8jd)q4B2W(PDR zx-K>}S2K#lj$%c%qSx+&TGq{a9v>E8>0;*F?nNebLmp&&_CkZh-2!{+fjXlu$nL#6 zpSnMr$lSCGz@tku1ZiW(x+u$TXFE7OZ!8s=_us8r2Lh%J)xt0IzR5Cz^J_4p`W2U| z9Af{b(iAolC8s^(0(ru>c>MZj(r(I(Fdpqo%iCIaHHGo%Klb}= zsJ|+l6DEGWF4y=2IrC%rl?)XtvVpvTsaiu>0{Bmoo^b=k^yXX*_^Jej&%OD(WP9^1 zL8x^?HxYWBwJBrJ!rvE?i#qq}7qrHs71iRomKWY_ySxdGxEc~JHrR^J@%ix=0DW(dF*RXc3B;sE zL4DGS$C2DUm#?*$)HX_91tl{g=viV}CG5B;+=^^6Dy*-uV51x4l0qe31i}Wtya-+3 zFvSzx!65ua)nZ{_KBc3O>8nwiGA8Rm30wY$=vBp3^x%3b)N{sCjW^h+=AU`x$@TRbAy zm}o_f!ggweWGk``y<$e(YpW~w$F_ypS$Vcv9zMF=j%1-_*e}f>zUcyZ%0dR z18C)hK;0>~5eQcT6jZq ztVGe?>%KYh^l1PIHlEUzS9o6W(`fS;{&-pFo4nFb>odVjvG!AyEz zJx(D&4LHaq*w-Wd?+n+!67z6j+wm2MWd@}nYo^XodzS~Y96z@s@(c;?_x!T3e_v=F ze~ch2c4ZXlKwgmtLuThes`EhAv^suArFTJ`cq~qN$kV$x`y% z5=LUO{}oHr{~*xoD^MXdF*vOd0~=wGqz*Jd21(_35~SXkSErScx5{xr3){HokTy9n;|=wnPnbG!GuJB?*{l^tg6+$dyy1k0tna7_4`C{_|Pu}A|Tplej3>}JE{D>mbP3QvXa_G9~wvJBGd{#D&@i{HmE%M#B z+~yO0c)Vm6kwd8*-;EHDOo5jO0TnKFI3}(UXy0wkJ-e!Ms%*|g#Xx?TancWyjMO*6 z3G{agY2E#TFx6r{f@UG#``=AdgG97sh_*)wl=5N^;DD;h*Jr+;5}9_z8}3|?ABow` zu$y_GuqpxJH+ujj5PX{JG0psALMgtD1 z>SJ13w9i|Fshm&=#kIUH)=dG=RSmkX=UV_R)tJ*p^qV?P-^4^L|DYiAz)va-CV|n2Q9fM=Q*oh; zG-gK^A^6*&P-Si-)BX&2s2_}C51;XpS;%NdE7@A2sOaFW1}RHLs(*&6VDD8M%0Cd!^M{hA0HRk4FF=u z*CcP=u;9KmRAh>^2!^ATZnZLqm2{xHxB4cOhPosG;Y`B{G`s-MJ3Ty~LWD}sHD^;8 z^o<6>o?Su6#ld34q|p!IeD75W-*Om)DOl*Y<5fXw8(1ZeE@Q?h^hh}YthauR_8~Pd zf$R9>d1OL@_0`aHw$`ii7uf4m^-f1`?IV?lS`{3NphA?yTLr;aVZaPpnLWCziM-5T zP=f6+C=1mHsj2u%^S8G!cr)&J32(nDUs`-Wd}=aQtX*(`36hD+|(g%Np#UgCHBRTu4^+2{99 zZEoE_UH2cyY7gu=*{`tL@_cvk$(Csnd-)9|cN5RgQiT^|w)uW^=1w|F5L{-24xOFP zJM3IsUxX%=Z5-{}uF<)qkYo+Uy1KBjP1P>l2fVUF-CW&2>|B2~taQ%^7n2;6{Z%Y- zbbi*!GAReC`rul{x(k8e2351LNe<3>@8|UV1Sq8_W@O8nI|u-6{kb9)i`KH1+tPbp zgUc{1PQA<{cX3d3nW=PUHdd)_42VX9Q+M%p=e@Ab zQpQ9&$Q_BbNOhzFf)co@OJ}q7kgO-+8mb8t?PgE9-$K;rtY1#f{}d1Fqi@B9zrYh} z7@|`$8l!K8N6}JWSsP(b1f2b^%WUdc}s7C3RM%yJ)5xnstoVHa3(YO@8Q1Y}?*JZz*Z>Y4cp(+41}OHRRH6=wfrG1kLSy z3kg7KG1imS3tmwP3H3VbYyn6P-Ik<3$MJ}Y;(U$K`=FqphHcSi6-Fi;bvCREJ`c=~ zez40+n*f$F7vFj!vX(67rZ=so+nV5xJV*GAMm*ro-RS8h4n?!UHNYw;fw@ zjY(EIkH-?_hSxFQYjpH421X7e!!66*0-j^dexUe3o7(b{tLC9$En6YsymtLO>hSzX zP)--+t#++{8Q%knv2+)o`*ZZ*#}0tpE!nNFp<+w z5ELKvGSACZ#|r^XS)zYUic2ZDjkyWS#)b(9=cU$k{m9*AaIG)wIXOAAE?UjY^%a-} zcb*jTWJjyTu7H|E{N`skf+^49vCM{3lOiwUxJCFH>p7Ke_ovuAPMfcRlY5d7E$_oA z%jib3@p8t=;){Xe=e!!OwMeqQ#(2$K8hLDYTBNX)0Al(w{APgsW&EvHXkiWf{eF5YjL$l@919RJ8|^I zubuV9-&NKZ&}5b!5XAQPY!~!wPFI)|qIoNbyMfUjR8PvdA2RHAa1EGgXmI!Utt2>g zT(()(ey_jTUY#6AhEr2s-e0zg9cj&klJZ_vQ>wAJ^6aCg)v3oBZn5)9m1MTzAsjNyJI`=m`c6d=<;&gDd>y;jDe21_7eq$7 zI2k;yfQRO@0=13#)UbYHh)^JM>m$27jW`Rm6bz4gEn(SWqcb=?J-t^11f|pLF2ngo zluAM*U+89;+rtODZdh{0%(1fK8wjTCU+-~Nbq2ukGFP;VXU01wEyXC9h}93Ii`V5aTPjHN)2MIRyhLqsga=@KK!Umo{4t6uo1f8 z#kaZcbdCEI`>Rn&h}i-sFs#U_&@-XpwMs=$$(v-7S}ULH#zvlOM4X^3*PU+FmiALL zQ_24PQ%}p`^X*q;S6ZhBbnvma{lCk>=+`f4#-frdM2DI#VPsh&kMK$XmD z?thLyn}0Bn{9sJrnG+l8b-M7I-EI?WzY#EToy`{+GB(GTrerZ%rF)s_X*gHjKx187 z7%IW~E=ylych>$@9Y-B?X;T9-QKQm#c}ASG5py$Z-#LA<0snF2jQzCntp<4m>{8k{ z@jp!Z(EN4ohEF6KMLvs!=QQ3ADPCS(VI{yP#E#SvdKc+MF`mque*RQ>(Qj{E`1>o+ zJ+w{?a*a>=1ALo&D5)3Ch7TlrL9C6MMB&EEyi$AjxH+H|VQ zORlznLJ^<7CKd5g;dH!Bz1DxFpw>+NVn(_wg(A|m#*G2XRv|)TvxA>Kb}!!--5*C^k>GerCnVXo37^rVwvVbM)EKR{=P86t zmK`Wn;BnA}Et92vSD$m9Gvso@(OaR@p*yI5=}(lagyKSivay2g;dlKeN}s;*A|wLXJl5zjUB3r%&tz+>CJ*j0Y@9&P%)oR5 zvLp|g^QZ|(uIzcXL@wjHyjy{iTZO1n#h2XFIgMF;hQ(qvl>q>4?0WK9w0GpsSqdqc zsGXf~DuOB$D|aiV_1{r2INd&r!;Y))J|Nzm`-a&ey7-mx^9E243!M&LXe;x*UW@Sa zgH88dQ3_@N!Q|$CH;LMu2BywyFrMa~=GuG|Nh;MtG|W(uu{a2+Gyfb>P3hB4S`r~P za&UA<)cO9kbB6y|9Oru$*8DwSCL)t_h%QJb3F+WzuRUWb2ln%7TP4GX!bKpO|kl~ zNCewI#Y?}}h1NVA2yq{;eWmWp|565g*|hQXh&P|;_l>Z3w*C0jxHRx|O^0jdk-HXs zSR$!}A&rE-0={DJ#YM(aGO#W}XFi7ZtICk!bpq`kwdaE>(4n>7f+cJi{~$OO@X6cS z)+fMvg0Kkyfgu}#4O6Hu0CevoiG=+zT_8XoCsHF4X1?m>^)scvFRuqT!e-Q#F|Ji_;%&B9m zHgHGhW!_eDy;Kc1HXU-+a;0`1POea1b>U}&#DD_do%k>=;P#(@g583WG7u!^6F~Qy zoYfvt?EpzrRWpZvC+UZ`zzf?)jn`^T(@-&ziy$pU`MJEz(N8$1zS-K|*1MHrOwaJV zE#V9nI~U(K9t9M8#bS(Qvr*?s8@H zU`$8kXMjQxE1kq(I<4jX?dU-)5w7%|p^@S$X6hgi`sQbN=I+{)P@|SRfz_I42z1N9 z%z#wetfxX*BU(ofhsD(A8nNAm^PF}lox@p#n@)pGWx!4*jg~i8BSNIq4#hP-r_)Zp zWX`zIG0HC$ht1Rntw*LHX1X7Po?gbk#CY)W7P_h5O;AA3KE5?yx85t3DGy`<5-8tb5L83K)z{0PmZJmhMH9zxQ| zwEd%+GlX__92bnWVB~)k$-f8QnjmmLmx8I11{uqaLMxQmzx_dg0O{=PB;w}Q{Jso! z`Y#jJpWhYrT?q9jG8n>Z<6~6hBN+sRpcnzbuG`$@>%Uf>xr((`Dg!XRV}*sXa=z8Q0EaQNno_ZFl)_5#%A>Q_3ZX^i^ z?>GoO{eEk^6_0H`0`UjWcZ59=UFr^FWi3qTUS7PaEpAL+SGENrH`O^ql-bqHDR?1O zkG)wpFB$J=NWf;(9q%Td2(lNYL<>h9v2FP;FVzUQfXNShtL{$+rC|Uo^Y5|++I%dbr0WvysW6%>ty`moyFLDlaUIl=F}6O z(!B-jd3S9;%ybXL2)+}d_U)jRkm=m zi_b_?Mjqw;`+338(LP;(AfyYN;p8f`NGjD;Y$Nt{G2Hmh?y+Q2px~VF_8OLc$mMy6 z_Z2?w1W14f7Dl1{Zn6xEj6hP={$uMvcRMuia9)K^|3;@lF|EeC-W`g$DDMtgd~hIFzHNSr&so)BsM+mq?e+N_U%jX)pPui6JeS*v9yGX=A^quc zQT)T>&YL|ZvrgMs?4Yj*khL80vu5SgjBcI>R#;qK?5SyKV-;G{8rLU{WWm>$jE}sMV$VdVfhJ5E88F2+XdIw)>h(vF9^HrY$V=JH9b$~c3=DX&I90Jm*qH$Fu}8rWa@TV$|HQc=u-e|tBERuCF3hoNpLpzpv}ZyUdL!2Z;0l5sz|3R0Iw zj#bb3&dc^w3fVF*tvJuS^`4yiPXjYBUqaPqL*Hp@0B)>meR_RL0`;G^4wqUZ*@g5Y zgy$j8!9EnLr2ww=5hfhloq)bo|KCR3#iqtTLd`yZcfyU~5?Yr)SCe+%UQ3!m%oRQW z3P1mpl%i+@j`@U~{}|p@yho6c+0VM?%RjbbADNIL30!C&aG{?;=_uqo4T(;A@mB3) zf180m=?7kL>rcKJ4v@+!fk0D;s_%(PNq)E^KlQXwFB4ji5*04*2Sg4}oyai$`8d&y2t3kW zSPEn=Q*G?Aa}88582G@6U15WI4MQA=Rf_V(#(RG|nYI`fT+b9h12|w6)l1+v{%Qeo z6+wqPpqgWQ0T^NPy_r!=QkZ6Ve=yW-&H0_&wc@rNi-67p7CB*7I*fQX``S8QDZ_k%3EU8vNxZ)j*k z7cy~e$6y6MofHMjrlK-fX8+D7J9OrjrW1Mw6>J9GAbF489yq=UUcb;qMVO6PIlst_ z_1{cFX50Sd1PH3ZJ_f>CgOpi}FZ=TY$YbUseK5e&>aqs7q?!L}GN(V^BP41-0zh%~ zt)QSsbbUywO7rGJ+6VvY_x$^4gTplbd3iw_&Y$DSM6s*(oIhoMe+P~bH$@hy=O0SS z?HbDi{h6vDge-Ltqog~aQ!;qL6KkQFpgYD%OEazL6CJn6waDp+x3s?> z*!JdzI7?xtkX5PVy3x2&ed_WRf@(TA)Z-u1Zx9rPLG8r3L;IPk1O$;=nZ3k#E!7bo14K#bhuwUdnQb#a|=XPL9l+!#`VT``w_2X;AfCR zmjGW=Mc#jYDnUd}{&abH*$pwm7GO8k$9hqm3{gi7Az08&l6kn|1K6DFj5iRme-sp% z-r)VaVU#zd&>~<$n7(kQkE-a5x(|=Nn&34d?gNjd_E=5idW2u2pMIA+0>-v*z*JZE z-zSv8O3XxJx@5uI{mwrBGr-2*0^NyII~WFTH`-_4z+tA+RE#?Xi47CEA@vnfG8{EY zWK2RpTpT3^u$w*Jc7Qa6y@1^RP-OfYYj)IjaKQjrkl_n{?# zktC*CMpb^R5z*eB^;`pZPXd^ax8=^i+a%u9?(HwLyK@o%DB89aW2^dIFXSl6J#X$K zy5!`lho)ZL9smPN$@?f%KzEgj$3qH7%Mwt> z=Q`zVi{CC=ChIOth7_HqmMGmxrJzEDw_avR32&(ijjy}g~cRtamJ??9|sV0oD` zxyN7THLp0oh*1iWUm-iI>dl|)aoo2MtlI;mMcez1o0XkuzDb*}54^nU2Fz60xRVww zg`os9-Y-Rw(`c0_$T&*+ZCza5+b4%{ZH-roZj0%7B9oK+i96swwEH7eGt-6#z!m?$ zMMtq#1DN`l5!aIq-K$@Gpzv;SOl0;wtJfr({OqVhr3I&B)3u|DI^?QDB}9&m_Sxjc z9w6FP);8932d-P9QW7G7K;HM3#C~52hP8A)ocPU6+iZ`5*1pGDE5h!jd6`+6c?6Ql z6#Gk{pBK!)ZFmE^c*3Q_FSk;1RC@EDS)CkqZ=YP+i>sc^LgwC?zD`X|jZBNnzMlPl zLWFd{7x)e>kcj5Z3((XRF*I52XJD4__7V;BzzfW~wMD)>*oyhB2&r;x*f2pGK@AT_ z>h16M4f!4;2Z2XEctKAnb9+7d{PpYCIM`xF4wKb)ppCc}eU#~NW5LGJ(YLGxIW-k; z+;Cz5vn(Jlk1H^A8y;B(*>Sq6v&m{)87|;5+ps7XSP>Isj`0~)f;`G=)J#?JcvUQk zc-PiQ?N_eD0|PzXn|n(v#8@?2NW>-NJe*u`2Q+Bfe-aJ5k9W z7ReRv#bJIfRFj@|IRE=a++0|LKBXQ~nj$LoFzxjbawq{G)<^@g{_koNeIrFUi>XB1 zqsc%m8ykn#s!7Mzk&bU->=FpSYcl9s6A}Duj|86& zrE&*p-! z`>$pUun|{Uy=tFj?Ksw%6pVjH(W%pVKIqQy!Gzwx(17MsyhX`t)0Q1ad=#v;h=)Nf zAGsPN>Wh;U(F+wp_q8S4-Feq%YDv>99%w%v*bT>SL#JW?cdYt9T)hQURa>|=EQo{> z64D_h4bsve-QC^N-BO}}uxU1kG@C}cy9A^~KpF(3OS<8o+jGvn-~Anq;TpJswdR`h z&F6Vu5QF)g0dnnTD%|+o-`#pU^eVi+BCx(VF&aov?SB{DZjFRLYWxx4LTaMkd<+s5 zc|U<6K^De;v41Q{55lUX^E$^RQp)ULRP?hjW_jpPfyLd6d0w33Ha!S(RCgj|z;%wi zwK+?3&PvYK60Mwh9NIqRgqMGoC|5M~63?g6NA3m2pu2#FL!>8}zUc;7z3Ez(`FVp$ zHM6+sXM;RhprFM7IknzfmvQIDK z#(v8e*)~>XhyRh&(z4KyIE|s*nW*1S5yS+T>c{=`@=~wXf1v>e&abm;sU#+t$lJ@3 zcw1BYBUUQEjazdK9-UmZvtk~b#Rp8ujvZOc{$&>ixo5LG0>$XnLvgiupuRkWw^~C0 z{DNPKO?1Lvn=aFlhO})^w*8UA3et;jp^;lIo?LfvR&AW9Ajjvo-J(~_H1i#lfaMLv zyWUMuN>(9hepR-pu}sZJbsEQOe|ss78 zPD-kENx~ozI*Xp8&Zj9d`l7Mzw&FC6uf+M0iu!GIZu_hz-^+YqE_g=tEIY}v519zm zyQKpH+6KCalhBjjvXs>+Xj^b`Qj?SFv zNq8ztHNlq=##}k*x-j1&XimtE60@4W%xiFXS>`adDUcP0qi1T(LQ8pxXOzN@u{T#= zpA<_(hc?Xx9I2u*8;UlNB1tTN2rwOdXq!q>fbAa9o9!^nXEi*lg+j<(T3(eHA7?l5 zMcDUb`<@A1TJ+ES_VimMNW4GUZ;4xcnArFXRU}vtCR((BJ zIZ?HrYbn4}j~l!7i~jW|cr{O$0If_$s(fc$lI8sNc8WV9m>GjdQtHFGF|J=chQ3X8$*hnS&XIb_uGB?8P&Ibs#|J0@U+KBx;gML_~IWc2q2^`gbx! zRA8C7alS(#k45d8>}qx=SzXiRyFmRvgl1Xr=%<*iaqe4|9NKGU%l3j@>Q>WV9=2#j zX)l?=kov2uYJN@*KZ>7B{8F%cn%Esi!#Ud=$op-QK9nl#kBpT{nP;45Xbj1N`v=Cg zZ+S%8A3WJ$kroRG9vH#L$Ai!>x2FX{yJlu&J>nA5 zBOe_n!3@Ka@<7*Uk`=(XrTQ~Zph=%iA*DGbh7w8F3+}B0-^z@P(t=yBJ6%Ae!1Va& z$yl|qb}g6AO7bg-8p+RVwgmk_a!dDCQq6_kFbS!(>#8ZOue!Z#beE2EHO*b4mh(Sp zU{w7LlKjWV zN6Wh_U&x{5YZltp*4DXs`6akkmZKIPn3Hip_8~cp|979tZ-N)t!|`Egnt0U{7?>Cu z^3IasEV>pxRTgfzt89h-)l?awA!!OxFvr`cxkhr$W?!E9JK8qa8pd2p+W8?*i=Y|6 zqqh2Y{}TLcr9{0@2>YGw6{YNWB+riB&+pr7w309i3i3;C%Uv(V;*GUtu!2e;0QPc8 z92;~862MblItWP6z{7Mjp>C>4J<8^0nXD~inDVMQCHbjIhY}f1E`U>##5?EL-#_^J zwJUQHv#!|z{i^_+@6W)gD$5V)`~;U8gQIJPryr(*CS-*+VpGx>C*3MM5Gi--c1Z}L z>Y#0Ui!CFX36EdX2&D3a;8hwS^*Rv9swjxoa}4A)y_J;B`t+dOeK}PW@d^$c*=Tvm zxCf7otq1Ty1nSNT!&wZ+rhdA;gyhIdp2mh#p^rGvW?Qd58oZMR!p;rcuYb6xO>Bsu z*S+U^{NcFL%CL%xrymaqxJjOXsufN{yr|5AC@7)i_;{Opd;6MvuMo!X&Yc@7eENyk zi5#Cr=bg%ZFaE=>Xc%FlraFvJKdDPu5|xF&5fei&SV%#rP45+JshdEv&7( z2g5c(rU$RTy66!g^v5?fH>YaKc(B2SqV=Za2jAE!i7I_36Y@lQq3}uNxEId#`%9M{ zeg}=(j{Q%!BxX0P9G~*+g2+mOn{E(U7U(#{Q+jy0iT@row*k_%&D%u>HUhKMbHLCuKOl_oB-685 zEYSQ$Uk&>_DnK&9fY3M~$&oV@vF-kj5Fd^3j<#NjZ1ZjMlZ^-@cllqbd?M7Knaesl zxrfgF5{F(7gaaIx{z9Fxf&U@@s4`!<@SPn9p<}V}4$p$(gDAkiJ`W?3bhixw5wq>j zl*xYj4;s~t*5dqBiBYz&9e_|&CU+3|3m2bX}F_R(zx0is@JK9hFi@3oC1VO2k$ z;8#kil+Wco4ATs`g}!}bwA46@0dfz|vhNgst#`pX9M&=F$AkY669}YxW6o{E>s$ek z`5xfHOX|SD0}=#45Zrx{LiDA4&au7uD|d^VO^X4>L5Zi<+L8o;y+Cq3s)~&zjpSYQ zeh6G_xvV;zfz{Ckjy68>$i8jV|Ek~ov`QdL5FJKM6LCX07zt>!ic0jJwYAjfHF@=2 z<}8Loym&^SGn83ER6?UFr$u?S( zdFN9Y*JCX0sbh#33ZXA|E@BlEmPV{q2K9++w+>WhkOA8gjqHLv2@Xt2)8$~E$&1zN zW*Q>I@RMldN>hofaW za^P#(GdyAsip3M5FA~Hn1;AS178tzO7yvly3E5`X71k$cI`KhbuW3mJEE|((M%!dM z;Qa2SQt5`<}csKtbdgQd$ek|C&TQz@yoAv%PB;uKD#|z*w9L$LMP;pWJA+Y^; z|2bbX8}hmLW37y64EXijY0p9un;P+~Wm8y6DOCgl4Uo8aMR1SW`Fv7r`O0ogK`*Yt zA3V%lrg?P5rw7X8Yrx#on82~Cn})H?vM?CTbXuR$D^YHFQ7!7hoHJ)AdLg>%S%}-#l!|h zfiC*&=GScxokZ2v5%g8?+Y22)A#*kZ;mnEQ-|%kgi@+l1|B;ir-jC(5T{<2e1NxU5 z-~bNPhaeS$>YtvFBOq@$dwF#?HXtP$PHg`A^#D{3CY?RCMxHH|8^v4&%JmxZG8202 zgi+B6pn$4H+~;^L(_d`?!i4}Tnvt;&3SvPG)rX$lawRjl5L?Oky-)C>6V3}QaBmgj zU@r)yxnt_$f{StX2>S&=+XtYSjeMD6PR}>fsMF;9NU0Bh$@_bwo!?1&QT>%~XNzUH zkW250(vXJRkM4TVGt#bY^SSl3U#J;qWQTyy**!KUc6(a@`1mv98xvEl*XJFzLj2Gbs!VH3EAy>)&j9nSrBVb) z+<}mp@aEx-TvQ#1CP=0nyGI=Sh9x@BK2QEDTQIxmmopO%sYDp5opDe!paxC6_7 z`yZ}eDA5fL^Ss;Xk& zU9Xb@4D52;w~unddCV7wynsU+6)b+01M;@*YB%du_JdT(?VW&!emU~>n9p3}h7RXr z+QfbJLW_?9i}CgQnjC*`wi&1EjkZ&h+VeiLGv5TeAZtVzcu=@$oFKOP$Zjk4 zZ*NbJD{mHbO+%{`ubt7!d|;JF8R^&9fvnhM%{AgWw<@QN7BV6M2lBN3d;B$OnR|c> zRaIT3xRV=ETYThJo(qxVy*?+0)7>;g)6V(i07{62@Bu6uV0>e_8 zPGE7g>eW3sr|!|VeSSJ!f1Sl18=rH2nnp2sG#)H|U3|cH;gT|o#W2%r3PZ_O9Y=-( zca@Y_aaI#5EN?MuwSTBcnE5SyHv*J^OS zSvN|w7HR=NDY#Wz`@`N>2oga<$-Q@3FD|@`cz^^1adp>R{cbNH(@kzX3_VeO&ARrF zzDFZ_=nDD{&1%(R46IFJd_C%=`@{pyjROb2%DYjPZ98iMYXzSb@}3veLh6=ky8oGv zH*kqCN(CN3pf^zmc8G^NopeYOSOL3@Q}6AbenzHG$;mNTOP4JgPsKVB z#D zr>44O=2@UfQe}GIi9sb3zpV9g>rcv7FW;kn2`^+0Om{vYoUHv%7pJP|M_u^(m-_W2 zCJ$sHC}g*PwO}mYP=0cx-fd&Gm(pKukBEh@u5#5$Dj`rpU-ai*ahukdFO*>yegmNc|QR;R|Z#VQc`fk_=d}-C`7L-H8ml! z1Hjhtk4)Urlh|}iuVPyht42B4mk}i*sQGJEGm{M%-_99Qk7cPI1`JZP-#(*ix0IJ9 zO6S}mp`D7Sgev5r+V($$$O#Kv)nxo1df{KwiQ+rV<># zPjJDAH20ah4EQFr=AkMO%H>b$emk&ljVF6@$|hXIb7}T?*2~_%hhrgrDld^V*g|iu zBBKtw6mqS=q~|CAl%xumUMdLPbqZvb2<53Yo$uy=3QE!DOgw-m@~#ml3G*5iWW@Qy zs-!2KKbKJoH||T8`7`L!Tr-YtY!DR2z?pgP-{Z55LleC7qT=%oqNcL#VwARFB1vVP z!T!>6{>Dj&^|o`bSxi}dy7r|H0)pq~TV_-2nYN+uE{NrmY#_g7iq8kv`S^#jz&JNS z4ceo7Lj$X$3s@kPpS;|l2*lD=v!$5Q)c#Tv7bW>8f> zuw$o@-gBIs%->?O``+}al$v*Iq|HGiK$o-vM9cW}oF&UZp`nrhiXt!;h+uD`#p?9H zLpeKZVkgphlJqj0a{go{gMeF~Mx1Z|3h1~(|5rdq@`V%ePvuG7+diq?1&;^8Vs{N* zN8YC?HPnM@YhR6M18j&sT`%8H1gLZ$napf3#M`{e1C`giqi!|tYhTkFL)e5(jT(&| z!=U3}(vii8O1=Ln7SB`Q#Y;nHUDV6o%yJv@$ zXmY5xw{F$Y%fXa{jfxBFV?UPR{z5^K{W!l#G1*YB0kydsudoP-2!(-GnCpEZ-nhDl z-{QifJ^ni8*htcEG!8O6y1g_%92x>O$m0(_lxK&(xqrDsu!Fd|UP}*i6ho*#x zrFAX-vb&Sm9iR}o?ECCeVV|8$z*HimHR0&83FyU{jAEaDVunJ&trf=EeB^f%v(!F5 znBkg;+tHwjWT3iP>#L56k@JfY<~F)rj0L^8l~rkFvz`OH$@8O)-ElTW4p!~OTK{(b zQ*F78{k@4Jef8j^QQBq(T?;bD3!>cdyd)wZ}WtLSQkgXT8lgJG3M)=9{C1BT&GjAl&VY(OviZ8LOt&YBK4T>R z%O=DGxrN6o*Yf~M%Zb+2zp*?XJeHqXW<~P;T-GcBCr`sWS4l*bp`qYk;w}qy@FQ74 z_jp@v`M1eF$Snr8fCM)@A6qkUrU$nn?s9AiKEn@32B}s|Pf~%h13nrB#S4UF@FkBT zXa0K=de{gB^;s;?x%LKTB{EE4Y1uN!=jorw6r= zH*wfi2yh8feqj|?ul#c3{o5>Fr+N3cD7z<8jasyaavVRL^5(WMJ~;gp=`a?e@gEo% zV0`<~@eIjwVi?hAzB>m$-brKpG#EQC5{;Le)lG)t&Pp%7*0iMwN%@@Wsx8n)eUf=v_*n4e*9iQ z@wMJ~q;K+fqJS`;yM@SvgUXYPjEv&N(+LuI6(~n3lkF>s8(h>zM8sI|u!}lYWYo)X zE{ui56TeAh{|t`py8+CL=HZ;zkYo-$RGlwC-2ayrSaio{j`ifsmJ^4|1Vnq^^SFht z|LC6{5g4WByx)4O!4;6wuHmoMY=i-68LfguOvveHwosI9iGG2OB{`(7>>~(O0Fh17 zc|Rl%l8Ii!+a}Pd9emZ+T{LXKi$6Z(sCj~6l8`$Um5?wdd9PWT2%u+c$;=T z2{49Fq81i3#9VK(h^T;ZBFf_VLQ5z%g4R+1*Y%O2VLBzC874 z@Tm^R1M^<25aw&>ZqZGn2WZ{d&on&oIz5O6F=g>kv4uWG3I~1x)rcABJ2rUjnrM`$ zN=_<=x4$!9XA|@FMb7Ybp`waTms+(tt#sY;MQBD`vbS80(T3$$n zRnLpGSDufR+h3st-c;e7l1z#vtYbX&xv7a?H1cnzI$NQ=;c!CB@T1l6xa(>pyr~U9 z=@oKi1D@zX6}on=%kq3rc(XUd=!3Nd7&&3YmoN4Pkm#PGZ}dRYr>nu~BqjL;wJ@ug ztfy#}2zlVXDO9plwVIJpyCfW=q%O;5P|6mavpp@W?V%rWU&7PCncW7FOr9s_Lhe|_ zn&ptqCzUd?ZTY=4^66N+d^r{k?#{97`U*foi;e;IlhaHQ95MLc3IVW#7O;;Wu>v%Z zEnmf>{!QS?UIwht@6Ogyj1jOBCvTl?Es=R_PklYXvZ7xu)-2%PClf$&v%YyBs<=%A z{u{Vuz(eXe!Rng)u{1QqTzhivZh?1&xn1;ocPshDvf9nFn^#_y+nYhzUPTIp%tZJ^ zfX4Ppi*2c}Dyqtw>(CYF^#GLJ%6>Si%<)!la~?)EpiN&=RilQvCz3BQU6HAAwOHyU z4b*6mGw+;`dlgAP{OHW9SUInK<^`WbBB5FAO}Vn!4qXo<>MT`29iZl$Xa ztOd$M@eVEfe0db~fUBjkB(pphh{IzPMN_Ks*spg!e7d??wM8poUW5K9GnYSUX^zA( zj2n{_VdH1!qXuR@)jDiS!+?R(-!8f)1x!BceenYxXIf< z$HB?L?zKKzyaY~gSWHa4UOtn2crvSADW)gKZZMR#^-)x_LqQVi|qETisOTeLp}<5oohs!}YYvIB*ukhHe-$rA0#!27$otC>o3>5JQs%U!&-ve9#lCaQsy%`lf|W-)K|rpmCKm{SZ$6jkqpcELEgBNt+{gzQKp9#gmN7cWBfaKaVfQ66BC!qlOx~ zBc~v1zR#d8oXX-c%UOMDkdHU(Wt*3T6^W`{q}Tt7+y<8A64Mg+67k_J)I=VeXrcNz z2rd|7>w}4}A-*F78-mP|KS|A;uXoD45;y$H`TTju^hmOCz{iMZOtbT4c_`8lLWIlH z@8Vdx#SzofI)WF!LckkT%kjB7v8k~cM?Rv+J>8iSKa1BY(NbLKqw%2dKT#F@)A7)1 z4lY{Mc6Vi$o0qqIb-MHC@KALRlZ0o;-q>n1BZ?y6LhLr)>l4#b;Jr}W^}fItoyx8v zq(v$nEnowjiGX8IMx#YB3l=q19*6F}Iaq9sDqT+oBNo;eyy%Fa1#_Nnvd>)Qu!*3p zxeEu|xf1&qaS4Px#qIn-o8$Mx8Y@2={RC=hG?Uh%{k?OW$R%l1EWSIdm0K{B8z^;E zs6JFFQQ~ISYal&5OlDt833C=^L>|O1XJ>-N`T=ypTEO>v; z1C?t096}zn&0VsRs=QHbXC&cG!d+B=q{~r3RimDf{(vuhv;M>2)2D<%{mRkm{-_Kj z_N2-n5qnH}4wxGZu%rULY#>PUBx>lA{N=aJ_WN6>ldbW->CVl~H?&3Z*l90K5iAjVg{JqRj0H_M*{`s@qU1;1c4A;S@t!Hb$;V|-E zegtHH(aKwnB5>LPb7tjyDNuXmY`dhq_^Rr?)ZKcOR;gZb`r~Jegx6G5^lJ1tGli1M_y%ra*^xV@6*D!AOR1`Wtn{y(m&JV*RQ#1Ej zPq9wKBhXN=tg)Rez5qYJ;_am?ZCjW8RfS0>A}vhF_oQQgp?R#vM*Wmkz0s@fTeUQB zd1Vs7<;jix*4dZHs^DOBAgY4p?-2t@9b2C^-FQ`-PUi=4%Nb*b2~yc+c}K-AaZQRl zbtRTX&lsWVIiJ#5atIs^Jez;lYsLx{Qu$E%QI)8H7r8r?_%Js2n_S~%b)dMbnp_!# z)gWJ~b~vy$a#t1FTD;_6{q&=Dd{juHP!5(7dFd=S-b_KGbsvKLwOu`s^z@WVpZ?^{ z{Ha>T-->bm=sNeS1$1plB;y@iPiG;CXra>hKRq3H*6~_FN<~}n_C5^qF#%HU%a`Bj zm4T7c*6q8$*$|m-@!^CIT3YRkVWLc2D?DhsW`%3xCJh@kx;~OmX6@=Wg(FEi znp9PdA%_PDUecxkr6u*5fggGD=JO3M-m6i(6Jxtng(7zs)HLRNZ!er_KOfyWwGS`+ zVp#(yLqZ|nnk(I;4bS~~B5LVq2^pDiU!^PRJj=l(IaKh1itq64I)V`BjoVt{*F^4b zaBr{AwGR@^A|WqmXbRbD-;BNfSPn6!F-qEsfXF3ja@5DCKl4czu7WEo2T`MjL*Q3< z86BUpamTXFo4Z6drIddstJ;OJ>UPIgSx(s0R}p}6B{LwrYU2O+OogahDrM=>5R(?o z1XZ`~h>(|sHd6#|rn#1OJvEV|3TB_f_D0TG=zI#6= zuCMi9&rr3KMF2Xdx_l0bA&`NL{sAacNq|Ao)M=dg4TwFY z@@LX6dtY8&9yhnx>UTKE)^0MIAyh09uldXcdbCsCZg#poX?t0Q*T0TQ`buRF>+)hX zMpH_=s)cHzDp6}7-9qCo7B>aDI-tl26S+M}@GWSOuPUc%c9^Tv)YXnt)h%N}x9l%} z`{KX~w4RES%1q?_FIm&7QEhDMzXa-7b6fhj z94AFh-lGgu8A{_j@d?`ecvE}gwNdA9E5b0C4ze0UlTf@G1?^DJ<8?*a?5cX#m9HOd zm)0*1S1H3Dr0lm7a#}(3ju;2kMXolfX)CMjwSj<{l}1%uJQOeZ*%&ueb!LfSg`P+< zPD(ruJ$Ly*9=Pje;5xT&sdB2VhSg>!?(fdqi`l5E;(Zhq6*Uj|eNPH;taa4{%zM#m z(RJ=%)M2C_e@DnH%1VJf<;JX6Bg1n1tUpa8uvsjWZ zRSySd{~tNe^GLQf=U}2PO0cQ^A?&G|QPe(H(IJ95aE=!!Yu`IjeeeTG@*~|k#;GEi znI@a$*`2N8JpFRaSoF-68|Cp?IY5^*O)2xr>OeOyhIQAGrFs*&i%grG0cdWvm^B(XVFEZ?NdKT(h{=^vGO0h}`2aUl=G!AQfXB%ZPCg&3((PZ= ziyuo&#DmZIuq~>@>vlEk$CF<|9}HeIxvZ+w{6Ys;BTpakZifKZ!(^)S4?gP%bVFUG{_p3& zDHcwv{%@|84<0P-?_`|+ zDg3BNEzte|eQzB&_hu-Zn+uMXdinz1X?A9Shi8xJP~86c<-p-!f0z-a#~$V3X7_}k9E_itYh6#DgL!stMm2tcb7t3#0N z;bq7uxHgnEs7rZ-(l@-JkPs|oacVgXt<}{1JFm_Feh0MO17duDfiMve`%wN04pQIR zB0BR!)AzK410n1m{>o6T&rrKZ4_F^c36G4dmVsH1W^9hZ!g_qa{AEm(fqL2Yz}VXK zE~o?)3oSf`4(5m@=>0i5(}=RRuvoe19G7W%TicO5X`_O{y{*xI?60N8qm=n7CX#?v zccGuvt2VU0p4Zc!KSUxeyBk2NRnSpmiHa0eo+NfW>B4p98%Z1FcJhuM?s1$J6gYQSY zYh4Y*e=;Il)l_z2FcJnmuQI#LtG2T?apzUjJq=KtJ!-N z)#%aE+WI}mQ2gTR(qz1NLCZ_cVxq5)q=xH21!DH+!3w#Xz)!RIZK=?x29}0 zK5e1<^I6Y)h;8SQk^_(nQ=A^2tG6m*P2Oy}q*?w08p>e%(9^wZehQR$N62iju(G7v zF&n%o$?0O!)zeuFU!X#Zlf=KqRiiR!6D#UXh9oD`IT|Rdr;IY8^~Vkse%mxIxyK&W zJ1u@4@DZ~9`?n6abKKa8KGD-l!GKNl6*eQS6x9%joX9qB(MKFw!8lJ&3>2?)(Mdh1 zN~;#_H>UV914&WYz};zY(bGn;alPsK)lczrW&X2-mXq^@{O7iLy?CTJ@6Az^vTb&* z7&(ba)gBMeP4vwqu!jp<`%GqPKD4BTb7(%AXd@;iZM%LfGd!$@&o3hbmIhS$cWvX~ zcJlowB^Ix(k@QCcEh~Jr@&yffWAl+7hMAoo&D@R)a((?U(8H?1zqxr^>2WJe3!Ajl zRz1zVxVXwP=rJ*9_r&$9r>JdOqJn)y(_RJ~1GP@tO3OWAE*s4$dYI64z4T2FlT5h0 zME82FCdIkEPz2^eD$}xH;5wC_m+d(2htYB}L$#k- z?(l>;`>$@#LLlR4)||U7q7#J^lx3mzQYGU6ox^wgg3rCN1Oo>*9s!GRgMfEyLBA`v3h~J$a#PVies_bVtm<^k1I;3@$ z_%1a{v`RZZrLc}!zCAWudFwfHY4F{`s)dkkywP;A3DfwSuRL6aW-x9RJBAxJO1R{AJBtD6N>r@tReEQB3}>0* z5mnXI&MSXr1UY7l#in%qL@q-v|DrM*!#7&?=f*AOpc zKheT7p#4}iGj)zruhdF%!a)N!RZBOJsql~bU7w(PV0KXe{6RZc~T8kNK za==ZcXf+3Lhsz}WVb11fD&ZMPZz~KS`l^vsK42Bf~HnPLs-O*gP35XmvK1} zeY-NG;Cr^d+r`DD$>40O&u{*FLJ28l>9ju3ay9X-jU@d^BOhv6bkMm#mnIU#znu-j zLn3|<9*!Y7YiJLr7Z0ktlSyVCfb8QtoY703^PAj1QK4x0>Y3jcGZ^68l0%uF1%Z)L ztHLVcqifsGE|t#W@TLFNJmEY1tjB6k|5xe zU2Xrya&W@v2&y%ei83X({oD`RmKJLbrg#8DB~|WlzE6fhnnu!AW#(go7A!P&XbJZTh^I&@xBkA0)(ck&@G2yMJ7ysk z5#DP9u4tdcFWTT9K912vB?iQ=>!`%!I=S~~Icuosa9g7-Uu+) z$yOUJI3}5npS$=SBV~a1X1dbpMKf>P6NQqP;)6ufG~Ac2Dj;7$~qCm5x?I zK?1`)bEFy{)D)@`9~OG4TcJIy7R*eRD zfh6kO#EcigZbw-A?mO$0&pbk-VIU@s2ov4fl^F7?q-f$U(Gw*5r7tVG0Zt4**7Ig# zdvMVcn!)xWm4!jwB`v2{7Y0vE7gtXJsE^DE5}83633T zeo=w%W5tod>|O>Jn9?Hz@j+HdX-ZOaBGnJ*5`=s*3#}-v#A$vJB35bC2c+2Vu8T=U zBaGBHkb(sr{E+yNF$iQXgb`KgOo7!PI{^eAHiUwNu_Wb@zD7GEKqnqyIGa~Q3y1tf zANbnI*61{$Snwds@V^AblRE1ZK}xS4P_6YhXI`RBrw5JqzbV4bbZIYK=pG@64f02| zpiLJaSh3z6f2B{0KmhMaA3oUe_Wt*%cnCI5d(^|fdd(pEfF=tLdG%zTiNA&~vGLF; zhuOb7&NoGNmkwfJ`FwoG zLas8ECJQxpX&}fNjjiS8C+=r#)q*W435nlaZ@zcr1Eqzj7xr(%k<#EpsTsODl>SXq z+(I1fSYq_*3C@&W{or&2C)$M7HM~qx6a>d}1nNuP3e~|3M8p04{gt(nKp^<{1t}UH zp!>f$>+M5s zG6G8t^)!3PzhrBj%7PJTkafIePkg&A@*ft!G{zMm^1&T>@gI?{j~YQbo*RckK>RO_ zWYPX+No-*(P=`&?PmyR6kB)@;ALRx*t=*zy_y#prn5Mq|_6Br$?H5KgRTPAMuk9?X zECE)YjspfvbJ%(5FFn?idsj8ifD0`0sb{y+){k*>8%3 zxi1td5@7V9LoEQ)j}Gj98WRBozJ@}hkXb_4gM~U?wT=Yx?Cfklz+UI!2AxAR5(+AW z0(iC-@v;J!A0B|({F-(spnQ7f_{wonAtW#;X8hzM8Ssh?=^arMT<{J%mLSJ#H^J=( zAW&I1n0b!230{&0fvFi?I>;se=IL7zK?cXJpxj1om0MC+S-mgu%h#6p=B+<>>qt)` zh2=!L6)phgUjoC=M=R3-*F2h=Ih6IsMt$-mq;#(F3sDiOjjt3kXYS7qGvGm1Q6pXRCH-EL?t=V-|7)Jx$Cf-h5PLtpEg#cfj zjNMoiaRdx@+HR>d9Zkyw>v3uRyG&>TzTrmI47Av;pA=20xtvWrvaqyVR-1n&AM?i# zutcby7OE663knIT76f2$+0CGyl1#C_w)@}*H1l5>eNp^h@CPY8^)>nRHhmI!bLrB# zYTxHyK)vPH5mF)qet@QZQ`pNrT`u{$5Sso6sPbP&mZ$l>Q0xU$N2=Z=l0Ju0M5zqz*wWC50zp|0cRp937fq{Cn>|M!&)_@K- zRqx{;G9UvlWEM1{ttTmJ=QGhHRD#?o2jUM$P?*@}$zB(geGU#Dy)_crG@QvVARugG z3>=L4Kil4NDXz)`+=}+|U+fOEHKh7%oa-D5f%zR!-ENhxZgKzbYf%`l$P>(Nj=Ho% zRDX;<>B~|7ekwx3mCj4H6P9JZ@HBUEplcVy`pKl{4J7-|A!D$IG^;7F2TxAFG!7`A zmWSbxcZ8awy?T4M?Vw4%ulpoZ;Z2dSvByiy^S~zc+nX8c(my8WpSL$W!q`kF=onR059TU)TEEtgCqY zC3WPRqcvF1*1Z<8D|7v^yS%-6z$3N%;Q(t9B+g4uHrh$Q2*ST_j^rBrNj$=`!>|u-=Hxx_ZE|LYK^rvooE(c=yPJS+Tx}9FGP?pK&zQA;XV6!eTg+X?QSPN;do<{o+ERY_nIER zk)bzI`yNDUd^_*u#^G6^c2RC|#^2$bJgAR)9gAGz1#reX-NA0DtUh*Oekrrag zz4}^MDjs4Vo-FU)9^qa7c50(!^){WtG+bwR)lP5?LSSfXc`#!MA%vU#2M{MU1v1PKNAHkHRz!$At>=F$QtgOeq|D&b~2e#mIJl->G8&g;?>vXaNMU3viKw4PVNO z?mUFlIL4R)WAeA?Ss3cp`5ZO$f)HTcNTj19Znlw;x)Ej3_qRZjr&<2z!zF2Cj7KA+4XmqrhA|pOw;_z|6CG- zx_l`gaBQQ<{EXm`!5)f-XB~q71o4EtU}50&AXCgw1Dj#;RDU)~7AExDbls4#&I;qC zr2ryg(2WV@IyD<_iqZ?#cN({`t;tm= z>JiKv4)?SCu!bI*MTu$x?UI9i8{l2Jj{f`5d zH_pso+I^R{E_QS(PFt=nFU3wZc{I4cVlJehgRUxKq}P>L$X#=9a&H2Pe=MUDDx)pnx(OxV_rW|#Np{U9yqpWB4JNu!aQ zyh0AWx?C(Je;yU?)ceHwPvv3HJEqhviD>8E>{n2X<2uz#8H8G+VR2(JOp+T%@6>Zl zj)X)+`^g#{Is;Wxookz8hvyBabq9$abg&R+{S_{o>4R0>5(alx= zot4(g;fc{I>j?uZjoH{XnYg_2QlpWDbA}ZrFXw?^(a;@rP|3SH!l=1vHp;Ym_Gjlw z)3ckkK>8_y~bQ%kVPAXgs$_=ttIv5Q-HLJ2gQ%2k#c$k=v)G^2$8I#!NRx4hvF=gRqEo{ zM9*C2ZjCYxX08Qx=nA$2xY|BkDJUiH-7i|*{Lw%`w^7&iKih<~>a;K+3oNz{dYd@} z0IgJY=#{lF1pt^G&AbOQ;DyqDB!~GJYOZuXT;5jdu&@?SZ=7`A$gJ&?kj4BPTxFPB&w=>o3WTVW^j7N@pp)$C9k;ywOx$Y1`DqNZH1zf}_W*JsBrnn5 zI$>-hUD3NZP^iVtSl#?U;tJj4w|EF7fU^-}e@D%5GC}B*y4Ak8j4TCAbYO$ZgUU@U zH$9)NOzp_CVBB5t;7ss#MszZN*=Ia}@T*pvd>XgGsp_K3MVIEuTRZb$_rTOyA}{XJ zthVHkX#SQqrQ4SEB{0xIiRjeLVwcwdalrQ87 zQl?WLoQbN2VKM1!R`3`P^MSGP^M8#LKio*YgeMGdgb6J)k}3yWwZz$5qknrVJZ@^K zM7SqjeCj${DE3rRhIWvUbhDJEWWaoILU`Q6=_H6*nH!H!NV`lb&g_+fOq=ngo>wiM zW&{vj4tvqclY?zU`r~Cx$3ScLs_;^gQU%m3R@Eo4$3(=Vs}v7=OpL;weQ|+-?!L@B zFO{Eix<*F8Tx6jr2}hotG@nL$bvEf%t>r)Ub+_2br*E+b4Jk%=h4}Kai_T>ihOhX1Xao z(iC*Ynp5Y}AkKJaDU-Re22M`-Jaa`(THRcgl?~J;F|T4h zLdM~CfEGG0MQfnV!61oLYkvE5qDTeDZ}de`iN?ML4K>45{x??xH_6-@yY8xnjHD0k zN;IGLVo0+zXulehDYzH7%qU^T0&}8f#6pQLrrcBtX2_uqDeobnfn#c zR%B7SddvII(8`jhe^4c*PYHGzHC5|(E)=UBFLxF5{aFLE2y#Vwd;3zR- z#Fp6}o7bJuu|ccgsmVsuoZQL4N2Wf~O0O6oDM@E^14%UJ_1`}KrYjrU&;7&^S*5aG z=T-eVIgwaE=EeqStpIV~SN87{Rl~B^BV{_^d0jf&i`}>YaB+&ubXM~QsjI8YWXH3t ztL5@fFz&^142Dc|O8!VQyki%0ec?-xPxO-(q!%>7C;E+Z3%@g`$`(bBe@3a~+uNX% zK+lPLU-Q^$dJGh5e$x4fWB_L|ajy=j@`Zv6_O#2SF5K@|52#D$IC*m_yt?8(`;rN_ z86}Q(g{3LS2IV8EsXJzAY(3W~Hb5|^Xp|nWJLZ)ls%0_)Q$t1+L7FoE|B?2VVO4Hj z*rUNJ=hBx^s~`SzjXAggrdN!EogKH~rpKq|ux@1{DXgiN zcztjGq^;Xl@J(f(vc$G;48|9qLqy%%J9y&NDgxm?H&Nx$|0gzM59#-__57T`ZJTP6 zbH@dXxLpxhL0Y6F{pRMz85cnDlA86IJ2dMTfbw0^OFX!&DDNg`+lj9U8lJ*g-n~oK z56Cd$ZML5~7t)@ljzP%G>%vBMSjraf-Uuac^o{jwZ6O!_EKVh?%oZhd3VPuX?hFFj za$GGgT@w&u0aHYHuj*HAt3RLTd%{6V$wUm0_(7NQ9hvXPLL^HL2>@4yzkf&ZF`Kde zw#r*MU>({Ai@Z8Ik!}tTmERR_;5B&E3ErzHNZ+}QvR~g|5@7Wp8zX6OZ2#rOo5R`W zob%qm`E^s}X4;E9J!swjuyQZ$r*e!yIqy?3el?baOYS&(?)BeGv8)?kw#T?4vgQ)f z;tjVKWPw{cnYk)YcCm74o;r0l(;krsu?(`Wqs- zm>g_5X={n?w)n_C+=GP=%mMasz^zJ-^z~@R5FN(H;M~qeSe!xX=?Bm_BshUwcaeQd?*;V_|p$U^HU<|;K;|_)zied zEBo$OkhU}>o_?zdE{{t{-C>ySpHP^Bhx>{^EQz;&rMgczY2p=*66$ig9*d%F-O=x* zc--&7uuzW5A6IM_|Hh!^=LbZIjqhHKt`FBCCzEKAH4Du=ueAWU*AE2-^7-QHiiqgB z*^4$CJ&WFXGtS){KlK78L611*BbpB`LE*xV%ZzoJ#m@0H3{jq zDsk8m{Ikl<9FO6w(9CWcOjP6ll9 zyLv&ptEC$)?<1TGuEK2BPfS5A>2u}E)Gb&9xWfb2`4}(@X6Q(bv^-&XD6VCM4}vhb z@1fa0=VERH>iy=pL_Ygy1{=y!{*iqyj5FR~?{ISV`AoHEaJ^{62_xgNvQ`deFE=f-g~ zgM6WUv5RBukZ7$w9dG=HDck-ew7B~}PtoiYFCiPX)E+GG{YF-J0PJ$1(0S>|48@Lt zotS+*N!iGNuZfs;Nu}7NUtEr4=+1l|??+7nQqXe2n+4iNKNxZ1yZ{-TE{lb{|C+(> zXKAg%Hv!Ml6v@A(r~Fsk&B2InkO*Tmi>`KKz&^=ap>Ns)t-0Gy*%&O-i$*R^;cJe z>+_q%*GaW|`v+3x%Nkv(*P9DTm+`4REy53?2HVtS-%Rt@v#v~gp21Ws87J(Ku65K} zZnCLH^0idZlb&&LZ0<7UJ>Jb&#ilOi5GxtNjhVgTAYkagsq-$2R??_7X9z zn0=xcqFAQ&kKP!zpFpmr?faqT;O2J7#Qu)n-U;NrSp&Zh^mZdK+16TZp6Oj?8jd|Z z2%Hcp4=z&Kj^}Cn?7lw%Eo1T{mT0eWj}t}Enc;X|xD>1IO}4GtUd3{xrRAL%s@OV! zRjC4mR2lbw3dy0fs}Jx{NJN1FcE$i#>mIW=bQDjZzire$vCCG_Ptb26#E`?|AkWZ5Te|1QJf8g0r;zry@GSN$akQ$ee3syZD2W=Cz3bYHx|3GFK|Ah?n;<VzYK&u>dh3xeD*YoeB+yb)>be9LLuQ_@?M6EDWUgp>7c;u~<4;o9cZFk4#%sZZw|Y#2(YgBRR&KSG zQ^eCJ(d9f2>opg0B_$;-nk7|3x8A+N!Mq8n!J$G(1d|B>LlL5QtZjyQDUKWimd?a(A5Zif^F?G| z=Ui`vQ?Nkz5YqpE!A%B$G5O<BIUhG@R!ey55Md$eyQ; zc3U3QiI!BoZ%Bp}W?ST_3n@W$GZZ5ytqlqvA$!)T)qmi@<8THP>7~ek!l)fE5CNmY z`;GP=|5RDxm?L3A6Q={zOyFsRZ^D(a`?$UMQcGfXl;F|F?OXKQBSQ<)^INPQiaCP3 zQuwZ-{qZu944;|HS92Zbxu9yN6w7x4Bkr)LwcbxDY1XDhc9 zQKZuqn;=8^&r@^%EwB6g`~N9bj51#&$!+lh$@8N9w~%%DPbMG?aP^#(I^h%n=I;)3 z1qCEx-2A8L(2)mHd7_|-1mceL_iriz_ZS;I=tVV@wj5E<0mzP(vgL1jpAfyNS^^-c z&c@I42t-C8%RuqIm=FCcNSoR7@i6>-r#?Q12|%(3%0jR>Ko}1QsR1VPAB)2dTnWI_w!l=|BRycJ7|2;Cl2p9~U$wI#7a zws6t4B%7Goh=_>daY;#S^so*_Q-h~Ig>oY7?@`0ko{i-?7ukE z(bI`P@f?5wd3Y6{?jSC+{{xlk0nma!@C%(Qc5dj%+rH4(#ajc@{75=}!r27`W>kEgmd_Bm_slj0hkblF5hPEU)~GZ zG-?W;+v_`(1323ool1;LXELraCUw61pb_>1=vj7~>hJ3M2^tcL0eLv(@$4+w7#}-C zKoCHagz|a3To8ftc!$Hx-?0i49|0r;)E&Wlrryjjdp_1V$2nIqN4_ltz-ZOLBst8+rArNFy|6StO0^`==8J_r z^r0&?C1wd!;Ker@`Gw^OomSTzwy3_bg2VGamc@xvD}RL*pr0#jR@u-(*>sN9)e7HO zKO*BKSA5kTme>MVAatx=-!LPkto_9TY;BC>GcBi>DW*tT$+!;Q1m*I`s$$*VeNZ+Y=?{qgqDI3lD2U>D&(Y5xju$b`lG!V2*m>uZ(Dk>At+wL? zt(!|CD%uRgrh!_edQ%%cz)gEwJD*3y&M>P0t|H%m>ZN)LstAAx0^QJ_Oz!~S#XTEsMoqy7!nwJ*`?p&j0w+DM z;K_{Iprg9+q8jv(n9nwR))8X3lq#g6Lf|F9Oc9=Y7`q?cF*ci~r)5XwW#rl}Ms=~B zE(BnsIiU?7-67afUa#dFd=JgiM)@C3p__LE2fje`Wxp4JYZL}wlGU`+#m>Lu<5o-v z6L1y=jl#Oc zC#$kv2ZqJdY?0d-lB$1RXSwmk)^y207U%7Sy~KBe8 ztH)ztL_v8a$8GZ9MaYKXME!NIvsI^U?!e{_b0w4KlXF}`Pm?aK(*C4Co*-c`%|kqj2g5+5J?j_Mw4VMOnRcee~ zX~}w?_SXECHIbjVw>c<~Ydcuck}0huviTz$T-kAJAh;vDl6LRsE;{@el2NzU*>O?V*nHlw*>=qX)x$VI9(ZB6q8(qe;ny({}#F}kjtTM;8D+H1B&J$bz zV40JH;*=X~z?P*cavqud^iYp+Bj&Kp<5d?0RTFMbWr_N4`_*cWvVz}1nwP%WkDw-^ zd_uEdgU#IUr74S(nV7E9nK3*h)E*|C_;V(x=yKV^P1VA?FCl%@Ey?DteqcX+Yu6|moj!2d`YPo{(kPy29B`>1O?vE}vhPDNyqX`OEbAdr zd%E)pQ%@(?G?q#KqrY+1fn)Kz&n2#FgRC2+!?bC8m;K(q&l|v4Df5YRQos(EU=~;W z%$e##uL@v$8T`pUe2hz(RxVoi*n>%yDdWjY#_L;e&k|O2%jY(Rlg8?HXNyc!>83AB zVg)zPm#W3lpAOeh@r@s}e-ElG+8@EVa@+Fl@{ea8_Jn)9@U5f^xa*;!)K!S;%f%3| zm#?|s{oYbWBKMvL#k%hn&0S_Hs8L@*E)Ra}B})M>VZP4PLx(o?pP!c>0o@srA*nK0 z7ReIxOuF?TZTzrhp%x87!6`WX)h(I@8fUXIl>GG8GcnQ>^bX&SWCTy8u+IOg0ZwfJ zv2J~s+@BO{SN1l0p0yu7;FjAYA%47$cg_*5JZx$3pk_*(EiuWX>{Up-`sf=mUrI_o z+mk|5sN>?2amcA#;3J7=f*B`nU84}4j%*X{T|#yxC-IoIE)~6Dw#5eETNGwqtQ9&< zM?@#(D?ErfXz%x?q~Yt+n&s&3+SId3`G^3mtsh7`bURWfxbbp6ysbQV@H@2dlOVxR zczg^)h>Gd9l(Ib^TwVGodo}E0<=xvwl^PsjRYE<1oCgB3cci%;Qlc{&4`x2O*;O(P z_hR)Y1~=Hd+@DfARqyuOwbsT7bLp9bwrGxm;bo2}#Do)^@v< z^`-(v8xCFiG)&~)@hT7^WXt-FQs2w?7ma&jVe0Olw>7CIJAcFMs|qbGDPg_-_%;{n zINQ~@*V7#a*I2%h@BDOeaY23*=Qq+>V}IQRC_$b=)iyp~pIWNVza7s>RAR_F3T)}h zDOUm9FME@IF8Y}aPQX0d;CB=^V{fR<(33d~;DNrXvb`S1>rcFd z>Vz#SVCP>w!8NW`Ob71E?d%vk!c?2Xn z*Dft_uw9sNQ)YFM6tCV%Z_`J!Wjck!J$AQ(&d!n#+)jdj`HL^^Z|TRP?n4 z54u|*_xDaj*24CA9H@6Y8`E^}Qj}R*TzO1F%iGKKFof%b%bs~nB&A;T_GBApf_b5! z*n~e0DsE1_RW(1e|BVW!xVqoH^V~ZM`ZCfC`jYpc6I%ipo%ZUWDOX&fiAhta1@Jm$ z^sIehk>hxfvc(^5Y4m7Px%s;kir?}3*92b};^WR7I{C_WM`W0=V<DV0 z*KbX~lH_FwrX38-5DG8Yi>C6?YZa7Kt75;5R&`jJwYQcR`PNumvq1Hx8O`@&s8tYh zN=eZF-~fwv)A0zS*;ZD)F<-c+d22i7E`@nCguL9nKyoedD4H6lN2WVCZ#AgCl$5N* z6m>TZ?ee-Q+l`+x=DYpg1;c_fzK<6C_S{U515;#5ODF?^PbMcmz0nW@<(MC3UO^Td zMX!M(3#cayO2@$!p(raw89`NX`~CBCou|W+F_NWS4I3=S>G~}hjsnM<)W;qme>d+2 zHBVyOc-r?a$Pxh(Hhr!4M(y9Q$vOc_Qd{w|QlDhBxgApyLdd}cW?!qg1jtmsWtK=P zv8@uWJLnwm-Xx-uCa{&Zl58H#vrJDd$HtO()_CMfZ zNkEGghf*F~?$tacBP7m2%^r8#UmsrbW8)5Wgu=%W^+IiRrf$v|J6IuhS8c9FVcr}W zF>c|7W_a5f+SyBm%V^aPUvLZI4bl>E8Rj5eue=_D1}!sxxiC!i4N;P+mk7Of1~^S+ zGk@eu!_dE>RiEyE!-g-Q?E!@GdQuY<|2EUvjH&-O2J%a0+c3qAY<8kYbQf3*XRaWC zrXWE%aC$aA8TH*UzP6ePq1UZf@jIbqN9j0O{+hc)%iUEi)MF_c zgs3y5dM(vVlsPA?5D=tFDCI=n_q=%d?sDZFh)|Qd1^`n| zDK}U^u=CmwQHtkTJ{;kBMZHK03v6RKjD`2Z#&h3CoNC7?N9b5=emS+~&nx>jr^ArO zG|kmIi{fs$G-b_Gb$Wk;D?6n2!s%mWSghTSTT09nZcl~%5gu!r(VV(}Jj~?IMa@)S1 zw+g5$2AVkWJKB6!@8&WRU3+@m5B#kW7hF=3kLl@n(VZkhusdDq_rZ`pE@xX|AK=Fw z1WR7n*v$Nd4eZrot1v%}yvDOrsB*kZkZLqgJVh8ZB@;kC$qL-0Qp zcq7j}tuLsFAzMJ)rfZ{=j~s8VI~;Um z7ZzfXdTn`8zxF#NdzEFg{cB|Y42&IdwEQr^kQGv+Hvfr}B>C`$4yEA9`?p&m6FF8DYQ=Q?Aw#x6&%VE3eC?V*K@dMc{~JVwflS(^2xz5^j}Jm1({vsZxGc03>8}Zm+s0~1ECFYb=f$6ypL;7rxZFfK>h;_#@(uV=uv>Fu- zUVKTQG5O+o=FONuwz&Akw)IREb^@36&ji~BZ9^A8>F``TJh%&q|1_A;pYIrEG+Kfo zg9pulKQmD)5S^SRijgyG?OF*r&?tC!pXSq?pKxrRYCowU-uo#hOL8GDBxqMm+g2fg z(Z*(2E_Gf>l%`B=DAVBK4zrA-xCFs<*)uc6B+wbVkP+!7=tXrYh4VV#%kI-ys~-k;G$G zt*WZDlp9tYF-$u7Q$zx(g*y1eH|wV|65f|~)qHoy!wI8%GE6vD0`VgFu_cEoyWc|t zc7Pb43WJ%WI6EmXM4^IVWP&*+FD_=pqgP%x!q`uCc|W*gz@F3aVFFg5@19v2u=67S zx6$zE;H3zz2SleJmHYg~fB|~NONrAhfp3`fsen82Tk=e(uI5^CnbH zcDuitW>jRgPgKeViIWueHi(|(D6`=EiS)`N%_2wwMz+?V=SR-w*}sOAtzQahICm_l z`7QpbQu&L!OgJ?PgDC&XBzpKqe=l9oeexdZE66{L`T;koZNJQ7KDEg%jEEaShy{OA zqCQWN)I(?;fBjRqu64!$r3plx+ECuZu&i%(-AEFZPzjeU&F(P3ZpXVu zm(=aZq$u@;2=r*?E$;!32y!n^4w)IzZNv6`StRhiPX`@9M~N(;2NUvPlkinATz#}T z67wP~cV3I+d_=D+k>t$aL4hIOGBn<=38l!Vrwj+#at*)Bj`b>Wp3RXnKHlJLmFNfX z`rJ->w;Jr%nH)5N`*(m1##`-^AZ}zJ#Pjb`XAs3Cjm&7h8v@=@mt7;LSukxZ5*dt; zE&W48`4DL1L`p>enW==eSv&2qI5{KZqtA#O6N}|nKv%p&nP#sPX7ZGvPy16@neLcy zUTJ(uU6osR8_c4BaoWjbKc@K$O^Al9H*jgPPQH}P#DV+Eju=zQ4%{}xBwx^QPUzJ9 zZPTPfhs;oI;$+V2(poM>h@`W#T9&igtZWZgGA19eIjaDNAmhZn2DUzyi$aA`JFeHn zJ4{lqjHEA5JrGj|VtmZpAGA3YzE>pMlokbE7#Hw^r|yJ=@qhy3KLr*)Ih2M^s9U0- zq!6$A=`giw&qX^87> zL;>GAYppc$zdf1%_F+auL?F-r)n7q9R#jT05zNCSOyaWEQFz0`-WR5X$;OwG_}Q_a z{CWu5FWrQ3|7 zbLgBD09+_klK|!J=fl{aPxu-ct&zw!g`h|s=PhEG0QUnfKR7*jR3;CY8qE{+Zw0h0 zQki0K5p;DoVwy^k@G+gSfvT+tTk6WSL(yd^+OH+`p9d&;pojLYBzTCzW1J#{Bgkd* zE)X^Gz0YuWwut-MQaR7#=-|Ux+ZVDMk4k+#-&!KuruwtR|(}2;%a%{vA}D z82zV*7?e#Ntw7`#!tn;Te>ZDUrP$PkO6Cj=MZW>&NUHA@BiTuWI3c)? z&!ZNjlR`xb<)YA!ek3gM8H>g8aaDGr0S*}(a2i+g-fAF&JC}~A&zU9hZV>>Iqi@87 zoR3znQ=BO&R`9vV0$#eCa`oxg8M#H}EpVXLXf%AzFRu2EXiCLGF3*knT&RieXrppB zt#<5HrK$SypxsF%sv{_qz)O9qm0kXp!Us*3mGnZvSkaLc%3r1^?yE^Idu_zFRg>Ag zuMr65zh!SctiR>(R(6&fGLKaxQuV>>1q1izf{$@@kf}xnJXnTasy%LHHdM2EXLMS6 zsVV#@Fv%yIPFz_n{o~P`2f84ts3^KcI_;%*UyC01o8~#HQjlp)b|WQw!|u|>KmL__ zwdc`k7plo)L&E5n5z|U?K2SAQNI?hcSD%mAhJ;QyCbg$NlA21b0)2<|c~wMLutj*go~0AwCCi<;iib8D7u44{%G?@Scg$1c8%3(I?OQ)Y^~;%ii4eZMv3AGCq?6-cn02NWxHKq@Y_oMRFQvhTWjmOiN2|o#r>Iv zV<2OlFwWB!u#Xi8d0W=ImTgcpu|Zsz0Of%`3O@xe{S(?Sn!vVe6i?+^h5I;|DdI~0 z!ts?BkHFBA<(UrLh<;1Wp_dWLk%J+*H&6Qg+nhvh!-FBSt&(gy;Rg33`;F21$vMyA z{=pm2s5b1;I;6xTz3|usKNSA3GzBs1k)UjhDLU6{oqKhbu5T_cu8n#InJ9}~E|n=N zXD=(+JK#CIj@!c$J@n)q1d^vIqCpkPlx#$gm;JsvEAx09P%=|xcHG_hm9H%(VQg&d zw7F8=rwwA=hiZtQa zmbnLp7B3Jep(NbS1^u=rA~Y#G{T3<(ioXo>7Unp(^leoh-Pn#BgwH=6Ud5RJ9<67( z?~_OCekae8mK92!s@v!+RU3)P^Rii7$>igjX<)C8QF(c}|%Qv@uOHcZ~>y6_}38e%Mqe~BDtw;J0 zEED+iIz%V}JtCxPvyYG1p<_d2uw7qin%KH*ebXKTDrLw&H{|nNv#@ z^g>P9^jcED;lnf~_GSq_OGi)tJ~x5E{m2$HkRDjnux_V`n+)+d#ZIMh=<=mYWiepq zRJDn-q_txuu^xFmXFy{vV3w+ORZqXxZ#dee5T~YYjVd@H5tH^L1{6{91fTY)-h#sk;O4-@ouDw9liSm z2MrFVC0ang{5E0!G&x>KJXe!%beCc}XN>Yjt?_Bh;^U0EnRi=r?qVG*8GS=@N;peI zH$q09x_TB@h>HwSUj=3f>*_23gDFf-!B3rtcb|nx24Tq@zvWPMl@s7Bx%SoqgrP#s+7W zqDsJf!c_iYtYY@_behH2Sr( z9@^`@OaFX)WmSaDoo_)PvfsdWf0Wr#3peADDt!07Ui%7)%P)Lw2@=gV3-%W8{#l(AvW`KlYQwZ4Y@8U zw6dK|XPf%>y{|sK_qD_%aB*-P*;v>s2uXIn0yP7!<5!<(gi1x{a8b2DE?H4__Fznl z)>rZJLC^N}5jRoGqT(tbLKS$7_|-eOhR7APO>D4B&R^JH|31IVmKk?|8EKMDhAL4@ zBL7nKb)73V;BOZ*H>ay{-hRNsQV7E!XJB}EdAchZgwOOC56{GWvm@fUl)Sunqt`XW z%DX#;2@FV<1R+^@n_++-2y8>b!yk)@iD{*}*?d8~s1g&{=Fy++Si0dp|L*f$f|LYP zWPEV>U~igYY?602bV^Lni8x`O0ADAd7e-0(JR#I6hpDd=V3F{BGE4EqN3ayTpKMu} zuTI-GwgOH-R^ztd2h%&#l`ImW&jO^s(5P#z=2y;%f)t_o))-^utTQoSLZdvkVYduT zximtSYia<-aq9E}=H^_ovfmPb8(y6h1Xb&{B?y}xL!8`o8KAjI^X*feZ5=N>q|9T^6 zHSt2=eECb2`!Ph{``U?$n)EAIB(uQjj02Q12ao}`w3B%=W{MdT@jK_4o6R?P0($ZvfU-5XcBiKM z#me%s2}K2#;L+oF4hzaQDQ}zEn)2|j09@Ks{d#wrb~djo*ZrO!AJO)E*!%s>q$P3` ziENvFF3l@1;Yw@o`xmfNm&ZZK!X zCSVDPiF1PhXTFCk?CUQ-GB1DiT#X;Ivm{hkj+)Y1&021{N2MD5}92 zOV^9_tif6rTczdLmZW6CcV{o=yl*`pkqN!_KPk5yFLK>C3VzC(+EdCw#{9>+%K{Tv zPNiovos2k4hZ_eoTS-1vgc)*}z!BW6=K_TLh}p?pRuewmu`EHM^bgjywit(;=y9Z= z=Laj4i&7D7dbQ3AyN$PPWBIzDpL*^6K%*=ndiE^1u<=GmOqKpg<-7O-eFxJmfNyhFd>-tqC> zj614j(NwXiIU@}Xbyo-7i2{ck5Ke0;OA|_iiueZ)4oX+!?wAfx7;c4UPhd(~8^NC^c|x^gdh( z;1-bpT{vA_=-dy$lA@?!pIJ`)RieHO$*vDj1XA7Xx04z5XZiX0tp%al09Iih_ai!d zCLL710ly&?>1XsZ(j{4n+SG)(QWErfu_|6<9$Tz4fFoF|#xciV!0UV^mhxhv(c7EC z0S`OlWX(Z_dW^uBkc7`M+kYtX(eQ#4RTWi4R6#C_drpR=nC9q@-MjQ2jr6gH^)a>{TyniRs>bTds+=H*_#Zz2xS?Hz{%McDu|NOg z1~^4=`>k4pffaMs!J|I#nGcXh_(DX76ci|(qA9;neLpgrGSF`H^28P-;kHTS+3JW2 zR)Imp@6$h!K9HoZc+yEHO@mH+EcsKCev-s5Fd)WzwA!*lY1BL#Z38d9nI0hMa8=@AdgrM)w&zwAYxX>j0ADauAl4;s`5t9V8_ z$zXUL_Hv6)?SokbpE*>!m_ru4Z!c5Ajh4(fuj2Ox5GLwA*p?8+C=^W96C?>l(Bsq; z8<}OrjaW}ZR1{psBAd!e&D{36G?6%_1q)Rtet>R@kmufzEXx9zKZfhU9`ZabDrRGK z)el@(V$Fir*l0M)T`Z#+^>G(Qb!JhNdEjsH@iwvJ~Ap&F$6vGOou1Rozi(42up$8l?dl@)CxH?=rC`*dTpn>_8vWhy~N zSy86@_~;0aQr<&Bx?x@BnGA7ew$-^A=S}?H9%4y%z>+W+BR^vPwYo12sH9Ui(3v?`MB<- z>Io^j;dQvi$HV)Uo-THu;#k&0+hUil6RO^o-Y zhE_%+V)F%(6Ho{0t2Nm+Y8TfTc-rYvI{&B%8uD0R%U>tY#0&iWgM+bnT_fZ%8bfSC zc`2!Z&bpq7DW$5$1oVNV?~aBlhK7dadrBLHHzMC*oGn=F2m`+r3?7oiluaTp`LCxD zs?U`i*o+M#s|~u{$cMNuUiv_z3?BYb*%rXeUYTY`|248Y^Up{La9=2jR0OMpDKMt} z{=pB!h*6f*b4%t1-oS6*JH$V4F{pg;3P{QmWwxX>`}Yv=00P-R9~V?^E6&Z;%5Cgaic*tAl3Pn)}+f@^H9yHVRYNPdud1 z-~*2z2xsMmyw7vQVv>A>v_u+T(BB3j>xL#lM`DhuZE2JQ5z#&v@2#~;h zb;3L%uhPtdjKLdoDS>GGh8=Nw`hs@gkkup1!+3Q0uA92J6g{rOZ;d>9Tknv?NXjaY zs!49EWD?vWcI3O~pTQLRR#{ucD6Uc&Nr`SU4JvD@nebk8FwY#9o}S*c9buFJIeNF1 zV8I{nt;h_l=A^D>DmkHg*p|VAJfivpB5S$fu}??WV@8%YGhdLb4=yd6lv(_=zP>!i$nA^qxC%68*A09>!>!-@NW8=Av=eU;A_plB0?mB z{yx6~HB#t!?xQgjk5Hq*57B%3hj~55uVaCaN{s#OV-S&~q|sUSbb6@BpS%#gh59-- z6ScJ+$uUlqI-EIc4em1QY6709g}B>JZVt9x=yca^^3H-Q&l&T1kFQ;qfB*i`JzZZC zX77m*tQ0vdKUPTU^SAS9E;{L&G0H)Pqc&+zG7w^O9*>gj0|(|ESnxrdeULrKHOXac zt3!_*du45Gn8{4lp158;!Yx96Pdw?iceEGoo+NwzrZiaR4Mq9L=NyF8Mu#38XaUt& zbPuRTOQqjJa8Z#Q0Z6{)WUe8E-xO!)!%xxBa1H!t<7U9u7Qt4=dKg3}|AU^HSs`ng z%{XJejIrl)LM1YiYEDgJs^#6inY%zQ!~;_ZkIPtmuOT8LFFf9Rxr3FS`TC`)1iqy7 zc?cAli$>%$03RQ(xxHO?BPsQXd^bH8mj(eDnXU5_>>?BDT=e?84r*5xSfx$*+k<8x zun7wAg8Z-5&=Ml2yb5$L+KE69vG1$P(B|>^>9<1#wSEa7^B*b3A|%^M`{bhX%NKSq zM~v0g#Gs|j0=EBNZ39M7?m1k-LxQ%`#G@VyC}hvXf8_ursf2j67jKz@NWSoRzD^1D zr1m6_2L!#fwY4hIUVby%?MhB$6csj#=^GUEkVs-wvU^M(dz5hqwge?CCxUG|nIs|( z%apD#DJxig3~+5=+6^-`E9i95gE^{MqMgpn-CU!w$iqQh*K_rmCo;fttzO3ICU^srz^<5qH6_!Qx`4bz#aWh^rpFv zzK?mqYBb${|`naeKdzOj!gCP$M1r|qgLP<6#Q3O&znE~+S&NP zEZ>Yxx*VXnyS}w2_w@hv;(zj^Usxq=K7uQ8NltFUK|%47fP}=_St5F}>85>*-PL7| zD;-Kep4N2t?eXJn{%ZI5Z9fLY#dSiiNv#|53p!AaObA6HNgK=yC7biE(j6sUp#|cp z0xwV3hzFzohPZ>O3|PQ286s~`lY=OAcs=To@;Z0ELVvF$OoEh6rcPTZ+GmANuIU4+ zqZ?s1*X&6OCDoh~O{ghu8BoO=Ofjndq zC3Ym5iAl|v>U=x2hgvQzA|{QJXczujE#YBDn#L2b!|F_ESZ)43DsE~zVTC74<3Zqw zpba7rm^1q7o->X4GSb8vqVCg-w_+oa46WAe;QQ!Ar^uV`@(U9)eCM?JfX>4Vp3|=9 z;SpD@LRcPqejtEQv9w58z@X{9dsjC(sD32BIl5bEIC&$>ld@u3fq^gqKHKPL_*ri@ zj0Npn!rCgx9)$tb76p!k1VN~uHE>V5SWtjSD`=E*a`hk=nVc8RPtGm}pge9D)9yku z!r*5Q?hgdiMtF%&oUU9yfH^z?I!X>`?Uhr}O(2x=h7ST>G~YatM`H$0SFPKl3|xLv z7rj5R*n9NV2L*eNMY=hW;9ja^Hy2pQiNKoW*?4yZP@=A z-8{tSr)5n!7ZYh=8~UGgy~Q&YtQ7Ew08}_rT7F7=Pzxhay#YZ#q6^LFoO@IHASOjO?X^;=rG3u-*)kl+-*V) zETpA83^P-I>Em6b*~+#@4teP_KPl6+2-g5PQ;@MSQ-3-`2>upM^FNp8TP9agX>fdN z+mo+8FmU1F&K9nQL}16@@5Sv0C?L_2lgH2SK#vZvqOix0+2E>G>#ZZ)OfiG7fmO*k zpAbZ(>55e4A&+ZFIC^w2dHf41n>lo{MFdd{1q%%VdszNd$L1?~b^Nx9}d&v*uC9VPULkX{Z}<=49{SKSEac>0w;L{^0gd+Hg^DN{iA0# zvkCYhL0WEtj41%ex+i-%X?3O2nMaQphMqmJGv%rQq zmDmM~Th_7Nnhl9&59|GhE75)03l|LuOrt3-al;~E8#2KGNO0mJ$g+H)Rpgo`%vz5Z zZvjHd1Wp?aR_$5@0V#8M$=!towRj&Di+smsbyq{+;dJyhAh}>^#`Ht>mL$LW$RSV0 z@$Ma-ifN+v(*x3p5hMRgEz6x zCkWHf1L|V5oKzs*`=2X^u)Dc2Rw7#UkM+60TX2Z^q^6yQHOkINLUN0OyC^%iUm#%s z*Ld_->VCNTE1)&4Y(6)O09z8n-hyxbui ztNtK(lNBlY@i#R+7jCQ^G(vR3(RD{YYKP@qy(pzcJ~D4-8lGC2#^0ZzYSa&VnhilD2ZU(7IFllXxPMur zWrfvrh^ri>@@^sE)U`2NMGL61?BJ%1^j!ah8{ZM-;$WH9&Jb3lZJ_o>`*ilDMiDC1 z)AHx@5;>ERkx{SFH@$2+B<@#?xJAIIcbLC^ooI8g+-YjoW>NG1ai}@ibk==)1wbJ! zfv&P0HBa)ti8^lnhaQoGT-ZqdIjdk?yWwfvCQoFPh5gMB&Y8i6H{?X0$C}nhtgM9N ze0yd@OY^Ee)S#oDRsEQ4C3O2tjai=z)QFd&8|d5vH*@Fz;_WS?s_fdfQ3*vrK}uYt zbc2*MDBTUxjWkGiN_Tg6C`flmcZalegCL!IF1_#PefP8X{(kO13Y8SGzgx>SdsnyEPx5>5%Q1sBXWG!w*>vCsS-HQNW*ke$pNk zYyRa&2C*9V#fI!L3aQr6`;-J_iEW`2DX_cPE;>!_Lbu#-`=4@(X^#esr)H01B-`Y` z-m0v>LDlcPKk@#Pt@YbkaSu5}HSSjQnF{1zS2-5HbVh<1?CvZVRVD9tGPB17Cr`h( zJS={!IlQG4OJp}In{_d2eT5XfucZ9w!BP8}o|Tyj8Kn8w(3?vqV+COucV76a^8)#b zvEyo1+8kl4R|AE!4-0j$7=>UtQ?}x%QDiC#OKBc_NUOI^wzS_qu9R%6fj6gyPIa@L z^s%h~k+rbKTHq->;4MvBxq5Dc>O0V@x(6J1?Q)*UfN9@buVA z{aU*WKmw8v9?Ua?eZf^r(_%ylx-sQJY5BP5Ef>jm?tlJ}PsU=xTilC?9dmv`CZ|qj zX}TH4Wgm%D*y~d+-Hy`@qI_KM8lzT^L>LURZ&LQ2DJ)+)5VDl)Av7dcFLmbmE6x<5 z*0d*#aUKKI(Q>x>Z{o+;JUDy` z5ZL%-pF4tT_2*eeL?T{^$EWLF$~yG&FNNOvE{bE9-aA> zC6xTgn7uk<^_e|5=wRINeswJ2m93X1nh=&&j&L)QhdW0w-%PNCH-$&!K~NXg4RP=iQ5+YvCZ>crD0Ef}}qtKqNuf)BauM)(5>i_2#kc^bFBPdRqGT zt8sXzPPX{>E=63#rdK*6NqcoizwuX9uk*f_J?!{6M0x-EWc%_grgQ^T9Hd4;oP>+m zpSd{w*KViq$~`ZaEYCU_UZRkH)ahS^|H7N7wsTgs0Y{rtlRM&W2Ih9*^oLQ89)`aZ zl4+af?-Qjq%BSd~x;iMD;&-sG*H~ZU#aSUmwsq{Z z+Ex%5CH)vAIhrm+e0es<3C6Xkyf)*`!~^4PvviCA1HTh$~5hEtoORD`KadG&`NO-vP3rU*{KiS-y<&^EXL*$iPK z`mboF`g1~P!Ow5-w8T)vrD1zp9#W^oSnaJTVbZ`-3;MI;jk+5D$)S_q?)N=##A@Oj z9p#Mtq5~OC652T|isEp2Pc!Z_bHpky^w0gr?_wpi4#N+n#B=flco#wsC?sTd@`%-i z!%)>5rd}QHzp{*!i>@%d5toVQx!-y1d+q9z9sYhzs^ED_%$TDGSFp)|bnrR(X-H>R zv-I@8T7VwZDyG4NIgoDpgveXhJDr`=KJs#IXA(CP!?)ilKK zLj`MJq>n`F>rD4_gpq>J-KkHvTa7qkodv;^kBaL;ruxN?*{4LoNgh_xu1^dr4v1Kuyi--M2d@6v1Hq7S z&OIv1{LukIOibjf!b>e6Q$;9Gs!Qpl3-Y3)6aoVa65_JnqfN=B?djMhG^|?6yU%S& z*rNKBKHovdqTSuw@Vz&8Q<1+?T< z$GZRCvb%pNHvi(MWU?IzuX^6kDm-bXnw{ji_c#g*05Dh1sqPqc~Bb#YTTh?uAOG^X4t-LGB2m; z?%OXs@-B757cvekxpBO|Hl%46UHe9b4Gm6z_Q1(9{7}!mnGUCmBV4;nA#LN6+%GhK z)|~AB%E0cFV*VKd41OZhqcedfEFobld#@-DAG-vaG}$i1SVrj z)l~I5{dO@P;DUDaq!oEJUC@u{X~S5eFK13JUIZY>DSlwcu_LzJnwbga>~=LW87Um^ zE#&2tJTsG4F=t1scbinn$d{n%&U*NQFi@Ck6?^-+883Vx`0VK~E;F9#1%-{Lf2+gr zXhX$6VDTg<{;F`y_?g5D>f}|w(ILusG|GsI1o(TaoSULrpU@oKYC zvR-Ha9n822xB9bUj7Ykq{L=H1>uq*WG&?|xX4d~*G;igfv1m3(`;|h7h{mz?b+boK zqu3i(1sKv!ImF_RZArh{bs_dqr?rcJ$d#p9Uh0RVs=KHhFA+G+V`367`p&FBpQ3>q zo&RAIA6;94>4|N@j>qNJG13tdYpqdi_dAN=7DpN6&y();Cz#hPWkK<0_dJ>xcgqn$ zESlmod3tWWXm@u#VL`)#tSZlU`J=~l*oj9 zwl0ix^0+WS2sI{D7UthEi?uX$yCBW0qj${iMdj7v*PjPG-^#xNoOQk(Ob|m^e+& zVI*(1`d>!#2EUo$omwPZA}5W2XV~^=c4b7W3q??q^|_o(D! z&-?^4vd5N7d1!dE1rkK}&u-jJp6~bqWmRynmT(5a5n!p}5M&-9`|p|bqWAi0mXgh`u~w}Yv;TWN*S z1d7opD+l+eqJetcgAJgHg|wim=|^9?1~9QAIH6*-QJ_dIZH|&rk4*7ruRnN%w*AL8 zlZL6Ro)IRPdGv2Zp~-V?rPZ#&7L9HTTu{C%Ue5k2LWHn7v{$ay3TIKvi!O={`dj6f zY4I2t89BMcSxO8H^?hzn!7G_5>dzo2ukJ9-c1V+5-`HHylSg72XQsic1{dv_2F&+#gJCt6~CQs&_rH%o15U|w%4us zqsD~odSUwc0at=nTAj=66TF2FE?)`bTnSq+?04e{+#nBE5xv6=-dozPu%|qU{riyC zpSy7^0(VAQsgE2T*)*Eno>v;tzj0ft)W){kAMgH^dXLP(W>fC8BCa8NeSsqk>@}e+ zR_x${(SFIwy1G{>(+6$o_z1j0!X13kaeh}tjFDrnE|YPLy9692cd zqI1U(S!RQMPP`Y)H*#x(!o+Opo-bs$tUc9leDku-;*%=mfGd-0&fb(PUqwr}ht~$X zeJ@t4gnca}BQh>YQ&?C`P)zh}V-}mDZD{fNOsQ56>M>tPMA$rAS5$U))sxA$aXslC zk4ST|;+8#CgDVS$KRAf(XY&peYSNO(_#hU31`~&K+FK+`3QUbT4K|Ti)&Jy6bn3P%T;S$A-)>WxYt_QR zcze9!JbCMM6T9Rem2C6a_T$|X?N*#X_s#dm5Fx3A`+A(68D>T&LB2_|7xcU`VlAQd z%M4X-Ih9V0{<7mjA|feinMKd{Q}fMU;(h>#Dkw;c=kiv(O}xOjee$yJeL&$KDj_%p zWc@?jPmf(!b~dQwO%oofg%$S~ntA5zL(yEZsHCQ*rXH_R#P?6NEC#%o$|d4AeN4i~ zKv;l2thcy3L`h98ytXa+?A4t5r26G=^ztpa<@>P?iWiu8I*~MUT=m;C8><}DmX@V; z?x#AFMIUf2EiD1|hhb5s)}ZCKI53YK(YZu&-(=V!4P{7K1wJ$0RnF>p?tTp>GdLA? z2;WW-cZTG}>WDwjx4B;DxUJWz*L7kUDIkvs05|Sl?w1rT6IIB$KWkoldwj9Tg`(53 ztS*sM*SHe2Mey>LN-2@JC|m_vL;7(gAFO~&=v!HcTJmsvm~D^-G|-l)$U^qMI>OYdxsx!sa6kxs>Fs7nXFlmU8&Ou-sAJ3<13KtcI74WJ7iH(xZGf4yVCOX7UNiT`WUhvd>`gUao} zK;)T;IxazJUaNO~YE(qf@#p=}Zw!#Rn&-gS)TMa3Zf+b|R z9IUJ7E4QA2?$O!a*)kpq1)8)kcqjqV5DEc?Cm2@6#?nF-zkN&zwCS!gA)gx>7{Es3 zwPg~wiA#&46HJg!%Bxt9n9BZY*~}T-8sirI^K5sf>s!D{PZDxuhPJG*FjX4soy!xC zl-gH*enPcwSO)!+L*CsIMb&2mxEa0)~@`cADiN{ znvFKuHErFM1#)tV98!H!FU8Y{V6h+pOLQ`KDCEdj?b2|MWv-3Po^ zf(486c9FajB1U4JHI@q&k#gu&R;|e;mvNDFId(Wl&8Uk+*UOE+Gb3%*;6l?~JW}gc z{pBP1Zk9t+x@Wn`aRe-n7WE+~~5mLJK;phgv|^JSxGXlPivYz`I)-X0Gyb=lSw z1OstNT^;-4dSA?t%_@s#WnjM|B|}aI-yFCX#@uU~;cNF*2}ic&L!z3Kr6{IlM#W=G z`r*t%t&4o3PY$ps6oz{1J?d}vf>5?+vg1X6-{~7M9qwb&@8;)jeV^?^c*Mo9 zdRS_2eN=TII@F7;{}lNYv#5*V)=t)~*{%NVo&%Vv)k}vm_Ru zWM*74wI`!|mqB+yU`fw@-uLsRkAI{X zT4I1dx&6@b=>eOo(_Ng8cM2_oo+oHBlp8JV&h3iI?R3jJckmU_cpw{vMpviRg>KKo znSh5}d7%XQY?j<>JuMAC(>Sz!XRYhoSdPx)ws zJUyEy@hwPTM=uti|2TW^>DIhk^W_qqN@j=4~N(yXwa(e;bF{JFSnnHE( zA#7|&Xgc6CX0Zm;6Qr%!!+lsxX$% zs;OifR2<3e@xl_EEwxsW%rDt+Tc&BsWBVEq3-&wq2A=WolD2lZb5$Dr;w*qh(*@PmhDyFdk3j7qZFyN!_7h(8z+STl8pq(Yp$qz zIFAWX3#s4BOGxK(Ai{9$v@nDyU5ZzRQp0ymC3+!3n<_P9C>DLD{LS{lVSB8ga{Cv^ zW%yBU$Uu<%sg~WX$BBU?ZCYGUXl%%N`5_#a&Bph1M?uK2j}mb)^~eLGpnb{x;oxZz zgtS{&P8ofD`(s#tub$$B|7xi;b(P53c$cCOlUm1&h$t}@`VZ|*+IGzg6anLd(NLDh<9%NwW}i=hOxZ3Z*tkd9I{kVYz}<_ ze~pVmn$2LT)e7h8fag_Pi|xP6IvN=*>8fSq&LboEK46(6^VDd*>e=AkAsZS@9)_>U zkg>Glshrwgv(WA~uuI|ZWg25{7*@q+Aeaq|>1E;SZBhV7v%mK9E!I_{XhxLysix>(%C>MPD2(pGC{P*!t6R$0qIy zDkwhs{Wladb}{#CC0x)*JKn#zDPP|>+`c<^Ij+7Mad`PV--e8tu$=i^=WdL~(0~OB zzCYNu#k45kIIeBQBSZ2gH^O>KgO7QqTeEbvx5tV;f8u1tCCN9}g(#i+!)_X!ra3O5 z(KVk=-EABXamNCa@?KDZApv6~qQ(1%-E#f~7a}YA7v~wYTBb(R+gX zhb?ZtnOK;>PsfIi6G__jfAjd_0?E7XHfhVBqu`)G%eyO^L_w^&zn3eP(VqF8**d|> z!8b(BbMRvQPt{)Z%v^D03`J5;Zf1FN5MDyMLD>Wf?KwjKYyM+P{y*pPnh)gTia+ON&KkG`2iaO}3| zD4j4Fl}G{Gh%71R(1#2y2|YJfX6?`{PsySm=}oZ~iIfN0c|3&zd~@caLwOAHNTnII zxXF@g-a&A#FvN+-_0pU{&1ehJ?Gq_OY}?dKr-_VcO)SIuG9rac$6TbgJoXn~ss-@jui z<9kVqaKJZ(9o=?A&^+*hb;?tkFF=+w>5zE}yE$~+{R{HegX`16V_iv1>%88Q7Q2Jl z_qofvGAPrY(zN%t_8juj56!ban`|eCL{AR8W4JsIed=Jl7mB`%KirI~@uc(@QmN49 zV72mt9iY^xzRcC#TF?A;+34rNickHBo$yFL5%Cnu;dkZLOkxnz8U$JWmJU|HPj3dt z_^7c2ODmrQk+<(JF(d@l4vS}8v-NXcZ<8d(mP%07kj5eQsj@R#d<*1v@U+Djwx^fs zTD0E9IlOc#5zU$!0N1b}k|C~N?zsM%%oOH-)#K3uM|1v=!XR_u6#Yg^a-b^{^=(j$ z4;2pAR+2Pva{_S;f#q-=i#z;wf@!O{6nd1p`*O$q2kP^HeD9+LR{NC5{Z_4g`t#Xy4v@wnqRY6m-Z5Zpj zJ5wLhr8Vi}0~>{|-ZFZ@E}oIs@mX|o`*316Hqig~M7 zysCJDq$S&1m@l=Eok8H{E>44XbvD1N(#{KV90?aS|5t39X=}YeTp>`RttCv=Y~L~8 z{JyCAI$B*;!zFPvdu{bMl(iuiA){!01vs47zT-|K#wFMHDi_LDm{@zAT5|53M*`Xh zovS>9`El9!rtf z60+-9?i02M+EH7yKGB6%E{$cn4Aj<{lNzQS8V09|rZwy<2{IE(=Y#;e3?rMo z6f+YNDw4VXt~Hx%O?L*!6J;K=?<7g;?*nM>q4P z3>z{jO93wNgT_>Y*z`KkmdBR_=b_`=z_1m->wc|bC=OPT(i>aOD#5|qVR7F+DKVh`gTg0v=(IWFV%9w5nY>Um z`QvscQ*n#mCK^ckt+oWb#716ZkRh*}ns^mKAP-Dcuz3VWj zDu;+yktE+Kzz_BnvQl(_K?`{MpFx}Thmr?8obhtM1$SI9B0LXqhKBlBAH0N3M_H*% zX2#_rwKJ2^T%BEm%109ov~qHi5yc4t{};Vb_+MH(s?Ubr(LQo4?X(-^>+$A5=Qa6u zA?|c8PsG*kXc5uwi^S~~-zq4v(LL|4V~(O8B6@{biX-GMP%yMdhN+wRM-&muFoFv| zhJ9N(`YPU_tPybdJ`A9SZZ}g4NJkP=Y;RXfy^S&PVSrxocr0um?~6)BsdxZoUup!n zgOi;1q43h9MSo8VfRF;mxA@iB|CZq_|STEtr><^_GCKs&%BxS2fwkXquGfA z_n+3*T!P9l`}%ho50UTAZ9Vd(z2%M+OjOw3TB+;c0HqjR_1R9qCY+3TcYaxpqOf|c zmG}IUi}vf*+SRu74)C>tJm6db20Qhpwg1#C=!*OID*XPud!V7>cYZ*edUYy6mA=9N z|AkPv7I(ptS+OSNamO!2TL5lQ4yY=Xj5-0{nVwDsk!nr%Zp(ahdon?+!Jgq36Ix?D zwNBV)D*$Bp01<-cWo=>vUDA7#R!p9}BlQ4OypGK?t}!cFnJV)sK|y7zx$A8VkkPk7 zTVwtsNKQW>%ku7%+=KWo>n-O61IVyg-NEiATG=*XF@yMFh0N&vz=snwh`ny~T%ZKm zTdM(=8FDHr28ru!y6!I~@*y8RI7B9M_~jO*HRp9UqR*Vz9YQZ1+s71E%~1K?KA9;q z3Kl)=9s7(XPxF+FjO<6X1>bO*7&S8?PGgZXMoAWlm4K}1Bg$*BRkw{3R?@V_z#4q@ zAP*=`Ws%|#!Uy!Ro)l-Se|1m4d2;%(Bg~j!s-dd9`Ct_fZt%)pF-thp)|1u$kqT=; z-O;A$O;nJ@dJDqj+R&FprOU$MX^j7B0VHp-LPK4g>eixqjI3G-DDLp@C zz>+mCj^K1xg^=0k*AF7w;^M#DZ%3T=cMyOTKV)j)?a#|G1t_?t0?HLZR*S$*#xZv5 z{i?_%Ubu!e`4hui&MgK>7c%8%yi~`;Z%Y@$ZwT@IRJBLo@>Zf*hBNLErhSiTN=>doD7F~4fBJB{9c2xDGV|SZ8FLa4I?qOQ| zjTr|DuN>vE0F{ym5SahN(EYP950yCzF}a*vLb%^pvN%{S1|W;|`Lis7LM~fZ5l-^P z*#AW-ILP0a?tdCgKSl8Nz!u zCe1FL&k6N1KZ~4VM9GRn$RRvc53iKzG#RqPs*G3;cJ1N);Bkm+@;}Z{Qp0Mx+P@o8 z`%Ww_u>meS;P*Yd5i{B6xpolVvOM@T`|$DSy>-qC;m-g=&-<_mijgd(#!YtXQx?F3 z7$%|$Nz)`dJ`gp_(y+j5yWLt9|MvTx@J(l!n8gf@jP&j|6|)d#g5l&XS07VxD%y+z zum?bmB7T|sg*eEuO?=j2?uwbqUxv@xR&j zBoZ0_sDn|aSEUe)l2_V!ofE0{osCs8YIyWp@)Kv|B8YE*{?Yf7*6Bc_2t3Jm207QF z&32Eyzu#X1bR+ThI)>OUPTsl5ZhHZz*=mnmFu~yTLOXsHT#E4oGUX^9HKQLOv%vBs z*x@BM7A}ewG2;PWU4c`&yo=_dhMx{Y;&1FHD0^Yq?ZkuW_3uJm2jNIo4iCx4?Wp{m zj*m(@ze`{9e2X1dA8VR-G>2F*JfmJ^)M?5f@8h&l%tzv4p8^jVPV2uqZc+-8Rx#Q>B8X3GgLr$aPK6U_5^Co*D&=l)N@%$rV zGOo;F0$OWuPU@|JbFvz+j!KOzFL7TX$8uNwd&=ek0y5p>B_{sCd~KPo{6-$oNZq- zMhuf8z~(%aqopDm3t`J$ys!R5W{gTLM$kt9N^$Xxyt`z(N9b|w?fipxmPF%aM)CdI zw`8k|^Cuq~M+ubXO0MrtuS6T;EfYx((A+<@FJ^1HXSpXg)*kgthc$MJRMp1pYBVGU zJM-Pr^D@7*yuLZBvP0XT<;w`(ltOs5hzVJ2k;x_8BgwHFm4gB90#Bka)82SF)43qS zDtWWExFoMdK*Lt2ve}hlr!2B(bh(bY!ON>O7c(! z1`5Z^6(-+MvdgAANVpQ6`E`zWOb7@P#bKiNHk@^IuJGD%mbTYT(WT^f1OjRs{lGBS zD82~y1;{zaIO?$a{gUK(|8d8R>E-q7FVd9TKZ(TYN{xB3hSd8sicpR~xrYP}xZz-M z)RBYKOlWaJ{KvD(t=~hE$r4>ul@5@TK{?j50i5vAl+(1 zo+|pRRL$)9_RLYq5+;q)w3c>GyGP+)UAsKw>1&~WW2oC!DxG_l)>V3fH6#!i zwxpol#iWfGg!YfG<0-~BWLR;-s)`tQ5d8JVVvZ%ZAR*uMBps*+XrcK(6!osGydU{d}N0>}sq5DKqlTu*(nu1075Bnu|$%IRIpk;BV2{+FJ8l z2ceJ!hkvobqYvj)0Cp*LXXp>xbViKAKrb?=*irE^UC!eu(aRm`xXrP@I~#ig?^OS@ zg^*!I+`;6!t5M)H8f4!e!Bf2GRI*XnDcf4g@wTdDKmXI3|0XY{KYmdCrCUd9LF!_0 zj#>--tK}|2!cu7(g@c@VfzhTK1j`I-Ik$Tq5kBsPK2&S7GX1V{+|^1fnd$HT3iWI} zX2q@B$%mJwl6225cbBF1;-0jjDkcM6d0v#sJveEG7>Hzm<(1@Lb@%&U|E;kYz6e#m z^Lq_>e(Lajr^L_cHbL=o=-X!w9dJsKV}0&$V_7W}-NP-4E1A?ZITm{^I{m%LY+|e5 zUh-bbWV~CrvS6w>k$B-LLy6;8r@QRu)>OBRgaco%JN-kpsb!tofpjy;4^wjhUwd%~ zyouO#B-)&4Z_`W;sEZyQH40HN#!J3WaW3rtA=d_q_&YKpNOQV6Z1l*(U7G(CA_p;3 zal)8ol$KMA)$7~l)Tp=*J~GpqJ)6w+nOpf5qCN4<_1h}T7!1oVeJ?&}b@Y&!!AiHK z=Wz024NK3h^I+PF$p6|H%< zqo*0)e4a8+su) z+ixUrG~pXR*P@7w@m9mL(eXX_BEwYYnc*qWouikQ&y7}k(y&B6m$dMoKahejxiaf3 zNJS{;Qu6Omd?0N68&|Z}9K)@D1N^e4d}dU+Hd|NRzSj-e&K8afjLeV+d`yGLvE`nC zwe>hyBEK>e%DYtG$j+k)`yCbM+b7q8&TDb=u#DWis*^dPt+F0j%-CXNt=zST1G-f~F=E(pYGaZx;$GOb50x^r8zcdFwgs!8F?|0*N$J_@A_ zq_jOA78}l9)1GGkzWvO zss8PsR`l)cQWs@EI4_-L$TtuA&|@z3-Pq#^n!Q`(mg*w40uvq@OfTJr`tZgAN-8nZ zHJw!5?#BXOpgE_ukS!V{(@#0OihhgSZWg-=M7(IbSpZ{8GS3X zps?Z{^4zQP42g-9dc`oPr=-s0iV9>yl@UawAySh36XH~Cj$i*0LzV<8PW;EowC^Tm zp|b_3USJJX**omKoz_4~<}sq!9F70xt} zgT)`nU@C^5rs|ncRP=c{~SQwNw!H}J)f}o9RbjwJD zx3*P)bVZ6rMl?0BeQxW#jlNZ&R>>0% zD9v_9CpIhpD2NDHF+g&{pTcRJu_Bb3tP6OkuAwPb_ME{YNepfyh0elpMY^;(rwfCw z0$u3?v4h0iXY+=%c-Zvg%8qFx7zprF$BtM`4WuuUDtTcEUbV@Z4F{N zJn3q$4Wj1?cv8Ck-ls8$1pwsS-Gb_gP$su^+(S~`oj554v z#&r#G&x_3mVEQ#&sHiU$I`?j)#N|=jYu}qj;`1#<->XKw>qNCnrvv+isp2OC#)euo zNV^rG;$DU2Q2xS0V0pu=e@KAWEt}k~<_K=2m##Luvlo)2M!d zzN_q|n-2cYPRg?np8a(AI)WpOjqE`q5&4);bD zQrE3IB%+b|WjHd%jp$l!{+fU|ShK^_<>ZDmT_H=qIPXfSqTt8XMelquMly4XNzpdPk!b{oO!QB&vvGi6g1(q zvx^@*4VbN|#j zX^#gARRw`5(HICH3iIP7`gMTkQfFN_(d(alnsu=^FeT_fr*i7v8w5<4X1ySra|#rr zN<;E07Oz2Cr@#H@D0G5OSD0?lyF?j%%=0$KCVWvQ{Z3%Zo)aYctgdMz3!ZkuyI70iU6gg zf~Jz@t%Gy|Swa{nAA$#5ey(Cpf|Bp3z?kLb?iYY8zQ6gYih_Tz=|3TNr83VMFkfP3 zWqMf=e#0~Du}lI!{Fw}+5%^qCgvA9bV1$8;6}=>BvtN~5;M@>srcuES5n!PbBs*Iz#O1;GKYcb))#l^_9q|b}$ zsJI4I{$*@6R)s3UToDMI|2Gpj z?b|mX5+rNGKgr7!yicfZ3>Lh8adA~13X05`Hfd35;1|saS|xgTr#)GU;p5w3goe2q z0n$G^07=8ab|Sd`doIpS)*#lvZmrm}i#gjGf0U0jhciuj?2#x`ZukDgdH*LQms}ew zN)C``?Agg|UX_)|CpN!7>1HeaJVz0%; z{lT*eQ&SYpn<_M0q^BocV|N9k*%q;ZfGfWu%GbmkPHzfC4x$R){2mwkCz1%W#RBZ? z6+)|OlJ97sleR+sq`QxaI)bdW6Mj`9wzcTuP6)>y@JwhmSOmzVD}WK7gWXChPAt zxEoIw6TyDIvtH2%P866Q9`d7g+*#~i$8$m1esujXSFeB_85K`9$5F=x!+4PLdSexf zXiZ}sx_ntULCjlyNat5Zn6F^<0`E^BF2z700CCYVWNH4Mc=7~L4nV1tKnPAu6wc@F z=gv;};Hf#@tS1sC&q7U$9bW;6B5^@6j?hd&C1T-L*@xuy5@TUw8%1SHpgS2X7cr&P z?v3MF9$FHsHP}vkXVRV+*e=o!+MX`MA1}>?lYYVEvMGq3Tx&^d5E~p(hP@q07Tkmb zl1>%Vx$M!NENYD9c!EnZ<7FnoObF?SW4enPCkgUq$BBeEHG@RESm|9L zJRaMjS+c|84pWeVgz1DhX` zu%$2JkH;{1qHJ*SDw5Cvtxq+`z^T^EtKbN$ti=Ci;^ZSl0c<}A`~)?4?^ zds!UjJb1z-M|53#vuv>e(ejH}5dBx3aPKLE@LG{wNQK!vuC=b;`kCL;0PrS3gN_#JDQW{hc)5Yh) zn0Kngxxc+1ge=M(V=gaj=Kmy1Xug}Dz{;L3lo8~O{J&yJs(nn`_QhzmtfQ~3)B7(ZRu^=!6Y#76C%*n(u*v`++mTMQkSrr4Zcg5>?FrY_n_ z*Ul?PsS}|B-9K_DY86!iSd4El;5fm3S8JU>oAXxd(P27bAvEGN_@w~Ym@l1ka_c(3 zp(-xZYBuw0=eXzA1Y(YRCAGj}6k|SDvWYMLy7k&5h-LZNK;dRWBn3$4 zf(8iinCX6v0^wI1Zc-mo zol(7>^u{~*-%#+A#sT;$uxb<=&3Z_TV2h#I6%AzNmtHEubm56yIKL4}a{>GW(AEm8B=28Dwt3XSpfcrz8j};+E)$)_g z8Osefz*L}NH+DkK#($zr7R!R)my@a*K@uzN*=-pl+v0)bCTHJ8d~5JO)g~xbrl>e% zAYMgQYWNu`5iv7qAgJP^^jBbF8y#X~s4zmj&X$qB()(btKF)!*)UO>$uDY-_AQ9yc zt2z8%tfnG9#CqGFFKjrl)ypx3T}-S3rPtLOKF8kVk@ro_UvDwlohZTbfYC zidBjJQu%CfmNT^;n_Nc%l+hE=oP;F80powY@<197f;=1gVklD5RE3ro=6HFqjhHn# zlxAq(gGz4l{kwz&?|V8k-4(OXQ;e_0$3EHkwBy4SLn>b)w5L|rnR0(5*MY!_=P5ZH z(dJYH*|loK;QH;#%EIlG=~aBA@}wy4WMg$xHH`Jt%`H-3e`qOGDAgID5C{W)5Ws-7 zwZb>q%@R{zPprcfx3`1g+W2?4=%9y7JN5CaB(H|2h04N+3Lw}hGEu8N08+G_L=1!QPGaUPQ?R9`(9F=6+gGFJhjRN>t`)yW}x z=XpL1$6dU7b3@_h3;&etbcz3HoJ;&D(=XI7X2srjr&Ax#NO-Cd|(md&ez~Q2t%1L4*c6peukwsI&>IoEYij|!ED3G>gU;^3; zl{uEunu5YL5%bJY(?b#zON^ssFu%pXvdgf<%rp1LbcwJT1t*&ozl%FLiyi$8`x*zzr+ zhGeEaEamoYt2DUn>Hg1?gV(|R)-sO8O5_a9ss-#*bO|F=m>8nsX_h|2(effN9L1FO zcJXRj%Kv_I!^vRS;Sw)R9Ts+W_ENzhbg^Q+y~q1v%9IeiQm;oo9gVMtUcJ_*8?v)c zHZBa^Vi_B1u*g+*shm6G|;1B{U95--WZ=#o?o zqpz?`(_fS%Pxe${AR{h^_%pRqdu~J1S5?$B;1y8)eFf?rlxo}LZ;D&Pr$dC8vc@H3 z>RRxbrZrk4CghO~xeM}^rnS{Ao+qgdOceXJ6)NYEW>9AGJ%$%Po1vh$h>|SSXmGWk zVuzSD?4mG|`yur@NoRT4I0s{nB1NeEHsP2X!TC%Po+Qm!KDNG*Hk>>_T1NRAiCx9J zH<0q=(?#xz{`Kr6dTnNAW*w1$KdEZrbc%BHW3eX%a_`6$r6-i6tqMa~3y%0ryrN*4 z(hb?!Kf{J6&q(21UUq&g!j*ZONcg4jA z!O|DDO?=x@%(8*({!&IxsYbaV@|H{K+i`i^=i7gFtyo4EU7kOaj@B5R;}yEKUPwNZ zTLT;JGZwN{I^NDPKq-)a$-GS#1e@(;OX+o%Eu}V{^U(r#Zcqn2MQkS-`V`h1rHHTK zDLqL#Jqr#Gik4lR-2YT0fhp<@`z!b*y>es&LQ9g5 zyjII3^{eVLScjAvK_m>YZVQy(ksnDfy6ZIsL5E57f0kQ-O9UaW)Btu_!84DY>SUrT zK^VC{YU0*}WOu`AMV_oymMw30;&AuQ@rBxw*NY#*n+_78X*9C(vJUZRCMi zhAOfCsti~r=h}=Kd7E9D*J~VStO+;|3V-KvY+g*uZID*eQwlScd6!ieO(!w-hi+@>1k?mI_7`N zTu~fAR!JG@g2e5LBfZnyY~hg_V(Q&yynAL?VP*p#3JY(w+#+>&cxdj}6OL~(TVW{H zZd|HSZ~S|6D3(M7#e2-)!fCEami)-1a#^!_iYZ;Q+9)kYv&LUUJ;A7$*o%dUTAVv~ zn6as|pC$MIqUkH+qWZqCXGXf40i+uQh7@Uup*tl95otjs1`rseq>+|}p(Parkxr!> zL@7~8bwFCd=kWbK|5v=>&gb59?%jLswb$7TqENEpk7um)0RiSeU$-n#kL4+A9)cb7 z2xpMpBSuaXD2~_vTR7%@#DQUN_;4b}4V337xsZjt-GO3JOI zXYvPQ;w9=`) zDZ=8)p#c{}5hJN7NL$rTf6i8!GJS^>L3%^}98ZDi-g^9o1^2Q;PH~)l+$z4q>4JIQ zU*A9X{raBzHDU=&P>mh{us~Ap@@T=~>-P4Cl*JMaQq^a_z-(}Ggxvj6c+kbsLY3BY zuD#p%Dc?V&#oYdlO;);l8d>WQazuaj=g&+6lVqj)T(zgXY6^5Tky-k#4dh*6*ySw| z`*tgo6nO~Ey@P^iIeBs^^TEf=TlZLR8vhqkO@uz|IOlHnbZGh>Y~2}7|G3aFQB{x_8?6kDv`wwR0Go3P%vNIUAitF)#us9(WOtDVC_4qyk z@^4Z?!o8bvsvfUhCJexUZ5LTZG>#)!c3s44vIq)g{?z2=^xm5oxh@`ZG-tW}eJuBS z$){!y%d3g{eXi>2co*lp_0i2(Fpj*UJ@EImSl3_Ga>q6>(%G?IU_Q0Zz9UDm5Ld(| z>x04XVK&G70=<7G6Ltl3ch`O>cw{_enzCo!Pn{R-@^)FVJ+T5D8+W2(xak|D@41Ui zSa_{8xDzUd9Hfgnv>J$ui~If>SF@oP`SuJ1J0|=`-;X!-_2UWXN*~ed8mnw`RaK{T zyH*c-g*bml9ri|%(os>VEIwpl)4g$da&%NCAMg{`W`LIbbGY5drh_(uVh7^ro$7g2 zy}>CQLEX$7WVPiia8A7wF#CG%;<~*5jgI|67P1b-;NyF6jb)4$q*|x4BJlTjv7X9D zZP)BAYpix5H8zxX~YHa zuQFCR`jJ~4{eKzj!&Io?PZ~iLIx2jcU-dWTsQ7 zq^QP&qF!%&{C#x2;d4juiOJE<+{aJP*j3n82osXn6m!IemK;=28-s}=(c3U2_52_3 zR!U-E9MH1UcdAh&WaX8lnk^hPZ|;xf>>WkA(5=4%1LJiY!k<4ij@-PPwG1}!w|9-# zfHe3CY$~trG^4|l+Ze|tQhVEQq^+k^q~8l%$=w#4$m3qMJB@cW)IQ?SLK9oS27#Ex#_T?HUI-4(O$`|zKN6SZxnmf|Rol;0U^Ceu$d)-JKFr6nU`F1df^qMwr zJgMQ$6DiZqRT6;<&MnW3KbWZuK9-0|8!<75zE~)${%rCBfP`%0?rN;v*YdJ1@k4M@ z#D3vUtB<3-WHpUKF;U>axpCwHjQQg4-&1L{;&b-(4nb|AWpZL-#}qT-0zKerbl3S> zfusDM(a;cwa@{~(mz9f6{f zc{Q=vL~Ht#{ThI)TqyCIRLkevyzC0*gLn(UleBiiEP5(;M>s{K%mJ*C;4{&MGI>;$ zHO;0mU%h|i8D$i@B#X>!;F7~UaKST}4m8}Di8NM-gI0)%qpA#(&^&8my`xQze@~$z zde|hUyD|X^@~n?PfMWR_gg-pH^eXpmG|+h)sSM_j5m=h2489gVD*xR)Fkhf&lePII zE^eR%BY+aaha)2*A~t*?HBGb`8u-gnc00sqg%);AJKksw=GX@#_jHl~gh<2Y*g6U0 zH}zs`e}5bf71RVD#B>sj4EslXMva{hzYSVzNZ6oCk$T3m*neSHp&Tql07FQ`PDkJ5h!Rb!e7Jw}^m% zz=QWGoZ2!vyZXW(p7KP@2!KVd*cJ*p_)2`VJrfi9?;-%C7TRwhK>!C5?YoME_b4ym#hay7;NB1piX3zVn*zTAj!YP)KiYBrBH# z0}GQ3A@eODTLy`f-+ihCKaovwDbxI8*^O}Hckg!|MGbe%d~2KKW#RcPm$hf%mM*Yn zMq=gH6#uy?ui87!dG9L3fPD9M-Fk+24!C+$I`&0>5V8?{RS1K$Jvlp=0$8CE{Ed!- zJOMoSY`H#*b(^nXFprpBoBEZl$;H8lm@fcj(fX0YUoKi!g5ni3-}(QzTVI`=OnHSW z%Jp-RSJ^fzon1SWW!qh8g-B4wa0En6GU)|Fl zpK0-S=-YJ}&nq6wz4^L@`Wqnu!E~e35Zr{i*|^QuZD+BOJD3M7)rX_CP$}nOI8l>lH#0W+5% z;I?purw)Pfj4>K5TWiyjbOm+*j11?-q6b@Oyo$%ud_RMg0ytJ zdr$CV6&)4aullFX>%rl6(J}uHDOLU)woMWOhrwAT@00z5=*&fuP+fUUxP!n8 zvzm*UyE}0F_ehHvngOWB~X}C~newAwiait4V^3KfO)4 z0r|%*#_`gu%H;Z`4Hij$+zM+GwQqla#&3|P^?P%o0&Jeix8V%8*-B%x3Io6Us9HdVTyEL&+}j6(#|# z$2>;68)p?3va9WX8HnEoiG%FpYS=%;-9(8itg&L(p5*^+^o1!wsQ{`qAdapCQvfnB z_EA$|L9nqWEqt#iMzJ?!J(DbwA5kWOQ`uped%wg7?g`w7Wnt7!D~^ z3`TZ#b`tAo6c!uSJ9HUfEYKp*yI1}}9l-vD42v=M?sREvRa;PK~bsZ6~1<=thuuyI5Jl9bn0vbwmF$QFJTjpJmfs=nB+oj?@<)EY#V# z^+pm$pReQpn8IqpdWJJaMsU#$4jBz~^c=AgI_UzAm<>iTdxY)k+s83G3-uF@O%05b zM9Bh0Gjzx)QM3*;2V%JxTZ-}p<=pk41l+yIi(UqNERkI_BLlJHFzyiM?kL&bsAbpY z>qt&r9{l^e{yFdhS|p8^>6RBRFun*;y6*VAyOP^1OD+TUU**KF$P02{2?jVz{3bwh z*(@1%+g4VfHIA15LG&?9?NOJPmrY^+LfxlJiT`y1ZTD|NNPjuL z=0u-2I8t#?Ex>x$UPQ*w+ILyn2Sz=Oh#*JA`B?8I#p9v-t(|7WOEEK6iVCycZ6=;F zrF(k|_3SY#y=f%54aHPDPlp)oHM@mSl$^~Fr<#WYub__$j6EeH6XPjZ<@$3On1Yee z*F?95zH8%(N=8j94E6~OCkc=HmD0STr*f%z^^#AV+skH9qnm zt*%vAoL?1Dygu1z!#o{0Nb{(C*VdR3giwMSre;4_<+VvrLydFx;C8q^FPiiY8p+BK zy0qjh#rdq)+_`h6-w^UG68wjhkP(l!%)!B7QBK)`$%^N;o7pBabG@&p3;>`OVO7g- z0G51HTVRso2SSHt?b%mX<=w-q&sVT7ANJt(?b{C*aokmh`ND0BbcnW9_cf37a3?O?8O36}c2e4X!xEylvPYRqCZWa;=iK( zT5&^Wh<9S<0@*JZ$h^LwJZ@Nur3EbeC&Dwy0Jh~oJz2w8Qz~Tc?Kso(`?#I_V$Y zk*lY3`2vE@W!X0hp85=C{oRkN=s$FQY}Q?lAff7@X3%Vel^pL$3fjfyZhJdP zeXKrzv#)2ACHJ`Nv+wlXZR};DZy-U^+H|jYO(U&?50lX9`48!yjk)PS(ORU=`$gAG z-)&VdgA&L*;F&nsq_zJ4BEEi8xdLPq05~_0fr;a;f)hE5OhUE!%ll|n7n3l6PJB;s z>v(~{)nz2`_qUOXIrS_1-YozFW50WUe8ro{Dt}z2@QmW`*=8Yahd=ngbWoe=AL9`c z(vEKvm|>TLv@s!N%Dx!3@2S!uuJLcyJ@;oS3?CZ2O2xRn5XniyT|l z_efeU_b{CPIHV(Jezn-uD&^UlQdI$pL9ZV?%+1VA?ZrcymK1o{u`n@d16cTVclYI= z=pF+~O3L2TX3bXtXKxyqWP*Z%mP!QPr9=NbSZUXeBB7VCQEGn#_h6E|-=uqyBrwa2 zp1oTr{Vn9+13%!h z65#A-m6un9o18RyL+x<=Sm&i>J)fRX7%-{ZnXk?5sBXOT)_Eke3}8zm0Nco&OUS{{ z{Bi(xD_Yqef2(LUlEjaUj5K=V`SFw!(yptWh;NQ}AmcV2S?ADI!1WqYhakQ(#2a{& zDmky2$gBZ)2~LR1<=?X^hpy1bg%qDb2?LtNH(o6NR%`A^9&csbxHDZt4m=)9fDKtr z$ghKMBWA5W>vV3Yk@(thO_3va5lXhYXmXZE&v6e_R{>I*VGsLz`}O^?FAJ+7Cw3+c z(W_d3hWQ%oU}i=a0*JLHj|I`ti+8^|C4(tsiiQuNRCVE+l-sBK8;8KV?)NJAhCiQZ zVe)h`ggR#LIl-kjZw=rBr@y(slLIdtXLFQhCH$MdQp4v;Qg^>=izkGh{ZYy}U4S0E zcfX9q?&|Q1T%p47(Z*!gp2>2vmb_zxK=2zt%dsJ^KrbLUwK=3!`)&jh?@PS}q{?iC zVIiI01hCoD@mQ#HX1P%Y@Tw6gkjQ8|>C9c%zd)}M7y-*jwCWDohdC4-0@7;WextJU z*5mJFhSR1bSWLzhV?u(RPdWnpW1|ZRXOY$GR&aR8eWslJ$7)w0z~|$faYwrgE~qxY zU51z_rLfC9koTSaw|bnCkCL^}C=-Ca&vAW}XJL@6vZItF_>lFw@k=l3kv_B$<#Rs0 z>?_pxT?kRy*y|1SV6XT{_+3RUj;0)weRYf(zSfWP79Z8$%Mp^IHHsGkzE zg5DqxeTK@xt$hK7-}kI_I}y`zy%K%t=qa@riaVpE-2<(vFtaQ%hk}2WYoFeD*#L({ zjut{0uF=*jdXtn(0Ecn^kjfhw69x#kjo=edXc_{)C|kb6)`uGe%>bAV@eDJ8N{kio zgt+c&MgMT?YJfVT%_0n0Umi{6C3RqDVHsKL3i;zd&Q3+u?N~2j-Bbj_C&A^|(wBRD zkgRT|oDw@-QBh?n!lzN_b>*f}s6oHS51ypN*{Y=h@6Sn(`i{YcwPLCjQ%Vl|kR$U4 z%1XItEt$vP_2%hP{tgS*0m1fKR11uTJ{fqkRslwwvy=&)9uN3zZAkrlJ|y zLLy?ccOH}27#)N9zKH|!+lch5~QT~4aGitK%Y$?Y_%b@byS$=oZur%b! z6Esb-wBhNaLiqqu!`6Vk#oHhni8$IZbgqS+ePbl(0Pd7A^?g}?KX)rw;Atjq0C?q#N$oH~qCbNyLP++7khx#waZmxbkLS-vB_Cn+loC7=p zTwG82?*RMEZ({#$M-c3*(;pWpX7i+jmOuwHXhm!g3wjQE;4)FKY4z-tPS>vWmNKS^ zG_j;f>)pjMtL`9}dcH20^wI{R^NY;^kUVpQw2x-)4ay-PMD1>sglVdJaFIad`Yovi z0^K8b!PVA_2G$=D$CL0hDfCGZE#}~5edk>}N6Dt4QYu=R1WBGlZiU=zI;Ux(;3-jQ zhRGN}i&QMX3ot$TxlBw+ny|3%_$4lum#<%d5r=7vQ^;H*%I;RDrhOEt-^)-lWQrhx zt1EZYR_&;|^4A$VvC{4&E1f?Zk{A>nq$ygI?ct6K?Z0QLe=KgS>EJjX@$9LfX*t4* z%kh9BWRgJlqI`I${|#6O1-_%~|41pvzc7iEN8d+3I1xC#MD;us3zXP@(RZq5f+F_$ zeR2|}ZPE>IU;0jC{|l5gPg_i2*w*?Nd>9Ef*Q?WqHo6%?11Dzm?g@=?!Loy#KjR18 zeywzn#h!ZR@Fh66Cy7_jcYImL3T*(>)3spv_Kxo~gUW;AGzUT|QseOxGV?gDueSu@ zb4xL&O1&o}G#rLUWhDC=g&UU?Tc(BLrhoRChC;ffe3>_B+P*kmTbq_D?r^=i#!4wY z${QKDAwML$UaSK4k?9cHTz(PRE|kosyin&(+vj?nEyGpo`vdE_^M3}LYKmVKjLFZn z8H`m7NjS`Ia(LWeo&A7BUcIX%-BRR+<~V|GNJ6j2A^_$D;y}p*Ln5~OXi@Y_(Zu8^ z;$PPe)^0=Kj;~_0VZGG*cya;)&l+wo4<@pl#V@BaG8i^MgVB#DaXrlqJb{Y8CtZZr zK%}PbD_ju%g>g+H_m*N$e8`JPj;wSroZXB&*}zh_PiAl6-}gP_DME!VjdKwOj}*;B zHG!~t{}ZZe<>AI4@14$ve~Kk9HJ=jTt{014aTx`CO;CGIX?xHE>$NBP7BbXNCZ~2& z&q_QL(PQBR-5_D3?`DIr7n(ZNOQYz%^*zv&btF|#!l>waMe=RkOz``vNyN){j4{?z zf{vAADCOA;?w+Kw9AyATuH?(y&)RU|J|QU}p%V zIKw(||25&}ZSuj_JC<~rG;rw!33}^<6Nn%DmlpibFoD9~?uZ)+Hz8x-%{;r!!a-he z^QZxjQXChEhk6;K+FI!Nm&v;~asuz?GW<1g92V~uIMlFtSZmE4A1tO2dO8YS!F5xu z=(HzIh|v6um{bykYuML@JPW2^0f2CANJ}^jT3t?LoSAkiZilPxHA;Vp2pA(<6|Ezjwf<_YDr6blPB_B&rC!` zA4XlT5^)O#L2*S!^7l`&IlR}7y3ZW5-Afv+&ETJ?-fOKk8x_lhp+FGf!iVT+--DK5 z-fu_M@K|C6EUwZKIFB&%6=pZ|e!_k=>Ad+1;hIchd<8P|=v`^?ACIgJ-?_r~+ZfK0cVSDpPK zI0=gVhiFv&Lw)%yhIETmMfMz;Q!-J^d#KuVO-B6f09=O*so&?j9tg4e!U-Lu;GkI# z7Xn*zDs)cC8H95!QXX}S@5Br-+tVkw{T&Q4h(xMB{!2a?*|H+Vl<#l2(lagV1 zfuL;^;dOYL7UbqmyD zs$~oW6&bJQf%V)`2^6lv9Cd6=Nz2n*%>QNPnuGpu6-Y4<{lixHa9F(RxNn4vQb2()JE1!A_}a>PAku-`m(rRWZvu{l`ej=QPgDvf^v;A6 z^AAI$AcKv?nK~F_bo(Tw7Md!&ZT*FGg~%YARL?!eG$R#hHd$0EG2EQm3WMA@F7n)H zq{v6~nA3Wooe+&Tqm6Hf^xl^i@}zSv`Zsxhk!a%Wf!?|zRN6}=uJg?~bOY)*v6; zcam?igfgkxk3|()U&9U_^UlY#DzE(^Ag1hx^q{j#izw^4$rvf)^t_(Nz)vJpu(#kE zt2rJqugD8bT`|FN2kBoF(J!EbgECK!Ke{~mXIj6$&ZHWzAMgly3k`REkS44-@!Yl} z^h#AEE3(Tr8nsQ5&~}bXIez;JF!AR*c4%5e_#k7=!`@QzA`odH*K5}M82LKa)^GPS z^79>Jw+g}s`YG2)P9g81@CF&G20}_^1qSqak~S5eHZJAv1#4)EgZ^k@vN?v4m?ND3 zm%u6l`X|ffW_66*twEIXl0-^Yq!md-xAfszLwn3Q&?LbSQ2)E&yZlV zsd~~9j9fAhoIQ9nD)?T-oWq7>$hn{!hqN4YE4}@_zGKbMi(IRY2C>G2#834Q(iN=) z{6iKMMh^w3MYfg8SWd=mas*|)+#tE(eh(A7F~|*JD*k|Rrys0=Ft9NyT!#p3fZ17%6~puL3GN-Q-RuC^S4bc~ zVhX<;)b!=hqjUVJg*J+uU~2bw?~~XdFQWPgncyD0p>%?-jK-_P9BV=DHNO)t($k1s zQw;8_Y;2)C>akBS%+Pb3U1S?=$%wK0HsnHg@(>?8=z(~y*(30C`!s>`MX$h57xx=| zf1b6YUCTJ^gcGc1Vq{A+-NJvdKe^c*LCP{WXxczusIM^FdqI4npD}44X_p&e9Lao* z0h%(nRPC{E1S|OcwOe4gyN_=XmW!a6TQYkxv|b<}==Z;dc^@8s6%QgOUG<<-V9oZb z5&5#~2J4TfA4m)OH$L2Kx6Y1)+-USC*!64pNnjX4U4Z9Jsi2%~)E6A14e8Z}vY@TW zym|Nnvimn;rBtoO1N-q{hOOcsG|_bP7gdv%Wi-RkQRrQ$`XGV?2;m4<)Vm4RD2r=O zdxww=JK_8*F`A?)q$z#(XldaPIzDNPv!`gpDhUOOzhL~D5Ja<*#a>b+RWPBNl@{!* z*MK@z+O6(-!L=f`Ef~jB#q3BGNJ%G1@Fr1bV8v3K&TDZ5Ir8Z!diU7dv0H`wb3X z^0jDU=0O_OQhKtY2MM|g&oB%`Z`Hd{dSAkymdU{6W|#E45xwLO6Xllhi=!u@Aw>!f zm82n6gL3oHRov>6_rd3NdeeXi8f}4=h2fsy)}Sr4E7A$dv+?AeK#($=wf?(Irtj6P zcl8rj%=uio$a!0uYs=s~BCgYPjVKWkd-{3(_ftYTTnbkYZBh*7Bs+1Ta{{pfs=H5c z5ud7OlLQhU%uItJq*RAAv@Ss1pW|Mbdl>JB>7Zt(gKj6>O7PxD%u2Y)+DJ-%*PHlWiS9Y{;8x0dFp+G|Si2sz zN%upwSCLJ*)#b}O*y^oetQ#5jbnmuDGaLOvwWR%2eXAuZZ>=-x&s%9kwajT>1WmIN zofDO@DBQ(8vHC#D;~$Uqc)9>;Zb}q}6?|@8M~{D40odoubDmoaJ%5O^CG1BkhI{T) z;|w5jRH-kMiXc`T$_hv!DC&6%V}XpGE5u=t*kOq%UxGs0^jF{SND0I~VdPy{&LZbN zgdIH(5zU<6LZ#8_>4@LDz3BFc7DKKqWV_gUT`$y;pU)zjqvRrXE=mSA>qvXRmvN)H z$E0IEvwkOLlbMZiqcePnB~5ul5=<;uo5$%1FGAII6;ThqtrB^|96aA7*8F>k87WQy z*>cb4TDtcB<_fiW;02DEjhU&-g)E?zp@CqF&=Xc}CNUlp^I-AGsB9U)G)GXjJxH{< ztD*`CrOR56TJPpHM8v*#JCv$@&*~jTE9^ZNly2_3+9^Aw9u6lAwr!$ZE)$QcK9j2Q zxZ6S{#KZ$xyRDXwkd>-Co-^FJ5#t4ubzWXk0>UM2N2-JR|18*i)%b7Kxl+$0Sx>_i&_xkmpZk4LWax!xVl&9JK-QZ;o((0DV`( zq~9@~nxhW25#~U+duWs?{MY@sUXQVOKkM%HXgK18<=riAl53Or6PabtuAx_-TWVNz zdw7dZU;D+qbj|)@B^N?H?~-M@9}|lemAOWIT_R3wV4|CU z%-HyWqn&LX5 zr1{b66()xDSpsH(fwMc+#1b@=XY<^E;)ON&Z$~_9#TKK(@j| z$VU5mVgB1K6PBt^{v@cGTj=hL7;1Z6bP$m9&I^FYOten5r1KF67u(gSmECGHRzaEF zw0q7+-YBiG)YdNbQBZWzb%Ql=O5sL~kxOM8>T#L2zX{M58T9HjmS7~oZ|snD@W{wv z0Tvlw^r&-s{huoJZPK*cJ6@t&gG=Un4-&@06Os?KKMiZ`)*53RuN2}GHtqZwqavs* z#B!upNv`nqF5fXw-KgvccO#f%LRO@CZY^m< zXr*e<`EXsyg(_e7n^j!hQB~W>w}j^Z#5dm}(+PlHS*04>UXGB2E^i6u60|7i915Rl z)D?p;<#C98{YLfb_u2jV2j0F}k>Wv`_^@0&G$Ek2S>x>+p=)nA z9b>FM*3MZ}>)fg<1(yRYQj-QIgF|Qtka$Kr$&Y4;2OfOQ8W#Y13{jwK$qApAT^FFrQ;U84 z{9zLRcq|ziSt*bS+LUdV>1JJtU?PJ&^C2Z*$`iwKdtlncQa@AmRo{-I_h~?rsgOAlM=G{ETS*Ig(myUf7eLOU?0vNvtCU!+=$u3Rn%% zG_N)*2HMw2poLInmG>_VSP2}u`y8NiOF}YucVL4y#U5xd@&PraP>)~N#W4%3a%f)X z=@-(_5I_lD=_{7H!n(}ut*-08a+zQwun8^$x|r#w_@sEqAG{6eyR#&%_yh!l7l$*3 z+A^vrDeYLEh%2oQP`sN5#5NjSEh(*^1+&at0V3#V$NWmzdetvV7jsauI9qIVBFmY3 zX;}ff4wIG+AsV3NI$NquOE3#0Q&cEAH{4oJbioTi%h+{==67Bkf5PiH`sh;Fm_@&0 zbtU}1()37sE~XGrTz}7zCm->Ys#Gkj?y4*6aa7TSRK9{>6=MA~BP5HoNMm6Xb#WC@SX2OA z7wB9J6L50X1J&YenJ%MslPfi+8N(zoyyMB4gc=782i-4jy%xY25;H$u@5Lt=28;V@ zlgF0mJc-7PGVvz^z~R)B3c;{cAq$4REa&%ro$fvu~3LxjZUi% z+2t z0rfUn`IYhqG`gmNI!OaOo%4hXXg&@z8%;jBeLL{tPGJNh?7eJmsSFAOWg++>n4B8Z|-$g$}b-ArivoSi~Y z#t9OhoAF zc4@Uxhsx%!?rCY-v;CxFqt|s5D>0EOfF0Z`^CMfgUWf{^{ygcdp00HE`cDfom)%>DPeFWNdl20mVlhOU$gvk>%)kp z7Vn9xZ?>SAkv(|y8z4#qy z4`M;Dm!BB>-lgsd`rd$KwO^BVXHz+5rgy9Fqt}P!vBWFqt9FGeaT4Vx z_i&ZJKhB%&&Il_vm5z39Z|y{Enz@}KU+(H}t{W)-`$g~mTZc{U)0Z#LR0}nygJ&qG zlO!o?L}%tiCzo1YJW+7lPFXT*cAdwgQ6CzdYWK2q-FixEp>4{|!7?Y1nOK1ApUkVx zB3}qytdV{Dj@nBxq|m@V*wg$)(EA&R>KJ<}7F%QR9a!#}Z@Q&fpl6r3YQMdR-UdrI zsUCEGDClj3ClFady(^=c0Pk^pmCUAiSEbhO-J3h`fgHp1D5{UX+tW;=o#=focGhc# ze7zy-9qN^yp!;x(5(BrNyYu?~e$e#Rmg{jTmoJ=!Wt}khdU2k8N6&M7$u(#D9b z*QYVm7pT=fGeD$idVLcWvAA*29Ut>NgE)j6*JAY#%B1maVMu5R#3bXvsH+B3yQ1Lf zJZ<&ahfJ_=>AhRU`-xRnb!7K{;HQVmZVFs<{;{rZ)=Z{f&YQ}4(xJHZ`3Jw5Q`1@J z(Qj={mo5*al06$kE+TBxd`I~t`#ayIcoBj0%j{gp>svtsVU1i-qp_SQ2hmnix?%-`}vrd+?3&MAx!*{b9eP!0WJQ1 zWJLGnEwOKXb#E5Y0^Td_#48b&bj9sq|1NF@8<;=MqR*vr{*XF=WA;DOF!5IiJcz_O zS(h_#k7bA7jg=UBsI?vlMkO^{+dzS%)v;<6PDE|8&0-lI z^~Y9o7_;FTeB@@BRlc?5hdu_y_-EyvUDu2IvQ*t%b7>Ak`+5m2@ScV?ua6) zwae+8Q$Ga9eNBt^D+kJrd_OH_NzMOI2TBU`F2H9nDnBYG(UTiT<=E5+I_4CT_$zZj zrMho@=bN@)wzx^7K#>~g`)xFk*s4v>Oo^5wf_^>3%edY&&XtfkzNty7RBeF&H-u=t zf!esy7x#sGN6MMK<5|M`?we#ct+%gBE0m9ID`?(InnXz4a{avOQfWlt;O-zIW*3ah zJI)VN_ns5&UT@{EQ!0-Yj&R$EefQ+zJbBl6J&$P%S4OoX=cVjdXNMW|7aDOfA-C~) zI_M{=*=f&ab{Ey2Ke#>m^}g-R>F&TG*OlX!(JjgPo~lu={v7 zxpnw#3XUzJpP$PJA_pG3eBCXK)||QgoqSqMbl_MscjM~b~+)GIr|PKvX&p2!N(u+=%S48MO_Z@zB-95ga5a_BvQPU{bEe)Y&?ZyP9T zx{GG5cIhckX1o|_IMg1RmMU!yOb)o`dm}KgjlW@Iu#eF!bdi9dCcXoU3P5V-By3Gdu+KTC}5Vo6soz z@i*)Jb~_5r4lvV(;^$$5r$$9X6IcN*xlBjgyPxz9?!u~%J{f!-Ls)k!UpiuRh(@H3 zUw!dQ74W4Klny{HXu@zE@{|N|nM3weN*% z4NLtfI%oT~lZ1|PTq_g5lgiAiZ5scWWkeerBNUzAv~!()B;$G8yhwL9Y4`Ag3w@%y z!!QJU(#Iw1d)g5l_2JJy4mwj4OQCrxi^~YOy*SkbJK>&`ij^)M+TN>WGOZOlm+$h)j^bbQ0?h^DAv^< zFELAuvHqy2XNZ@+Ql*W8QUo7=fSgH!=Y!0axE`Yq@tT!uzSbRv(cv<5jlULt3U<#;y~TXEgeqJ=XMbJnNFJ_0`u z3(PBZ^U?1;&gTp$%nOz)g#2m>k{yI^`LLdyl}mPSJrXU#Om>(ea}!MB)UX0Qt>Ii|3u`wYO}E|m-Pk%eYqt7J(Mg+GSXP-WEA)aN3$1B{&fOfjQtYN| z4|B`#o_&06Nf2%vEGYb~-0uokpA-2c9eYGsY`P{|U1=)Et1&hx6za2~@-MNrgK zQra;hVV(@nZKXXqP?z^wXP*!w`GMs#Fp|^Yx5j$++fX`oyIB#t0Iv zv5&#L4oQ=%tWL}atJbK)#1FwANnHf1?C#VnKQW+>=2c)ID46NJ^`%dJVl_}lH)i(B z8!kcF!PN+xtRh4C%>t_RhR58XfJ9iF714FyoXOG~6p`)TK9W$(k@%`mkr&>_Q?d}EQ9p{cL;*gid5 zND_jZhg_>K-e;>w0N`1FwGZ%(EHnSWy7`dv!zO4ilydh1HGjxb8 zE5Qg0HMq|SJ;>DU7HGd;!GBY~L6i;=$L+Ajq#>d7k2V*+oIe+>rq;OfdNk#TU_xL# zzDD_eZt(`3;TpRj>JzRxV4mbhzjVSlQiNcuhb9RhB| zj=;AvdrM2e|I7t1N-yyvc9<^&YN_z^%%OgikBH$K{Cc4+cb@{soLktePVd`yB+(Dw zJD+S5qC?mZI&GAdX8kVqiUNd;CM-AlbfLy}6|5X8`$ZN|f};MM#U~+_ zyo)}Y{mnzycXE_-DQlU`v-;Ae#!D_18VJq2P~cvn33nv^GM0NJy3ldHr6;*>KxG|# z_9xSpji$YB-S}VBHXrDt$@Q_sNBUSUig#$z?^tmw<;gZaMmDaP|9BKH-TG@xRx7zs zW2(r4w{pQl1C15H$11w8Nhs79;HpNab4dfU{Zgcf~iamO^Lqvg(Eq_;5o$vLKe63_}@`#L8 z2yd3Uz!*Z+9&T0PD(LrbpQBdxN&IT3Y%RX?pDsJc#DIGP!6bEw0W)(X*nvOwWi?D4 zWFE-oUV(1mj;t8R-)vjko4X%;YG@QXWl4~=Od!^RHmpC{n{=88W3=XaasPdTSY9-8 zweVp|pRbL@_}Crl@8lNd3zu&;gvd{i;A4B{QOP^Ed->EtLX~<$_Fetuk7r9L4G!*W z5}s}``zan&?>|HQQf04M*U!d7I{ah`pF-dt987+AWauENvDB!GyN_tPe#MXiJa$tfobd;k$zQnL*o*ZJo?|UHEtNNMpR=XTttW+^}-3M_+(u~sZnKG$a^H^)g&Xe(I z=SP#Tikok-gBYh`_~cXi1iJ>Ti1UUy>+RpW$HIqaUuFp47nlEH8hcHj-D56~UuY2i z`Rq*@SxB^k&w(p?He#izFCLQ4bxN!LuBsRVfoZ;~^)=&BXM8 zCLelMIq40xBTeLOIo#hZ{crR~C!J3+8TPLMUg>e9@tmZ)iJ-knNTPWol5X-fEOY#Z zKPjlYXK4NQ)r9^h>6mFQ`kuq@*j6{QJxyZ_ zxnkxXTqnB>Bpmw~q|siIvFyJSEL_k*9~JfpmqIRW#!?iUFI%h5A*}&IkKEVw3^Bfw@82cO*)&y|*NIb{FY` zn|p>vA|_4~lEB1sTD`XQKuuT9S3J`3*9JwI zD{2HX{PEMnBEPlWh4%|15%z`cSsm~GA6x zk(QK}jzf2McStu#cX!u+bA7(Q``P_O^uecYi7?9RC{A}*Gacv??W=k| z;6(k3r6ae_M+}@Vufvu2ZZ~%qldIk&pkRFsslQz2(7sl?Nn%M8eo>WNn>glN`?1l* zUd({pkv+q+BtW*o(s6vBS8->uoP*=91Wc%ciB5D`_+|P*F^J0sQbQ-m8xAD3KRkKlaF@PEt8iq zjVw@Q^!&>c!`%lp6qlCo-%o*{IE~MngR$l~_K$Zm7sAgL6c!4#7MB{Yw8u2wb&bij zErMM?lzO)Uc+zi2P9#p|I&5!9{~HVdFU7K8MAQf9 z`+@Z|13@!e(Y?pF;l_ib^UpN7qkc5LDPJZ>?UnIOx_af-zn8c5;?A6IjJ{+veBz$( z3cvM~_>Rp0a$r^PLO}IrMc7F0Wflb)TdZlwq5yfbdHeT@ms@yxUX7P})Gl{-55C_X zEeRB$M@p$V4dETLxLoE3uM&=jRqL4x-Upx@A$ssXcyNf_wYbC(XXt&QCoDHDD}0ti z>Q9b^z5Uynaei}=XnI~Jg=ecYUcElxx%z$9Y8G5NFXuC5>rU-Io!;+PApfa@vn^^-%=obtfH(KGy-f7-z{sNKKHCddpPSCbL4 zqj_k&LG^JrT(Yx!9FkXiRwzs~y$vlIg`gP8Xjqd@Z^p)b#dH+(a=x*Ft#4He>r(HC z7{clHB@hOz+1~;n9LiIqWerI3KzpYfe;&l`T`^$%dB?Q?bP(Do!$*(7rj$0|IsA}jVzcJd?>r=W=`r$?UmcBRL@SW z>ARN7bb=}E%wbG&ja0;8vVKbiGV<>qNiu<~yKmiuhcjdzUw_H%Y9QOQOHyOf?H~Ni z>)y?GU?!z`&$`bFA`-HG7=NEKmeigiQbvxx^Gpt(1fno-sHLJ_bLElX zy`g{b(95r`a1hoo6CTN2@YNwf|9O~I0Cif9D+os&0X|rSAj48B@awSn!J7JwCV4D^ zGR^=|C8C7SVjllZ`Hjq=boI!hb;;QJEt3rvEqk1Vx>h%l&JaScvL*CiV{4jP{%2%LhpzokZWkZx>m^10;opV~HoA%?B z9FKHo&%G+_@Q*_w4q?zjH{DMi4Te-w3pZ)e3Xm7`WczFXfVyipi|uePh*)!{gDcMO(vTKd9!r|aeHTxl419Fh4A(B0ZT;CtOl?H zwQPn^WS2w&%P)yxk{AZff%144NVxP50a-?C1^WrI4q+AQItv9Je;zN&M&D5zg{@eE^3M6TD(OSj)$4%5L#*-NL7V;jAefA`1&51% zP4t%i5#+nzrszc5di_-eZvI&9#;KGC@X9vBLhUY`iP(=0*aEgEWCB(XZsW3jKlgIA z$92yQwrnaNukrE~+fxxeYyE>Z|F$l>@0(II$=4tUUX zn9_+TOISp`jFDqKjm%**QJ=1h2>p_hWtQySsJAbjNEcC3^M>|5_w^)oOtPS)Prc%D zXwZuQpyF>1x;P}&Ngv%?5yFIguvCu(ulSquUEyl!zxU8R*(%*xQD+8};$UQTeuLv8 zaytt#+e?9|n;+CoS|q$^j!%986OZ#ep9BhY&|2T5!SP=vIsf4WV!+R`fy#$Upt=gK zf%XKilT9e*#Qt7#qdY@n8K^-Ftu!4=xa8R8%rnpbPQ)EebuF&gQkq=YO>_#>WG<%@ zH2n2*Z+q(RRON23`DHZh5H)6>03P{)L9Z5L;fIn6^W!cyFb2q9C$jE>B^|WjmN$SF z0f6HE3*4_D_DmF=@16liH2@rav2-VICBLJs6wUXr5c*E#pA$2Yc`&DM7~NbHrLyY$ z7IeW!5iALtAL2J@G^`Y8`&)T&_8JZEV~?4z;+LZaKKwMG?2niIl7uH}^HL;r;^uR0 zdiR8fhdZD(#B}ojwu#`mt&ZY{=`J!M(Y1!?9A3#FoPD31%ZqRHsdzzyK4eYmKOHX= z(_7+>_|}j$KV5iN?gc{{*)C%u61T^ijP7w7%i&M_FflK~Rh%L{7CgFMOsKp?lv(1) zj`&VXWyfz!*Du=7?6Ptwzqq0d+O*hm|GVwUDWgbnke@)$5r71+&@cid-Jj2VTLM(2 zqj!u>Ol`sZDCQ}PW;qsWyk;~3<)@=SOhx$RVx?a{-erI?2UBId_=_o;X01l`qS)xZ zo~ZuKVTm_%+^bA4L7kZTD&_2iBAe2c%rak#n>x83|1#3O+xffTh3+hcpo_GYEzZZp z5v3nW(H+ByRPUGmq#-(4GdsB+tI4h@d=YtlS=~9ZON5#T==*s0MwT#?>iM%q`@BD8jrLi~03#ay-@GGm__)Z+5R1q0@Kbz>2>6V;V?Z=H zVrB|h9t6%@FDWE zVm>;SBzk-ns%$GA;`Rdw%cgM_aRS01OiKYKGWSh|QVDIO0Tw*;9nF^L8FGdM)QfdB z+19fEeR_B1gsAGd=wT0Z^*3*N;)`FgDtBgni|Re+mW!8BC9ht`cy<2YZ*v*zpQ;A4 z0;Yn*oIy7iW!jZ%juO^n0{umF3~0KOC8VWV#sJQkIaw<qx&;*upgC3M!+-4)?EjBe+sgnN2w_l(A#rQZaRoRx;kZGXK~n^A~}F-!S&PE&u@yx{{_?- zR+ABw#C=ylF9l+^DM6)(t#jn)1^WNH&8=G=Dq1wK`b5C<0TbMe>Mj#|4(JX`o>MwLqZY##K=o97exV)&2q*9k@_ zjOVkf@|6Cgf!itx&5y*>sx5XO^5xd~;QhDI@l|L+!-b@+7VSos624ItSJgRVagXAE zu?UMtE(gS-KU8VX?3!Sn7k7r28Rh?0Hu}%eCmp+kGOh{xxku6l6#Ov|hnL+pi@)U= zv8=0-qCXfHwS_I{;mXF}d)#|IFwS2el_mG1f_8}NWw_8ijWD++?%d8+C;I(N3-nz1 zBG_ogCi0H$4)O>V)6tgmt4CaarU$pNQSb14=56B4>;9&#%FAoKgj()DDZ)aw&0gHt zCT#(ec~)WX)^}DQHG=IXWBIl$j`Qe(9I19Rl22wD(M(RRa-i6lT!#&@t=3Av;VMy! zd2{J8TSs$abV}U19fdi1-jlNTToI*vgTKG9hI6u{P0uBG#7ZGy@b+4E=j-0i%6Kp7 z-CsrK=aBQxo2lxAV$L(ACycYc> z$)KQLtc@vi4E633g84EG%+pH_s}}j1W2um8>aM4kY%rEDdhgwp$AebvbG7pJ4Mj$J zf*-T6ap@xi8gMml(m!|Pn{e9mgzS1W#~>P9WsxkgY?e!oUwaOXb)vUTJQJ-WA5+7< z-N&`BYS!1W+1w9_m^t*EF|6uCQ}S1NYneRH(<<;%XME3E84Ld+VwHyBbA#db(jm?H zHZjj2wYfV+g#9BaiIFMeL(rvoK(6A(3293K`aChc>w(?#>;m02=E;#(V z=RV)(IsDpxecg{&8~M5#k)f3$q~7ib`#CxBSvE`HLZ53Wv@-Ya0-4sk(MvK#{T2hWc)K?^M!A>Bc=4> z&cC`(GuEf`+0jc&0bgtXjl6%?c6O_1r0)2JFKudRUy4aOAg#$x4?=x81Y5Xe-Xc~b zpf!>f`}tiWM-!(5mn$DAdSn9}Yj?BAtRvhun@p(G;%vmZk< z{Thm`jcHztfumf0UVNEV&|SH~7oLx}L=C0~Tgy|Qx5vY>ZtQ(`+utV8LNQAQXs+8# zE1*ZC`wp)y3+vu_X%?b9l!?T|oqh-HaM_1YKw0v{lVN{t{$yA5+lKXCSrG2u*^+FN zUv=bIbiRaf|FV?}1MysP59R&iKJhaZ=Ru(eq>I*EkM1B9VnCw4fwshiN(fyPNpb*g zS7*0uVYMWYX7<7u^4WhWqyGU+fqr@)BGHq|7&3LQ|2ANR_+hRDr>YP!ZM0BQGj-n{;a<&poQ zjP@Zf(35kQ?P){rLnKp$(#p94cL3%fAC@8GUc2Mj$YTM$@!aJ|X3*M|t>I}}3M=#Y zb!a&1dg=%pS4`i5q`A?;`gDWh8T4@Sfx=iEzKH8AL|c8Doxr^1cs0vxP*H<80P|sn zlAQJCq(zgQ6`LYn?!R13X__=dkAd}o1di^h5SS#iYYCCh{8BReLpNo^m+{+gyGG^s9gJ8CpMlry;Go2=S*1mj2WtR;dQC~URo|2m7{69haIp#wEk}FXSil< zYpY?9Ip*X|eBU2AWAz-hx&UA&$viPhSMlM^uVb z*g7C0PCT4!VcZLAj)RH~I}SzizdiO(8E!1Dly_K5E`JzcLs^){avn z$$#N+5i!5-HyLRJ`Z|Dan)I47Gt86pw$O4pLjp$^RDAKM8vl`E zaeDY^$yt1{2KuHn(^uo;f!(v)0~bg;^9~$={{lZ~BjtQk7uat2z(En0O77>^Go~$) zIzk|lf~$#M>F;ub>$lQz(?=C}OEBH5R#4oh{-vg4vW1w(Bzr78{h3O3mRhPFkm{;%J?S*x zImuyhUDBIEAVk{MwAn{^aA+-Op9!M-W~+Ju5Z}g!Z+i^8siOnS@f8!p*$hE?N>=|6 z#}c59+XqJ(;CyOyhv!_HmXS7)iPr8~W{&pAoNXY6eXKAwB!n5!>E?>}e4CD1!R z9tvw_lubD=K*_`z24Nk9XnHhBBBgW%pcYhSifD1#vPVAhUivnhr~1@CI0RrcCMF7o z@L42;-j6ld&IT_HcT5wr)Oz~R{9BwhTFRJw8W6EU{L6(5A-517o0zs8$&EoWcH7&p zy!^}jdI4$AAl)#Fd1S^ODNjn4!1R6ie)-*b%Upb(0v)~D%@MPj6UF}L`A-vBQp!bu zHA#`@qQB0u$Ep&b%IQa>D3TvbP4Vj)39GoGJXht`!67H0N8+tuvBV&lbGgNbd6f7V zW|ODR#8vX93nH+2y55(N0=h>9;f;8$FUn?-^=X}-Te>gAHwXzVk$7>sH8iCr5%P2j z7mt$Fh~&+h6@Dw^KMz!6Df}-@Xt!;La}kV>;j0W_4@nOw{;^=wM%q3baWlcPFC4Bl+qL5AUNp1Lp=Nk@oYsoEp2#Oa= zYw2BeU)p5q86Q4~xH(m1t^*E;pm?gb@ktpWgj0m?S4@T%$1~BLK#W&A>!Wy{u_xP_ z^1qI)|CnVuDCSniFA!#91r!L+e(XNwv^MC_+)VE zkYmtvDmN_bh|T-lZ2by)SL`c4*uL}r`+(W)x?UiUC;b@VvI(%5(wMt4aR=fHTm0N4b_aZr*o55Vc55PQ5S(rDZ~ zl~Q4GFI~rfSRmPp5p4W_y#Vw9Mfi;vL%47o1N(gp^;8T52alcy$q0W!H|~0ln3-QQ zSC`=;s>)aYuKGE^enVSN=L@|yo z1sdL=t$}u{b0aRZESwza&QhTi)d{%SCXJ#c?t0&ACtNvY5~BMF@i6_wb<_yZgL3=t zdTvzEqqYfL*$&=QR^u-A2bkxNnfE#0oUNKmX5l@Gv6%g?5T#Gt=966U{aLL;4g z`)0dYE^}utSQhGq;>$qXM!T65)n;EVW@X5?b35tW7d0!LUDHpg$1W^-CWlP{NiO}w zv+*+KqfDj?CK@y^ED4DeCI{s>`bsKDHis6$K?s)g_d8fLXrEVHk~$G2BEd|E(mJF+ zDzy!b3C%vtb#m>a@F@z)P7*n_lEt7Xe$QY;J`y=+iv8GX z+*!hg`hW>-Xg@6?){2LxcCZ#7Dt>`Ct1Tyi>IhLd#DIv7#IpNafZvMuoKm2^?ve4D z>UX4fSK{ZG%g_kvHPt1@VRBE+#~J~K%T!`-GX>M63NEqn03t}vQDEd`K*_I%QM#Xx zyyb;@_zNPOdPbQc0{vDl+85Kg+}w2rQg!&aM&j&JL)=bhO(~~8`|-AZ>rUVqh4MzV z^1!B?E`DR|N0)>pT}FhXfM|ZlKs|=hWm)ak1f7lJh_y9GLH`0n#~+dy8VxOB9cN6fiWtyUj=l82ffhIptsW6G*@5MGwPIX5g+?8^Ke=w&E%bk|ye>hu0_bsIBK z`#M&II*BAS3@@*fWeYrJB!wZ8NEaU2kZgQ2-d}J@lCAQKT$EtcH`5FO!f$>#_&*p> zFg_^idMo1erJ~&LGkjF5_uyK8_Olw34ZUr4Bn!h-kMg2MvAO_nOhQ?W_S_FnbXgWo zB3M=g@8snq^!U^s)k+ignjiha+;ZCf7$pUa8IOqNWn3-526$ltu+b^-pccV#Wc`d)`P(oM|JxFWvaA+=Ei)=5xm{6hZ!EJZ+ zCExdlSWfv^eSg&H;GyUGnIw6Z^$j=E`rcCViecof*PoO-C1+=1b+1JNS8}Opye3jw zzJ-{~NB?RXBEC=cX^oCn8^XYMU^6#6cYI*l04= z?u>6_v0FA(GIE&QAS4E`Y(u3rd+4!934D@_xA1?8AHibW4Ox19`4#LxH8>h@`fKXi z^(!8a8#qsd`ot}losc!fa>7Bn>;_x>_%ld%;>Pyy15Y<5G-{EC0Fj87BOYx5hkp#~z`1{d=T z*T1%n7sl#HJ;Pq)G3i${PtK3R( zyNFdUD2l>k@gu(NJw^YrjEW45aDL?Et5}mTu`wt(x0d?co z{fKHs@_$b@6eH@RW+*+xEV`G7`c`o?dWy$WE28SnP+!JDj`R@>F{k- zat~b}d69TOJvp)dc|YHJfg@F)B{_*f=P7h7=PSxrZB3)YxSx{20}HiZ@~+#+IKEU@ zXAd@?b(K&NN=us%n)A(*U<3Zv8JyR6ieCSPBtRN@&LbNy zZeV85PQ-2YhBVFJqNp~@{El`za^u-O#-@$r^0~LY@xOPv_NJM&hdAIh6q+Mf z3D23III?e_DP5FM8NAhxNFecuOy$e_EZ@SHE^zB(C|yvR)U;!%`mZ5lpVve9_V1Hq zf)f1Hw9*4=_8P%hx$ose_eAPOXQuM{RPvYji#2Vkedafr5o;^c`jgEJJM*Qv5=+-{ z?=;*3btl$29Y92?ARhn06{Rv00w?MP7b)bW%kpi;=_5id-~V>k?xPtEB}pJXWK^Vy zscz$etZO5loat9;xUk0gZ4d{Q4VXgU=B2MG1vUIHZM74JkTI)s6au5ZowAP zmEfL0=lhvBw64AwLx|dPAuK92Oe4DLO}jxmZq{d!tw|jBLELC9Kg)Pn)%AG~Mg6BG zlrfuoI&|n+O-khAnMX`)%xPa?@y7X$Ynb+E?q1h0Zr}QQa{cW{V8%mS{_D{!wwIDZ z7cRIKzW`<0HiD5e_SasRnF7Y}wZ#)h{N)3}?3Zg{^!W!&{AluuH^#nb-V?l%>~;b? zbuMew5V`MBT(L3A)EiMbcRyqpgPO``Jh_?$P4F6sT&$NynU%9ldO@O%dOHQe&|r{6 z#eszGcV<*V7*tVIn4nS8?`x8z%a3px4=>TXa_>sYGD8TPu|T&*QRly~aWpl-KmL`} zpPehRgQQ%1`IHO1OZ4(wF){Qt zPbBtY8<8)`Nit=M-%)MLfcp5=X(XSkSCBRq;wx<3%1Pga@{?s}cMQ;;9DB%1qG|Z3 z+Yo~GJ@W)7uX~p1dccdUE9*@B)yDD;MINJD@IL-cWai0PgqE#m4C~8$v5W8O=T%)z zRQZGfnvE{v^+Wf<)t~B|Qn7gWDk83*Jb#j}r5`s~9obVsBI+A2wm)Cgh!^GjxDyBu zDWE1F(vE`YImm=0Xq19TXriQ_U~Yu^HZkG_NQsf~Dgpumg(p|uoV&kF>c6cHB#O2g zAb|8j6(k#{$w|4Z;>LJ8|7XtTu2``j>Avk!V?RcN@AwtED{^)qszXw>w07#l(y829 z{3p5G>3X;>iaDZuC(7H{PSql+$JnbPV&&qVe)fhTL@2u;28b8Nq^yBW`R)erI z29co@LB6KV5EokCldOW8i2$|FM+oz4Tg9_(-H(d4{&l%k$$BmHi#WA4ocr+-44nM@nNri|B}Kq#0_UgA0kkY?QV?P{fa-dB>XcC4B~qxuzw zZ%CKr;QrmbL=Shc&dXX?Fj@_k{WLt5y&I**=+KSi`Hf#qTlL&Q*g4(FL6Y^oiMH5V z^sk@rxzV$_T&nS#C=SSunxsQ6Ej1)wvrv+?Ele4!9bOSM5~3p-pp$t2veV3*5m4~= z7ak}>xL`q4z33Pm%UEqv_y+=FY_^`GDPj>3gy@=(f{2hy@=4fbf;Q8;>>`t={Bha} z7dL4Qq0Q;CUo!8mkF5wT#CX5GCUyE;ONeYd`y|449QRij@#)2oCyR|4cSGCL;jfvh zBW3vr)$`;FRJNw{!dXu#k}TvcgSUnen`;hvy;>JqiVH^S?$;OqsTRwiIC>mqV%eYS z>NtX6-bcpInDE1Q-wWGg+uKYKgeJ9?`jYAmFStimGdT2 z`X1=yF_Yo@=tfQ_1x@;VY7j}seDxelST!+)19hNkanTl4spU5TqUOQYNGW(ht6$eR zqsQ`_A-hLQm?dUGbYU((%?Y&RuexJhpWfW;wc9uO=hDczp>+8@y~MzabmmL0L@?cd zOMqe3fuQJG`KKl!hx1KKDyyHDXxj4nTG3p7{?5Jw+8Me>bp^^przVehNd zim(R&+)L?;Q@wn27QUm2B=<>bv=R&#`DHoFoE@|E_D$c>lZJaM-(B_b%8h{PXNKg| zLyjg~$CeTbrDzg)HOg_%HTQ6SGW8dwfk);YvffmF?D0_Q)ITi$@J=xowALO-A6d0K+j0ierShyH7}RQ5bt*OIBx*8TJX z!3iB^Tz3Km-6QQZzpA~>1?xHQTrm8T7{4g(GG_lI^jrwvPh2oMpTV$X$XprPmy_Cj zuoH_t;E384EY@bLQJ{*HEY=8)K`;x?xjkFh`T0L+CROmOIr0U9Oo+|<-(GR3Ru@PL zXi%+s296)7R@MMFJj1uuw}FS?2LFk8=|;cxhHH%WDtKOq7h`^X-=n;OKmG^VWihq+ z?ZN?M_h7`q!7&YO!JI&Wf;pMr?$1Qyvj--HU=PJxC;4P#L+X#_GPX#U`#?5m8ZX3R zoga$Yiqs>4L3O%^qfs)0HF&dj1F#Fhlm6&SR4cOo%dmfE4Yk337$RQYJxVqd&YpD` zTJ81#%SE&m1tv(g_$}(O-2dSmaZIuRNmx3m*8i7_G~771@xcp9{FsJie}<5GNBUdg zf1hQ^V;;Bz|A}0rS3!$o0(!jRd={zrB_L1yu(7{?Bb(hfrG=G#aT%vt&`VDWk|M!q zu_OHks1*dR&{3DvvzzO5KDyds{i3D#)EKiSiH%bd7XNGOWLK_gFB;VFTNxgR^kS$C znv&C_iAsKp!5dD#NL|KaL&$ezKhX$ZFsiXoNL@<(NQQ07af?HPQV#!-21(OO0z7JJ zpXc3>BtodFdwyWT*XM1X(-}!uamKAH4X%z-s+IjRztVl>Tm1FXF6Cokv=bmHVloD) z;G2eE<0PbavVp&n>V)x^cWz&H7-bF49DSZ+FR05YLkAB-9Jw_h?`Mf}^v@DSI|NVE zJ-9Ao-Ct!q;9C{o$2o&Z?}%VP21fyHQD8vF>NfXSIS*#vlJdi!{O8wcA<&BR@pDzm zAmza8N!yR%1a?un6XrQ#VNqW5AFb>e`hoS!GuyYCQdwO zWnFjX`jL@sMDR%6V0Vh9S*YsMEX`~D1sQjz#znTiwHASOTz_#s>I^O$lVllt z!Y;kLuj~O!In6y26>qAN8Pdjth-zA8>_j?#OcP@G6B$1(SaR|2CW0V?FuYyD-T~Y1g+=zATXn4AAU-4PSSBQUIpg~@cyCCb`5F6P2|O>vA(CY~M#SmYe`o1D{k5Y)`3OFy zo~sJokLCA(2FG@ZC4hJ|np%9#h@LQK~4S;j1@p!4r99P$mN(X$U z0dw<)Lws!%Rq4SiS0_~3s8&^~;L2u+$a`>N4`|-?4BsKS=b0gXU*w|l++RL&%#sB~ zN65r5*{h1Ih|9O_9}l!PV0SXDK6t7gpH0FYX-*J@?{nD8lRcoBJD}E&eBw_1Ccq}#dkdYun7ci6-pJvzr}dDDZsm{WN~Y{@VQ++VeT-l? z7I40f?VmCHYDOn#)*ATiSDq8`(#WFEm6~4cvCu@{VNc_5*we zF=$l8+U9bvm<}=+7MHsBH&T}imGEaYsZMMkWh+U$;4$fc5@$a%H{M^~9H>r<0GyU-i-KTSm5$8;H%q zHRAH-NxF1Vu*bgyME4~sS@ft@9Z9okMNDd*iq*4V)Y+^RS0>z*^h&076BjgWDyELS z$w=#=`!|(q0gX4>2n~wQG_RA8Gn&Jud=lcsmSZo-yt<00h;Y=OyA(yw4StFe84_BI zh-`a2J-Jd|?{Jw_IByR?d0#%z$Rk_+xcwe`p0ojN=#buVwXpoY#*E3;G1|uacfhvh zty$&Yr9>;1nF^&)TM@9kHB$CNL7Z;@FVN-c-u9eyITk2e3pR5}t1Lnri{p%u)X>!E z-UE6`Bfq}odR22>JLeo74i82p;g#08t71W9fou1A4mq}aYfV#d4Ejp@L!>`*d*ypy z&8@C2#m-nnDQW`qTAHe$*P;unKgZl0{z!Pz#_7L3j*#WkkR_Ui*{OQlk)(KV}8-v^tMjM z=__>XmmhB1qu29j_Y&KueuzfdqZgmd850*2(pT1qep2eA>9V~U*zK4$7;P>RAP$qo=Ld=yy`o=3A-b zTl}JIE^I#c$cX7!wAxJ(BJu%c^izSk0t_UyjvMJ_OtwbRgp!WC1stzfPw1CwsY`|% zF#Y^~3&UNF)T!Sd;rP8|K~*Oe!9gF?Y_5-6ln}=O(W#e$hkNn`5NA@15u`FfYxwbX3poco9);9pzBrq~$GH{U`v~HZrt9x?400cISu5fLX(aB8uz1K%qG?`;)W08eg2O zMW#@;EUEU<1 zB~o&J6@RAQ!r7p!%@t+DgZ|aGi*}g$5;T+gOWg?y9XO&8QLA8%Eq$xxLe!*L>3R=) ztyBHWsGTC4{uxP>u||d0L9*n94&V=deaz=IaQp-ULme8xP5;8YsDou&X;eznlDM7a zfHBCXOtf4GnS0;Y5MtKpK)F?{7~z96QKxgf1xJK*RYEhIIz( zxj>Q3O06bz@}G|w=pK;FQ<)iBbN2GD4)!1NS|Bm%XbkNSkIfiO9;Dn#ugo^>c+1lS z@k9FsG$4y1Q6JuRbeUF}l74g*!5v0))hX4^Xn8>p>V`9X+w97Fvv=Bp?p^kThN5vD zY&0~Bm$lP@3>|kA>I2)k^U*kt-;+RfiZT3*L5Y+^rKqf4VGA1-IY^qRo975bok%c8WD-6qsW4%@^ z)YWP7>fgMhutjJ0j)xSMRz=MVPl5;XIYQW=iA8yo8uP6`IOeuS=i~hif$cc2%K~`P z*!7C2$leRWvDmsSy-A7r6Vajl=>hiS?Gmb)pKa!78A;5aO>TgnhV=SU{=?&_0ROXA zVA=ufq`S#2NBkK^n$T)%2=7;DC^`WF!M8ZNWb$`?(C+13U9{5B?OYxwLGWf=CT!Mq z8bkhvpDxP%238`yf>BFVBBb@(QO~j!fiX#)%|_5={r8U7eX+EO2MEcW_L0EPLQ<{D z^fMTQ#(tuICJ79W)`9oS>d_IsL4P!(Cp3`7a#2Gnm6sNHzeKYyI+4g;ahiU@!J(3s zm5tO_$FSLvPY5Qe%y0`0o994<@yX0`HjfE#LqjzbIi>*EVpopaMRJ zrFHkfJ-a_$Fd!4m4my3jJL0mYAO;@fzk#u(*iaIO0r1NBwcGG5ip&Q1Q|>G_HSjZ# zPlFMApMg~|+BuhgFLJ;FwmB>;ES!mZV7vKZ<187AHJ+ag4My-MZYLQ|hyC1#5MaR6 zjMkcY%?S?1#`AeL1KSQY!bZ7{cijj)1zk}7eU}zZ$EH&;hx;osfD_!t& zuz;s^t>EYl7%^yOs%M%=!WcwxlP8};YCczadJkNUmgRJvb1wf}H};6Xh)~z(5`sYT zN&Ye4I&Jw#lfxJRv}+GcrGP}fd;mv7L`0;-?D{n-A^UABm^@hXi%vw>?(Xt{O2s;s za*R0D^^hY^7V7`_9=QL;16Msko2?;p@dF;u$Hx03&!_Qeu<*<|td_lKw3{^^uh)>8 zUR%#LySt*d0TY{8VC^yhTsm2ARe>8+C=K!0_STk>S@?9w_8RcHB$Z5HIb98=&-c2# zXi~n0_0Oet6R2mrr zyFQvL>B$NCu%79A2u$nSU9Oxwf2iZm9N-9i)$6nu3>V($RVo;h2Vfv2IVWQE60R$Mf+ zDcA2v+wH{f6R(>}iqk4Wo?2CYaUU?g+Dovmv?#@BLmUnuFx+|sMoZQ7A4?yV3RTkg zK5zqDDc96e;R#&5E*=$f(fDG;g4iL(!6pPOZKtw?V%K4kCUO`NI1SB^gygDDw_@gb z^7&`kg zALs7v*57z&i6HmPJaFe*?;}r*1}|mqvUIK`4Cx6u?|S*V6m1M_p}yV-l8Y%Ys14!P zUVkP4VH5`D?TWr7u!ohiHnR*Y{+h=BqS|;=08E{vc+GX~lWV*+l&rXoGkwBbtl8)^ zI#COZ+;d>@C|mrcvCbBoT#r6NfhScNBKZt(X`ui{O4V6BJp^XJb&CZL$D1Ynkw|SV zu?P%;L=V~^3Iu=--P4Fku%)192ue)c6dXy-CgXGW8i--s~FpjOD` z_NXA#3z-{|iEdI3{L`W#p*SYmGiI}35@wy%iZ`MfyjbR}2k?i-DH9?^6Zj;{EyPt8 zJ{f^cjC>{VSHP~_6P^j}{3{B{xdAt3djqhM#X)CdrW2%Doed-;-ava5NjMeKOW~U$ zOVNkyiiPC%lPCxt<{gY#C3EfP2|nWACkNlXmnbr$fhIuz`Pi=wSi7_OVf(L2Ec-U~ z1^)4-Y?f)A4L`>7r&mFacc`?m0#}{FkA-Bo(Kr%6hg2WKT4%}Z-kI9 z%0Ozi%8=U!QRl)klSSaV?Re#rEE#izEIg8k>r+TzhP#29+j77QAM98D@6r_-9L%v< zO{1Ir6(pf)A39$WCqgDVko}B}2(r|xOk;paUg8{ckn2GgCLCE150TCFVZ#v>yU;P= zOsFvtvAZZO8y9#^#P88oCq+wGFGJ?&Suvd|5M%0jCVE{=>5a-y+V zGlpi?e!(-p+Zi0@J`2gdXn*!5Hc-`RVyIcKFB=;`X83X5&o7iO6OfEwUTF%0iZsSIcOB&WeXk-XB@dJ z0IbIrKpCR&jgLPQ{W*>-20`on0)ZR-y5HvWf;E3<)d-&6Eil}&4;^~hlipbp863C= zX0s~L@UwiO($V+4Mn(G#wvD01Pflnetz^SVwGo*ss z77X#-X3-4%k;&ZgyZ+hSYkL?O`bDmH=H-vS!6Yqz17-Ez^O+t-xR__|5U*Mab%sKH z-Z2Kb7aC*oCF9zL(UYPEWx8I?$83e9=uX&fMv|QH!U84WV?|N_onbf$8BqCHpM^2q zPvP{Clb;O$CR`oNvvg7jp~`6zQT;{?f+ru-jvzA)90fw8q-PZ-KFCkwP0SW1b5kjKD4bKVf%SOV2DALDgjLKoo|*XB>Kzo&Zt$Z z!9lWIzb|8F#;`N@;S=AFLoi77hpyd1y**Xw_meJ);+0@{w7_;uWC}xltUtQ=#wp@J zyRqGhB{_2gI5LH==Mxc#>$@nT=!`)t{3?VC6AXc}f!|1|0*#S}NV|B&17)!?)B=m= z2!6t@$P}tD(t7C$b%GL6W;G7FN!gPvnBJRk7*s(*#QW^jt=?|{yt1lxi;1E~EWpg# z+jsk~Smpdtc!YoAk&L~zezTMTg(`A?{kx*IAKqn62+^NtzLpgj$7x~sAm>OFy{awZ zLJ5cQcfS_@Genl+ji1}IpIsmIBiWgOQcp(jM-o1yKBHPyiKQnEg)S7heA!Ei~>Ppgi578fYBjvqx?8G~|( ziM=3S2}zht1FWUZKmC1C2O zF%{dpf1yqNiw~FUbGIw{9gzx!kPjd-cF z@hV`29Z)D2Cqcf2+ETsOCM>p^%8D>G({6=d9YLl=M*LDRKGP8(AU-4h3qH4Lr4D)c z3-se_n1vE;zQj@oyUJi|zM*TDFoCl0%(-vxy+1M_|6R z(MO?Nw~(OPKaPT*pzk}mgN}4OssGOEqPY_@g|L2ycP~U2s*$zE@IK~yx(TN>{gIj- zoFTOQhIz~eWw6U_mSD-7o~Se>WK{rU_^B6DnBBqA27lt~YNQEzn5~tlX*?2&W&LJT zXy?+)ne!jZy&~crajwjPeAa9$GW@MozLVlA)`k{9^jcV$V02t$NfohX6CzWW)lP(k zxWF}eRHjU(6h2QaKO(vBc-a0v?ylEdz?D-i9?jwEP!r+p+wo~+Kc>sm&*z25$5x^G zWD_6S*Hb+oWk+9pUGF6blz=ybS6FM5_?Y`~lC*41OkwM3=?fK=m>;2B07^P5oTD6I zNJvv~Ve);^l;eWazO#=ENPpxi z`K`joPg#PS#TuOW|4+L0Vt?+l%AVa+;Q<|DxjBOrJ%T`k_yV>nuhgv@8`z-AfOcH;n{1`= z_<~OaNRS4AMyO>}xFkA=>;k%?rEC#PdQc4|kBveZYyLLpnkv@EuvLEa#U7Jf2G_kQ zTAtn4lgcLG77o9GUC*->sulGD=*2d8;6i_Uo&8^1-ACrFh*gPhFg<+7`PUb{XP>&U z9BBfOQbGs!o*4vii9HVt?VJN_HVa@cmmlH+mwkNXP1<4#0muP*b8854)Yax2WuvJcWTg@OIR0wkv^QknW5Vh;2J zatuC?y!8}j(UPVZuM4S=^J`qR0GsrAGmkQ<;oD{{2B#NX#n`?8cgKMUR^kEj}ZNT zyRd7G3!R7pJ0JJUjfJ2V}4qaHpd%$gbv^824%LsGgn6g3I zQ>cvub>|;HYua?m_9~oB;n(A;zqV$P1xqdAuZ<%RZh`20nQy?QwfxR(3(h+-+3BzA?og&Yji{-Kd=6 z2%b^m`Ua7<3J8Z=;H>o4y8Kp$)_l_pLv37W!;LKx04cN%*wuxr*CNOK`%_wu>L$%2 zKc_ctPY)KHdTU=gob=_p@)HSg8e*|t3gY{_D#9&PhdsXi_Ar&F8JNcN%piTWC~spl zgDmOTlp4q>qH5;QmSrClOw!hV?!~m)=JShNWot1$n0{;un%)9HMMf_GD2cRv)E6M@ zs7oeOcY|zzloA{)pRU2(4u{0!HmO{Aa|xCE$n{qQ^mx{RY`sERAW_257gkjobR2n8 z2lQ{ss7G%*AqCpW2FVT;eB84;ARFF{Mx&+D8=@o`o}&9z>|Sl027Oc$V}d_u(!DAG zCEN_t+{78fJWKWIK}Oj40vt=O3yXUaQWFe6fBIIOD?SRedDG{AjdU8Je)<1~%eQ!b zP#tHoc;5hUsw8Q;`~b7Cn&s^K!Y0L!Zlyz!t*c4Z_;9aDRHaAbGMn0|ZWLTL((*XYDsNLN$g-;1%ZU? z6fET>xf#R(3Lez%$%Cr99;#6|8+)@932%cJHaNiENHV)F(_L^fh$QIL`&b&Ze-G!= z$XN{e6XQYs+8vptp1(bK;;08G!8^}(hXaD+;A!D8eTSrxZ#sd10!c#hr*6;l5f7<7 zvxOX1Dk!Ouca8c(`(|;T27VzWD<`QL@7}R#C{@G3Q0(QS=>`kJkzRHvVzV_p{^MhV z*EbJ@R&8O!NgW&Rj4wEIXitoA?qVmR?uO`BP@0$QfjBdrEdF97?l7b_Vd|+Ev?g^Y z)xbDinUY76YBpsvrEszyE1-DhW?Cyj zkFVbi4qT5tyUrl^R2H68?D#fKoBAfqDqSVGUx#1BkZy%yfE;rBX)HsWmly{f0_Y?8 zKevBTunsc&`SP=EV)F^im_GACn-b}e2G)kU-^R}Nt8Dk?-f|ph^1b5%Zu#s%Tx$)H zY!xPEXbc~QIt>s&GgbUvCxMl(QJr1 z2|&teqmahQ;$DwT$)_@@Jl5Z&{1p6TCUUAIQs)UiU7(oVS$;W}WJ5m>n;rUCDo_Gn z+jB*LSO2ZzyhS43% z>Dp3R`2*anA$i5kd4PSL78+6Z52MrRWqdrUQ?s*~hXV5aSCOKy0Tbj+qWdNIr;U&0CL(;K)|SZ{zBF$WXkqgr2> zA1ZV@HUXcsh8_5$XuzVIKBKNsr3l%4{=T@T5w3RUvl3mEI4Qc|I{fg54=xsO!Bsiz zN_`?2FeskG*u!$is^d6EVTJ9(H6pL$l^Jek_}I}|A4@GJF*d#GH+%gQ{qn7#pgoq) zS0%6pPa`|esfyGFQ^pParc~HV_`ExIIU6Ro$DIG3=8raX_*!<(_;StAgrI1om*ICMuJnV;cDL&Om~FL5FV}{9?d0~FGA?(~Etu-P zahr2NZtxfFhr|6U;UEZ6)_0>R~&r)c%$qi2#x^pu`W6OOB!xX3J7aEdUK$Ra3%LWF+q~(3(ad38yu|u=5dsZ64YXm# z@!(i}B&Gaw^ID6!T{m8-^C_HM>B|l~7=&MVX)Y3N$S(rN6o!LT65U*<9`4nSf;=xa zTQq_kWSJ>8Oy7EKNN+`#+i<;Z=w z0}BSjn461sFsfV&mM`X`mQqWc`7Csdz*Z=^JSTwgW0>|)uo)sBi5IX)Do8*lx6;`BiuWQj-|Vh z9)+xZ29wy=1<#*w^B9Egtz~1l35}Qzf;>WC9VM%vK;XN{QugQ57Vlpnroc%Xfu1eg zeMr#LcsA|0UrS_qYEo6 zE^Rj&T>W>}{!HH$0hqAuap%^@EPoaVrsa9j2VP0&;yDBR4I zM>oo|mq^1~ixX5-7Q2-GTyhdv{ZBL)>p2N{-B+h!T^B(haSyFaFbYnqy7y6Z zWwHP6atN=qCRnnwv*&{fReQ^a(dG-znsC{Z!0)ot8o`J%E%#g+xoPt<)+F)&kvGdY zT9|fWq{CotZtl$Jcfp(|z|x4@H>J|~EUp=_7UkyVI*w4wAmb6L?!|20PlmiH6*R%S zY=J*Sa(z9MS8+RYL9NIf1dJ|Nh@`0%pqHm+d5*3qduy3AE7U9zN4BrxGy3H`Y_J(w zRDw#u^v{9JH$ppXgSQ?n(3&*wcj^G0synm#Rsf4M4x_v#6s@0fUWLr=4hUd9*poGp zYnpY$KwFA%2Ovbc2+UC=0M3znMkw8>p{rH(`R>mSD85cuIysNVKp|wea-9Z(`tx> z+Z{VpE`K$HRBYh(Z5%?9egb1^q*sYhwcXxxB+oYKZtsymM5pjTHyJWHY8|VX`=R^% zrYu9=p@lpv1w|=RIBqj5x$VPiaEST|ta86-KGjcy3NLIx;DnxM`~MOAmRtsTqqkU) zfff&Nf>{S=KSmz3fl_iZ&_GMcnnL+F)S5Z7)6gD2XNk%o5^cogj@>hs+=MMz`@Ngh%z=>B#@|=W{^Uf+QSvQ)AWSq1^O}cm!LH^T!9X$-C>2wo?5-c zdbqqk)!znt2A7v|+2}P9L+|hn9B%~<-;CiaAZPOidz=xw&BJ4|=kmqvcGq-s`29<= z4`;_-5~|q0jgYf1bR#+y15}>@69eSRG7Rs~-u2!;Z5kL9)a+b2(tLK*C?v%A1g}iL z6J~k6yfQJCOroX<0y7AqOobL(B7v?Kr})UJ7XUvLzOUCUc+%3r>#k+JV> zO}cwI_#quoj~f@>sOdY4y5pbhWw0Hdk-Z&k&hX_Y+|7KNs)MSL^@aOeZB%D`}4rK7N5kG<(*H?f64Qs7Q`qv`A$Z zb#Gs|!e7|e8TvPF#Opy6>eT8)cB}5k5_ggM(YZ2Q{xAuMb2^xnd2m$sGWS3^y3A&m9Oa zf}8!7iugj6PGi56lI~@@Gl|BF&>mZ&Qj~VKqz43P=n~KQEn&>6s;aI6%w-l89uMrG zwcJSeddSKQ8hS%EA*J>ian|vqN=ogT7g#why@T;ecmO)u5GWUmRe@Fo4$agm6}b`t zG#bB%<@OH@+m5R#r2|K#)reY=6Thy(?ErNOIf`YYk@L%TOySDiTi))g?g( zNqSy@nzmLn2}#!e+;Y@lo_K7%RpIw`b8~nKr6r5|%)Ye-?8`cqwz1z`v9M`b}70x{iA?V z%W<_oPy#bL_g~_xBCQC%x|$jq+UBAYx6|ot+EpLN^&6FNBG<;e;fy^}rT0IkUI$;v zOwvhy`tqgbvsJ6uN_DiYNXZ)h@!}-YTytqy-Y5eGsi%Da+KX7Ub`TIJTVRM@W)$r ziL#?AuS6ldWuNIOYaQRiuCUvErsyF^aKa*sKVQGJu$6AGs;=LOz<^L1}FD znE7(IYiCL*^|5VzlnzQD8yZ274xIfl+p_5|Akx=Cd(Ed0VSABkDFYPuiojtaypP+t$c9oXvecuo*MO`$)1TkNC@l#xjm0W(b0xOf!I5S~&s5Nu}(LidAtU6HzEA~Kx?oje(LIBDM z#YjICgf$u2B5hWZN0Xl0^_X8e-klI-pc2Vf{llw;^;63T^&Q#AcV>?VLCTV_>vGPF zH=Bgv*-@^?IH?(s?$uFK^CD?NI+~pEbZ{2RtX8Zwe-kbLGEbGD2EUu>d+sI=w7O$k z)~%7Aa#PU)vNA~sd(Ov#$~igQ9!6dA2&!X=e(bRSpVLQxL3%PSh z)|$0zGx@b$&p=cZe(p2yUXYN{!Qg154WsUp{S_vzrQAkOToSxAKXcL1chB81Svfhw z$&{+Ko}QjO^{5A^N@_&a8{v#x1e?kCHe+D)hrtQ!r-YZ{)U{tLRe z;v0|$eP0mFO-mRbjS7)ZNl0W{`=y5J6%8$nTX}WwaiZxaSa*%C0{0dL6X93ams0zc z&|hhdvpg28x~6xE{O9_7i7t9z5Qj~W} z!yA`f;}c%0pfZP5D@Sqq(S;_nEu~V1CCiy657-T z9+0pI=@sJ^A)SPx8W7BEi+-KQ$%j>mwaE37~f}MIsUguOP829Vd zjgg*De6;>8BGJAY{#Nf{zV`d!Z_o7$o=<)s95rQW_xv(1UT XxWMzopx~k7D)^(Lt*@1%Vd?XK1gFZl literal 0 HcmV?d00001 diff --git a/docs/images/device-onboarding-4.0-Sync Device Job.png b/docs/images/device-onboarding-4.0-Sync Device Job.png new file mode 100755 index 0000000000000000000000000000000000000000..1048aa9342b5eb82729406a400454bd1edb0bfd5 GIT binary patch literal 231857 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 z

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 z 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%0D^9xr)F|~=U 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 a!3p6?@1Nd!-{dy||LA(#bhC7J2mc=wJP>aH literal 0 HcmV?d00001 diff --git a/docs/images/device-onboarding-4.0-Sync Network Data Job.png b/docs/images/device-onboarding-4.0-Sync Network Data Job.png new file mode 100755 index 0000000000000000000000000000000000000000..e7ed9cc3152e743e1eb3965eaad968c6cd19ec1e GIT binary patch literal 321418 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⁡uP<sARM;xxUY@bT+SkhsrYzir8ej@7nZv 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

~9Gd5` zr&I~l6#Bgo9%1#quLAp=KOEWhW{S6Agbba6qLX@d02k$l$0Px^oD!2)*S8U~cox<_WWHH|~fk#NIEzGRN`#cko;% zaQw~yKq`BPi$N%87csnZXIR(5!J|(mH6wCx*(C7b{ummHNB_WDlDu(Sz-Urj2yqJ* zz)r(Y5xb1>@Daei#)zL3XtTU6VB@Q}w7*(VGJK8<-?sGE)i}_L|M#VBogQ57NSS`b z=R{)P3oWS|GR?CtAjlg+N%?Q)r^DSWm8fh*U0bMCqjN0acW z0+sqH=%_@CS}F>Kp_tb3*6~k!pHQ3&=*T7N)5XYS!4xbj65zlp>l4pGe}n2> zABFHG=>PVJvm^F5Xnv_ia$5`bq~)#BX>DkJn20~Hk4e&nj{KVncPDt7%96&DWnurs zh8`I$HrmX9K6O9-ww+w09|Q-v19O3H$Rg6QG9GLbkpGV!7qz#({2jG0gqd~%*N1H4 z1ESV!iB`Ofcz0Njcn-P!P}1BL;W{^7M@`WW>r1W?2;>xj{yr3(ASW! zD!PY%KSiDge;socg;!JWqyul`3?xtHW_$v!X^wn3)GH*6M>O*79pRzb+$WFdvna+0 z?*6;~n4&z0@KnT<8yG{qjFPwFHO+9|nlYAC#Lka>#1~L}1B&x9Vs|NZp)y*!(zYm* zT}PZU-|kKkAv|0;upNgxX7X!~B(s3UX+^euw($NruTdNl7?e75!hBO2KHIuqGTat5 zU*5iTGm>K8s_(tMy!6n}yoa4NfUL-+?NuFsUnxRJEA{5nK{O48Su%0jnEY}7KN$tQ z#PLiVhixOH28TtBa9$pqH!It?So2*zD~G+*vFr_;o|m^x2~Q?ukA=5FS3M7`Zz#XID*EwOVT>SEo@pU9Z&% zR4E~V4d1b=xGlC#NRR*|Q_Cuwd0QVzHj&wQK!&r1zvWb>lS{ zij~t*ssUn|t9DVoG)r%6^CrL?ufUfFCEjj+t|Ozl6S*(02zRzzcdr;P>SKEWM!J_6 zodL?wSKME)eqhmb7tpTzP$uOQ)?i~c8LU6`QV$|6*%zP#esOl4|JuK>CZNgI`20Y1 zI>lyP$%zPS?=LYa=y3t4qP`xW3IgNcOLK-wXC8JQV)L!Ac8R{Y=VnIRlk_VSb_KCg zqZ8$R_4{2XzxoVALzI7F_>&kc3<>iXnGcCjy853ENFf;hv9F;nqkiq5H9~`l_zi^2 zj8l?Sv{$UW*;Fw!Pp-p|`wIlx>&o?^(Iv{}N(S@zsJF;t4|vVCmC<4Oc5?Mk{4Zu) za5}hPuYzh=SrsIbf(ov#M61@_qHcp?NVIm_RjuA={U}# z(0p$Ww$Crd%4^r&eX>!7emctcIY+HG730s{aXRXPco1^AUsU0HvBn2~qxoU9Pj2$x z$>?XqNnDg>U}g|Fy$|TnVCl1Q= zSABh{((?D6owi@Xsj;K*KEaQ2!@ui&?Cz*I>PBv!=vR!dNlo{Ojw9*wc`e)y<^Pjk`!B4@rCxtKgQ-=pbAzahB}HTxASRcz

KpF?tk5K5IoIa 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 JO%=1_{|EK_{gD6w literal 0 HcmV?d00001 diff --git a/docs/images/do_job_inputs.png b/docs/images/do_job_inputs.png deleted file mode 100644 index f62c262b89646190095f710eb9605411b1e53fe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80113 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%0D@=rn>9BIHzE;KVW-1cV2+27$+4P!n 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 MM_wXbOxyea0(6~Q2mk;8 literal 0 HcmV?d00001 diff --git a/docs/user/app_detailed_design.md b/docs/user/app_detailed_design.md index c3bf1d5f..ccfa3967 100755 --- a/docs/user/app_detailed_design.md +++ b/docs/user/app_detailed_design.md @@ -52,7 +52,8 @@ To learn how to extend the app, or update its default YAML definitions visit [Ex ## Detailed Design Diagram -Here are two diagrams detailing the SSoT based jobs in deeper detail. +Here are three diagrams detailing the SSoT based jobs in deeper detail. -![Sync Devices](). -![Sync Network Data](). +![C4 Onboarding Overview](../images/device-onboarding-4.0-Overview.png). +![Sync Devices](../images/device-onboarding-4.0-Sync%20Device%20Job.png). +![Sync Network Data](../images/device-onboarding-4.0-Sync%20Network%20Data%20Job.png). diff --git a/docs/user/app_getting_started.md b/docs/user/app_getting_started.md index e58b1748..0c012bed 100644 --- a/docs/user/app_getting_started.md +++ b/docs/user/app_getting_started.md @@ -38,6 +38,6 @@ Navigate to the SSoT dashboard and run `Sync Devices` to get basic device and in You can check out the [Use Cases](app_use_cases.md) section for more examples or try out the job inputs with at least the required fields. -![job input](../images/do_job_inputs.png) +![job input](../images/sync_devices_inputs.png) The Nautobot job will pass the job execution to the worker which will initiate an onboarding and will reach out to the device and attempt to onboard it. diff --git a/docs/user/app_overview.md b/docs/user/app_overview.md index b4758f3c..f054aa42 100644 --- a/docs/user/app_overview.md +++ b/docs/user/app_overview.md @@ -9,39 +9,7 @@ This [Nautobot](https://github.com/nautobot/nautobot) App allows to easily onboa ## Description/Overview -### Original Implementation - -!!! info - The original job and extensions pattern will remain a part of this App for the near future, this will allow custom extensions to continue working without causes issues to users that have taken the time and understand the original framework. The newer SSoT implementation will be discussed in the next section. - -The `nautobot-device-onboarding` app uses the [netmiko](https://github.com/ktbyers/netmiko) and [NAPALM](https://napalm.readthedocs.io/en/latest/) libraries to simplify the onboarding process of a new device into Nautobot down to, in many cases, an *IP Address* and a *Location*. In some cases, the user may also have to specify a specific *Device Platform* and *Device Port*. - -Regardless, the Onboarding App greatly simplifies the onboarding process by allowing the user to specify a small amount of info and having the app populate a much larger amount of device data in Nautobot. - -In most cases, the user would specify: - -- Device Name -- Location -- Platform * -- Transport Port * - -!!! note - * `Platform` and `Transport Port` are necessary for onboarding NXOS API, Arista EOS, or any other platform not using SSH as a transport. - -And the Onboarding App would populate the following: - -- Device Type (Model) - Creates it if it does not exist. -- Role - via a Role of content-type "dcim:device". Defaults to `network`. -- Platform - Creates Cisco IOS, Cisco NXOS (ssh), and Junos Platforms if they do not exist. -- Manufacturer - Creates Cisco/Juniper/Arista if it does not exist. -- Management Interface. -- Management Interface IP. -- Serial Number (when available). - -The goal of this app is not to import everything about a device into Nautobot. Rather, the goal is to quickly build an inventory of basic device data in Nautobot that provides basic info on how to access the devices. -For example, getting the Management IP and Platform data into Nautobot allows a follow-on tool that uses the basic info to access each device, retrieve data, and then populate Nautobot with that data. - -One example of a solution that can retrieve that additional device data and import it into Nautobot is the [Network Importer](https://github.com/networktocode/network-importer). Other options would include an Ansible playbook or a Python script. +This section descibes the new implementaiton (SSoT Implementation) and the Original implementation. ### New SSoT Implementation @@ -90,6 +58,40 @@ Additional References: - To understand the lower level details of how the Network-SSoT framework is designed see [Network-SSoT Design](./app_detailed_design.md) - To learn how to add additonal platform/OS support visit [Extending](./external_interactions.md). +### Original Implementation + +!!! info + The original job and extensions pattern will remain a part of this App for the near future, this will allow custom extensions to continue working without causes issues to users that have taken the time and understand the original framework. The newer SSoT implementation will be discussed in the next section. + +The `nautobot-device-onboarding` app uses the [netmiko](https://github.com/ktbyers/netmiko) and [NAPALM](https://napalm.readthedocs.io/en/latest/) libraries to simplify the onboarding process of a new device into Nautobot down to, in many cases, an *IP Address* and a *Location*. In some cases, the user may also have to specify a specific *Device Platform* and *Device Port*. + +Regardless, the Onboarding App greatly simplifies the onboarding process by allowing the user to specify a small amount of info and having the app populate a much larger amount of device data in Nautobot. + +In most cases, the user would specify: + +- Device Name +- Location +- Platform * +- Transport Port * + +!!! note + * `Platform` and `Transport Port` are necessary for onboarding NXOS API, Arista EOS, or any other platform not using SSH as a transport. + +And the Onboarding App would populate the following: + +- Device Type (Model) - Creates it if it does not exist. +- Role - via a Role of content-type "dcim:device". Defaults to `network`. +- Platform - Creates Cisco IOS, Cisco NXOS (ssh), and Junos Platforms if they do not exist. +- Manufacturer - Creates Cisco/Juniper/Arista if it does not exist. +- Management Interface. +- Management Interface IP. +- Serial Number (when available). + +The goal of this app is not to import everything about a device into Nautobot. Rather, the goal is to quickly build an inventory of basic device data in Nautobot that provides basic info on how to access the devices. +For example, getting the Management IP and Platform data into Nautobot allows a follow-on tool that uses the basic info to access each device, retrieve data, and then populate Nautobot with that data. + +One example of a solution that can retrieve that additional device data and import it into Nautobot is the [Network Importer](https://github.com/networktocode/network-importer). Other options would include an Ansible playbook or a Python script. + ## Audience (User Personas) - Who should use this App? The Onboarding App is meant for new Nautobot users who want to start importing their devices directly rather than from another, existing, source. Even with other sources for device information, they may not include everything that is necessary. diff --git a/docs/user/app_use_cases.md b/docs/user/app_use_cases.md index 1c7d30d4..65d48c1a 100755 --- a/docs/user/app_use_cases.md +++ b/docs/user/app_use_cases.md @@ -60,14 +60,14 @@ The Onboarding App will automatically create Platforms for vendor operating syst ## Onboarding a Device -### Onboard a New Device +### Onboard a New Device Using Sync Devices From Network Job A new device can be onboarded via : -- A SSoT job execution. +- A SSoT job execution using the `Sync Devices from Network` job. - Via Jobs menu - Via SSoT Dashboard -- API, via a `POST` to `/api/extras/jobs/TODO/run` or `/api/extras/jobs/{id}/run` +- API, via a `POST` to `/api/extras/jobs/SSOTSyncDevices/run` or `/api/extras/jobs/{id}/run` !!! note The SSoT Job's ID (UUID) will be different per Nautobot instance. @@ -85,10 +85,10 @@ The status of onboarding jobs can be viewed via the UI (Jobs > Job Results) or r To run the SSoT Sync Devices Job via the api: -Post to `/api/extras/jobs/TODO/run/` with the relevent onboarding data: +Post to `/api/extras/jobs/SSOTSyncDevices/run/` with the relevent onboarding data: ```bash -curl -X "POST" /api/extras/jobs/TODO/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"location": "", "ip_address": "", "port": 22, "timeout": 30}} +curl -X "POST" /api/extras/jobs/SSOTSyncDevices/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"location": "", "ip_address": "", "port": 22, "timeout": 30}} ``` Required Fields: @@ -113,7 +113,7 @@ A existing devices data can be expanded to include additonal objects by: - A SSoT job execution. - Via Jobs menu - Via SSoT Dashboard -- API, via a `POST` to `/api/extras/jobs/TODO/run` or `/api/extras/jobs/{id}/run` +- API, via a `POST` to `/api/extras/jobs/SSOTSyncNetworkData/run` or `/api/extras/jobs/{id}/run` !!! note The SSoT Job's ID (UUID) will be different per Nautobot instance. @@ -126,13 +126,13 @@ The status of onboarding jobs can be viewed via the UI (Jobs > Job Results) or r ### API -To run the SSoT Sync Devices Job via the api: +To run the SSoT Sync Network Data Job via the api: -Post to `/api/extras/jobs/TODO/run/` with the relevent onboarding data: +Post to `/api/extras/jobs/SSOTSyncNetworkData/run/` with the relevent onboarding data: ```bash -curl -X "POST" /api/extras/jobs/TODO/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"devices": ""} +curl -X "POST" /api/extras/jobs/SSOTSyncNetworkData/run/ -H "Content-Type: application/json" -H "Authorization: Token $NAUTOBOT_TOKEN" -d '{"data": {"devices": ""} ``` Required Fields: diff --git a/docs/user/app_yaml_overrides.md b/docs/user/app_yaml_overrides.md index d86fdab6..34240bd9 100755 --- a/docs/user/app_yaml_overrides.md +++ b/docs/user/app_yaml_overrides.md @@ -12,6 +12,7 @@ There are only a few components to the file and they're described below: - `parser` - Whether to use a parser (textfsm, pyats, ttp, etc) alternatively `no` can be used if the platform supports some other method to return structured data. E.g. (`| display json`) or an equivalent. - `jpath` - The jmespath (specifically jdiffs implementation) to extract the data from the parsed json returned from parser. - `post_processor` - Jinja2 capable code to further transform the returned data post jpath extraction. +- `iterable_type` - A optional value to force a parsed result to a specific data type. As an example: diff --git a/mkdocs.yml b/mkdocs.yml index 68bb3d8b..2fa3f308 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -113,6 +113,7 @@ nav: - Compatibility Matrix: "admin/compatibility_matrix.md" - Release Notes: - "admin/release_notes/index.md" + - v4.0: "admin/release_notes/version_4.0.md" - v3.0: "admin/release_notes/version_3.0.md" - v2.0: "admin/release_notes/version_2.0.md" - v1.2: "admin/release_notes/version_1.2.md" diff --git a/nautobot_device_onboarding/command_mappers/arista_eos.yml b/nautobot_device_onboarding/command_mappers/arista_eos.yml index 9fcd995d..9636a4df 100755 --- a/nautobot_device_onboarding/command_mappers/arista_eos.yml +++ b/nautobot_device_onboarding/command_mappers/arista_eos.yml @@ -56,7 +56,6 @@ sync_network_data: commands: - command: "show interfaces | json" parser: "none" - # jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen},{ip_address: secondaryIps.address, prefix_length: secondaryIps.maskLen}][]' jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen }][]' # yamllint disable-line rule:quoted-strings post_processor: "{{ obj | tojson }}" interfaces__mtu: @@ -85,7 +84,8 @@ sync_network_data: commands: - command: "show interfaces switchport | json" parser: "none" - jpath: 'switchports."{{ current_key }}".switchportInfo.mode' # yamllint disable-line rule:quoted-strings + jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | interface_mode_logic }}" iterable_type: "str" interfaces__lag: commands: @@ -104,12 +104,12 @@ sync_network_data: commands: - command: "show interfaces switchport | json" parser: "none" - jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans}' # yamllint disable-line rule:quoted-strings - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans, native_vlan: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interfaces switchport | json" parser: "none" - jpath: '{id: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId, name: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanName}' # yamllint disable-line rule:quoted-strings - post_processor: "{{ obj | key_exist_or_default('id') | tojson }}" + jpath: '{admin_mode: switchports."{{ current_key }}".switchportInfo.mode, mode: switchports."{{ current_key }}".switchportInfo.mode, access_vlan: switchports."{{ current_key }}".switchportInfo.accessVlanId, trunking_vlans: switchports."{{ current_key }}".switchportInfo.trunkAllowedVlans, native_vlan: switchports."{{ current_key }}".switchportInfo.trunkingNativeVlanId}' # yamllint disable-line rule:quoted-strings + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index 93609a02..c6aa6ba8 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -43,6 +43,7 @@ sync_network_data: - command: "show version" parser: "textfsm" jpath: "[*].serial[]" + post_processor: "{{ obj | unique | first }}" interfaces: root_key: true commands: @@ -108,12 +109,12 @@ sync_network_data: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}" - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" - post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index d02336d0..996a09b8 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -25,9 +25,7 @@ sync_devices: - command: "show ip interface vrf all" parser: "textfsm" jpath: "[?ip_address=='{{ obj }}'].subnet" - # jpath: "*[].ROW_intf.{prefix: prefix, subnet:masklen} | [?prefix=='{{ obj }}'].subnet" post_processor: "{% if '/' in obj[0] %}{{ obj[0].split('/')[1] }}{% else %}31{% endif %}" - # post_processor: "{{ obj[0] | string }}" sync_network_data: pre_processor: vlan_map: @@ -42,7 +40,6 @@ sync_network_data: - command: "show inventory" parser: "textfsm" jpath: "[?name=='Chassis'].sn" - # jpath: "TABLE_inv.ROW_inv[?name == 'Chassis'].serialnum" interfaces: root_key: true commands: @@ -108,12 +105,12 @@ sync_network_data: commands: - command: "show interface switchport" parser: "textfsm" - jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS}" - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS, native_vlan: NATIVE_VLAN}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interface switchport" parser: "textfsm" - jpath: "[?contains(INTERFACE, '{{ current_key }}')].NATIVE_VLAN" - post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS, native_vlan: NATIVE_VLAN}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml index 93609a02..c6aa6ba8 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_xe.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -43,6 +43,7 @@ sync_network_data: - command: "show version" parser: "textfsm" jpath: "[*].serial[]" + post_processor: "{{ obj | unique | first }}" interfaces: root_key: true commands: @@ -108,12 +109,12 @@ sync_network_data: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}" - post_processor: "{{ obj | get_vlan_data(vlan_map) | tojson }}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" interfaces__untagged_vlan: commands: - command: "show interfaces switchport" parser: "textfsm" - jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" - post_processor: "{% if obj | length > 0 %}{{ {'id': obj[0], 'name': vlan_map[obj[0]]} | tojson }}{% else %}{{ obj }}{% endif %}" + jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" diff --git a/nautobot_device_onboarding/jinja_filters.py b/nautobot_device_onboarding/jinja_filters.py index 6d80f878..160859d2 100755 --- a/nautobot_device_onboarding/jinja_filters.py +++ b/nautobot_device_onboarding/jinja_filters.py @@ -79,7 +79,12 @@ def _interface_mode_logic(dict_item): # pylint: disable=too-many-return-stateme if "dynamic" in dict_item["admin_mode"]: if "access" in dict_item["mode"]: return "access" - if dict_item["mode"] == "trunk" and dict_item["trunking_vlans"] in ["ALL", "1-4094", ["ALL"], ["1-4094"]]: + if dict_item["mode"] in ["trunk", "down"] and dict_item["trunking_vlans"] in [ + "ALL", + "1-4094", + ["ALL"], + ["1-4094"], + ]: return "tagged-all" if dict_item["mode"] == "trunk": return "tagged" @@ -93,20 +98,29 @@ def interface_mode_logic(item): # pylint: disable=too-many-return-statements return _interface_mode_logic(item) if len(item) == 1: return _interface_mode_logic(item[0]) - return "" + return item @library.filter -def get_vlan_data(item, vlan_mapping): +def get_vlan_data(item, vlan_mapping, tag_type): # pylint: disable=too-many-return-statements """Get vlan information from an item.""" - int_mode = interface_mode_logic(item) current_item = item if isinstance(item, list) and len(item) == 1: current_item = item[0] - if current_item: - if int_mode: - if int_mode == "tagged-all": - return [] + int_mode = interface_mode_logic(item) + if int_mode == "tagged-all" and tag_type == "tagged": + return [] + if int_mode == "tagged-all" and tag_type == "untagged": + return [ + { + "id": current_item["native_vlan"], + "name": vlan_mapping.get( + str(current_item["native_vlan"]), f"VLAN{str(current_item['native_vlan']).zfill(4)}" + ), + } + ] + if current_item and int_mode: + if tag_type == "untagged": if int_mode == "access": if current_item.get("access_vlan"): return [ @@ -117,6 +131,18 @@ def get_vlan_data(item, vlan_mapping): ), } ] + vid = current_item["native_vlan"] + if not vid: + vid = "1" + return [ + { + "id": vid, + "name": vlan_mapping.get(str(vid), f"VLAN{str(vid).zfill(4)}"), + } + ] + if tag_type == "tagged": + if int_mode == "access": + return [] if not isinstance(current_item["trunking_vlans"], list): trunk_vlans = [current_item["trunking_vlans"]] else: diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 5dcba0e2..4df60113 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -531,8 +531,7 @@ class Meta: description = "Synchronize extended device attribute information into Nautobot from one or more network devices. Information includes Interfaces, IPAddresses, Prefixes, and Vrfs." debug = BooleanVar(description="Enable for more verbose logging.") - sync_vlans = BooleanVar( - default=False, description="Sync VLANs and interface VLAN assignments.") + sync_vlans = BooleanVar(default=False, description="Sync VLANs and interface VLAN assignments.") sync_vrfs = BooleanVar(default=False, description="Sync VRFs and interface VRF assignments.") namespace = ObjectVar( model=Namespace, required=True, description="The namespace for all IP addresses created or updated in the sync." diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json index 95c5fb0b..758d4c33 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json @@ -36,7 +36,7 @@ "type": "1000base-t" }, "Ethernet4": { - "802.1Q_mode": "trunk", + "802.1Q_mode": "tagged", "description": [], "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json index f8a1cc64..4b3fe8c0 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json @@ -25,12 +25,7 @@ "link_status": "True", "mac_address": "52:54:00:15:b8:13", "mtu": 9214, - "tagged_vlans": [ - { - "id": 1, - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": 1, @@ -45,12 +40,7 @@ "link_status": "True", "mac_address": "52:54:00:07:8d:69", "mtu": 9214, - "tagged_vlans": [ - { - "id": 1, - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": 1, @@ -58,7 +48,7 @@ } }, "Ethernet4": { - "802.1Q_mode": "trunk", + "802.1Q_mode": "tagged", "description": [], "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json index b756789d..7cb38097 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json @@ -41,7 +41,7 @@ "vrf": {} }, "Ethernet4": { - "802.1Q_mode": "trunk", + "802.1Q_mode": "tagged", "description": [], "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json new file mode 100755 index 00000000..ab9133bb --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/command_getter_result_2.json @@ -0,0 +1,914 @@ +{ + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "90", + "vlan_name": "VLAN0090", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "239", + "vlan_name": "VLAN0239", + "status": "active", + "interfaces": [ + "Gi0/1", + "Gi0/2", + "Gi0/3", + "Gi0/4", + "Gi0/5", + "Gi0/6", + "Gi0/7", + "Gi0/8", + "Gi0/9" + ] + }, + { + "vlan_id": "255", + "vlan_name": "v255", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "955", + "vlan_name": "v955", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "1002", + "vlan_name": "fddi-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1003", + "vlan_name": "token-ring-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1004", + "vlan_name": "fddinet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1005", + "vlan_name": "trnet-default", + "status": "act/unsup", + "interfaces": [] + } + ], + "show version": [ + { + "software_image": "C3560c405ex-UNIVERSALK9-M", + "version": "15.0(2)SE8", + "release": "fc1", + "rommon": "Bootstrap", + "hostname": "3560-01", + "uptime": "1 year, 23 weeks, 6 days, 10 hours, 48 minutes", + "uptime_years": "1", + "uptime_weeks": "23", + "uptime_days": "6", + "uptime_hours": "10", + "uptime_minutes": "48", + "reload_reason": "power-on", + "running_image": "/c3560c405ex-universalk9-mz.150-2.SE8/c3560c405ex-universalk9-mz.150-2.SE8.bin", + "hardware": [ + "WS-C3560CG-8PC-S" + ], + "serial": [ + "FOC1541W2SP" + ], + "config_register": "0xF", + "mac_address": [ + "2C:3F:38:99:15:00" + ], + "restarted": "14:57:03 UTC Thu Dec 22 2022" + } + ], + "show interfaces": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "EtherSVI", + "mac_address": "2c3f.3899.1540", + "bia": "2c3f.3899.1540", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan255", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "2c3f.3899.1541", + "bia": "2c3f.3899.1541", + "description": "", + "ip_address": "10.35.255.75", + "prefix_length": "24", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:02", + "last_output": "01:39:59", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "22819901", + "output_packets": "3049", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "2c3f.3899.1542", + "bia": "2c3f.3899.1542", + "description": "", + "ip_address": "198.51.100.1", + "prefix_length": "27", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "1000", + "output_rate": "2000", + "input_pps": "1", + "output_pps": "1", + "input_packets": "73202704", + "output_packets": "69356133", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1501", + "bia": "2c3f.3899.1501", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "1000", + "input_pps": "0", + "output_pps": "1", + "input_packets": "29688889", + "output_packets": "83895657", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/2", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1502", + "bia": "2c3f.3899.1502", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "133000", + "output_rate": "7000", + "input_pps": "17", + "output_pps": "13", + "input_packets": "1093822263", + "output_packets": "735080587", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/3", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1503", + "bia": "2c3f.3899.1503", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "92000", + "output_rate": "6000", + "input_pps": "13", + "output_pps": "11", + "input_packets": "694320395", + "output_packets": "572920151", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/4", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1504", + "bia": "2c3f.3899.1504", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "100Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "145000", + "output_rate": "8000", + "input_pps": "19", + "output_pps": "14", + "input_packets": "874533402", + "output_packets": "662307510", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/5", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1505", + "bia": "2c3f.3899.1505", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:17", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "1916000", + "output_rate": "19000", + "input_pps": "154", + "output_pps": "36", + "input_packets": "929711050", + "output_packets": "290370091", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1506", + "bia": "2c3f.3899.1506", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1507", + "bia": "2c3f.3899.1507", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "11w2d", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "38", + "output_packets": "75", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/8", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1508", + "bia": "2c3f.3899.1508", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.1509", + "bia": "2c3f.3899.1509", + "description": "", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "Not Present", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet0/10", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "2c3f.3899.150a", + "bia": "2c3f.3899.150a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "65000", + "output_rate": "2319000", + "input_pps": "109", + "output_pps": "209", + "input_packets": "3816965695", + "output_packets": "3762396995", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + } + ], + "show interfaces switchport": [ + { + "interface": "Gi0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "239", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + } + ], + "show etherchannel summary": [], + "show ip interface": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan255", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "10.35.255.75" + ], + "prefix_length": [ + "24" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "198.51.100.1" + ], + "prefix_length": [ + "27" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/2", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/3", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/4", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/5", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet0/10", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json new file mode 100755 index 00000000..bc117064 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_devices/expected_result_2.json @@ -0,0 +1,7 @@ +{ + "device_type": "WS-C3560CG-8PC-S", + "hostname": "3560-01", + "mask_length": 27, + "mgmt_interface": "Vlan955", + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_all/expected_result_2.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json index b14ca27c..d4e5073b 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json @@ -16,7 +16,7 @@ "type": "1000base-t" }, "GigabitEthernet0/10": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -31,7 +31,7 @@ "type": "1000base-t" }, "GigabitEthernet0/11": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -46,7 +46,7 @@ "type": "1000base-t" }, "GigabitEthernet0/12": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -61,7 +61,7 @@ "type": "1000base-t" }, "GigabitEthernet0/13": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -76,7 +76,7 @@ "type": "1000base-t" }, "GigabitEthernet0/14": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -106,7 +106,7 @@ "type": "1000base-t" }, "GigabitEthernet0/16": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -166,7 +166,7 @@ "type": "1000base-t" }, "GigabitEthernet0/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -181,7 +181,7 @@ "type": "1000base-t" }, "GigabitEthernet0/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -196,7 +196,7 @@ "type": "1000base-t" }, "GigabitEthernet0/7": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -211,7 +211,7 @@ "type": "1000base-t" }, "GigabitEthernet0/8": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -226,7 +226,7 @@ "type": "1000base-t" }, "GigabitEthernet0/9": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json new file mode 100755 index 00000000..9b4c9258 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json @@ -0,0 +1,200 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json index ca790922..b260338e 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_1.json @@ -13,20 +13,15 @@ "link_status": "True", "mac_address": "6c71.0d1d.3581", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/10": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -46,7 +41,7 @@ } }, "GigabitEthernet0/11": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -66,7 +61,7 @@ } }, "GigabitEthernet0/12": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -86,7 +81,7 @@ } }, "GigabitEthernet0/13": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -106,7 +101,7 @@ } }, "GigabitEthernet0/14": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -183,7 +178,7 @@ } }, "GigabitEthernet0/16": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -215,16 +210,11 @@ "link_status": "True", "mac_address": "6c71.0d1d.3582", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/3": { @@ -240,16 +230,11 @@ "link_status": "True", "mac_address": "6c71.0d1d.3583", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/4": { @@ -265,20 +250,15 @@ "link_status": "True", "mac_address": "6c71.0d1d.3584", "mtu": "1500", - "tagged_vlans": [ - { - "id": "100", - "name": "VLAN0100" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "100", + "name": "VLAN0100" } }, "GigabitEthernet0/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -298,7 +278,7 @@ } }, "GigabitEthernet0/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -318,7 +298,7 @@ } }, "GigabitEthernet0/7": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -338,7 +318,7 @@ } }, "GigabitEthernet0/8": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -358,7 +338,7 @@ } }, "GigabitEthernet0/9": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json new file mode 100755 index 00000000..a215066d --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vlans/expected_result_2.json @@ -0,0 +1,256 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "239", + "name": "VLAN0239" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + } + }, + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json index 96962297..4f9f3159 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_1.json @@ -17,7 +17,7 @@ "vrf": {} }, "GigabitEthernet0/10": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -33,7 +33,7 @@ "vrf": {} }, "GigabitEthernet0/11": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -49,7 +49,7 @@ "vrf": {} }, "GigabitEthernet0/12": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -65,7 +65,7 @@ "vrf": {} }, "GigabitEthernet0/13": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -81,7 +81,7 @@ "vrf": {} }, "GigabitEthernet0/14": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -113,7 +113,7 @@ "vrf": {} }, "GigabitEthernet0/16": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -177,7 +177,7 @@ "vrf": {} }, "GigabitEthernet0/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -193,7 +193,7 @@ "vrf": {} }, "GigabitEthernet0/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -209,7 +209,7 @@ "vrf": {} }, "GigabitEthernet0/7": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -225,7 +225,7 @@ "vrf": {} }, "GigabitEthernet0/8": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { @@ -241,7 +241,7 @@ "vrf": {} }, "GigabitEthernet0/9": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json new file mode 100755 index 00000000..72f72c85 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_vrfs/expected_result_2.json @@ -0,0 +1,213 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "type": "virtual", + "vrf": {} + } + }, + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json index a2f656d5..a187166b 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_vlans/expected_result_1.json @@ -10,10 +10,7 @@ "mtu": "1500", "tagged_vlans": [], "type": "1000base-t", - "untagged_vlan": { - "id": "1", - "name": "default" - } + "untagged_vlan": {} }, "Ethernet1/1.1": { "802.1Q_mode": "", @@ -76,12 +73,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f6", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -96,12 +88,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f7", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -116,12 +103,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f8", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -136,12 +118,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99f9", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -156,12 +133,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fa", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -176,12 +148,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fb", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -196,12 +163,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fc", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -216,12 +178,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fd", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -236,12 +193,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99fe", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -258,10 +210,7 @@ "mtu": "1500", "tagged_vlans": [], "type": "1000base-t", - "untagged_vlan": { - "id": "1", - "name": "default" - } + "untagged_vlan": {} }, "Ethernet1/2.1": { "802.1Q_mode": "", @@ -288,12 +237,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99ff", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -308,12 +252,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a00", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -328,16 +267,11 @@ "link_status": "False", "mac_address": "286f.7f7e.9a01", "mtu": "1500", - "tagged_vlans": [ - { - "id": "136", - "name": "vlan136" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "136", + "name": "vlan136" } }, "Ethernet1/23": { @@ -392,16 +326,11 @@ "link_status": "True", "mac_address": "286f.7f7e.9a03", "mtu": "1500", - "tagged_vlans": [ - { - "id": "67", - "name": "vlan67" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "67", + "name": "vlan67" } }, "Ethernet1/25": { @@ -1014,12 +943,7 @@ "link_status": "False", "mac_address": "286f.7f7e.99ef", "mtu": "9216", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { "id": "1", @@ -1322,12 +1246,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1c", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1342,16 +1261,11 @@ "link_status": "False", "mac_address": "286f.7f7e.99f0", "mtu": "1500", - "tagged_vlans": [ - { - "id": "200", - "name": "data" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "200", + "name": "data" } }, "Ethernet1/50": { @@ -1362,12 +1276,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1d", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1382,12 +1291,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1e", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1402,12 +1306,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a1f", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1442,12 +1341,7 @@ "link_status": "False", "mac_address": "286f.7f7e.9a21", "mtu": "1500", - "tagged_vlans": [ - { - "id": "1", - "name": "default" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { "id": "1", @@ -1462,16 +1356,11 @@ "link_status": "True", "mac_address": "286f.7f7e.99f1", "mtu": "1500", - "tagged_vlans": [ - { - "id": "201", - "name": "fw" - } - ], + "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "201", + "name": "fw" } }, "Ethernet1/7": { @@ -2496,16 +2385,11 @@ "link_status": "True", "mac_address": "286f.7f7e.99f1", "mtu": "1500", - "tagged_vlans": [ - { - "id": "201", - "name": "fw" - } - ], + "tagged_vlans": [], "type": "lag", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "201", + "name": "fw" } }, "port-channel7": { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json new file mode 100755 index 00000000..bff659be --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/command_getter_result_2.json @@ -0,0 +1,7559 @@ +{ + "show vlan": [ + { + "vlan_id": "1", + "vlan_name": "default", + "status": "active", + "interfaces": [ + "Te1/0/2", + "Te2/0/2" + ] + }, + { + "vlan_id": "11", + "vlan_name": "v11", + "status": "active", + "interfaces": [ + "Gi1/0/1", + "Gi1/0/2", + "Gi1/0/3", + "Gi1/0/4", + "Gi1/0/5", + "Gi1/0/6", + "Gi1/0/7", + "Gi1/0/8", + "Gi1/0/9", + "Gi1/0/10", + "Gi1/0/11", + "Gi1/0/12", + "Gi1/0/13", + "Gi1/0/14", + "Gi1/0/15", + "Gi1/0/16", + "Gi1/0/17", + "Gi1/0/18", + "Gi1/0/19", + "Gi1/0/20", + "Gi1/0/21", + "Gi1/0/22", + "Gi1/0/23", + "Gi1/0/24", + "Gi1/0/25", + "Gi1/0/26", + "Gi1/0/27", + "Gi1/0/28", + "Gi1/0/29", + "Gi1/0/30", + "Gi1/0/31", + "Gi1/0/32", + "Gi1/0/33", + "Gi1/0/34", + "Gi1/0/35", + "Gi1/0/36", + "Gi1/0/37", + "Gi1/0/38", + "Gi1/0/39", + "Gi1/0/40", + "Gi1/0/41", + "Gi1/0/42", + "Gi1/0/43", + "Gi1/0/44", + "Gi1/0/46", + "Gi1/0/48", + "Gi2/0/1", + "Gi2/0/2", + "Gi2/0/3", + "Gi2/0/4", + "Gi2/0/5", + "Gi2/0/6", + "Gi2/0/7", + "Gi2/0/8", + "Gi2/0/9", + "Gi2/0/10", + "Gi2/0/11", + "Gi2/0/12", + "Gi2/0/13", + "Gi2/0/14", + "Gi2/0/15", + "Gi2/0/16", + "Gi2/0/17", + "Gi2/0/18", + "Gi2/0/19", + "Gi2/0/20", + "Gi2/0/21", + "Gi2/0/22", + "Gi2/0/23", + "Gi2/0/24", + "Gi2/0/25", + "Gi2/0/26", + "Gi2/0/27", + "Gi2/0/28", + "Gi2/0/29", + "Gi2/0/30", + "Gi2/0/31", + "Gi2/0/32", + "Gi2/0/33", + "Gi2/0/34", + "Gi2/0/35", + "Gi2/0/36", + "Gi2/0/37", + "Gi2/0/38", + "Gi2/0/39", + "Gi2/0/40", + "Gi2/0/41", + "Gi2/0/42", + "Gi2/0/43", + "Gi2/0/44", + "Gi2/0/45", + "Gi2/0/46", + "Gi2/0/47", + "Gi2/0/48" + ] + }, + { + "vlan_id": "12", + "vlan_name": "v12", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "13", + "vlan_name": "vl13", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "14", + "vlan_name": "vlan14", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "19", + "vlan_name": "vlan19", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "41", + "vlan_name": "vid41", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "50", + "vlan_name": "voice", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "60", + "vlan_name": "v60", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "80", + "vlan_name": "vlanname80", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "90", + "vlan_name": "v90", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "91", + "vlan_name": "v91", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "97", + "vlan_name": "vlan_97", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "98", + "vlan_name": "vlan_98", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "99", + "vlan_name": "vlan_99", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "111", + "vlan_name": "data", + "status": "active", + "interfaces": [ + "Gi1/0/6", + "Gi1/0/8", + "Gi1/0/11", + "Gi1/0/14", + "Gi1/0/17", + "Gi1/0/23", + "Gi1/0/26", + "Gi1/0/28", + "Gi1/0/32", + "Gi1/0/34", + "Gi1/0/36", + "Gi1/0/38", + "Gi1/0/40", + "Gi1/0/42", + "Gi1/0/44", + "Gi1/0/46", + "Gi1/0/48", + "Gi2/0/1", + "Gi2/0/2", + "Gi2/0/3", + "Gi2/0/4", + "Gi2/0/5", + "Gi2/0/6", + "Gi2/0/7", + "Gi2/0/8", + "Gi2/0/9", + "Gi2/0/10", + "Gi2/0/11", + "Gi2/0/12", + "Gi2/0/13", + "Gi2/0/14", + "Gi2/0/15", + "Gi2/0/16", + "Gi2/0/17", + "Gi2/0/18", + "Gi2/0/19", + "Gi2/0/20", + "Gi2/0/21", + "Gi2/0/22", + "Gi2/0/23", + "Gi2/0/24", + "Gi2/0/25", + "Gi2/0/26", + "Gi2/0/27", + "Gi2/0/28", + "Gi2/0/29", + "Gi2/0/30", + "Gi2/0/31", + "Gi2/0/32", + "Gi2/0/33", + "Gi2/0/34", + "Gi2/0/35", + "Gi2/0/36", + "Gi2/0/37", + "Gi2/0/38", + "Gi2/0/39", + "Gi2/0/40", + "Gi2/0/41", + "Gi2/0/42", + "Gi2/0/43", + "Gi2/0/44", + "Gi2/0/45", + "Gi2/0/46", + "Gi2/0/47", + "Gi2/0/48" + ] + }, + { + "vlan_id": "112", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "113", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "114", + "vlan_name": "data", + "status": "aFctive", + "interfaces": [] + }, + { + "vlan_id": "119", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "145", + "vlan_name": "data", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "160", + "vlan_name": "v160", + "status": "active", + "interfaces": [ + "Gi1/0/1", + "Gi1/0/2", + "Gi1/0/3", + "Gi1/0/4", + "Gi1/0/5", + "Gi1/0/7", + "Gi1/0/9", + "Gi1/0/10", + "Gi1/0/12", + "Gi1/0/13", + "Gi1/0/15", + "Gi1/0/16", + "Gi1/0/18", + "Gi1/0/19", + "Gi1/0/20", + "Gi1/0/21", + "Gi1/0/22", + "Gi1/0/24", + "Gi1/0/25", + "Gi1/0/27", + "Gi1/0/29", + "Gi1/0/30", + "Gi1/0/31", + "Gi1/0/33", + "Gi1/0/35", + "Gi1/0/37", + "Gi1/0/39", + "Gi1/0/41", + "Gi1/0/43" + ] + }, + { + "vlan_id": "200", + "vlan_name": "vlan200", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "235", + "vlan_name": "vlan235", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "239", + "vlan_name": "v239", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "242", + "vlan_name": "storage", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "243", + "vlan_name": "storage", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "244", + "vlan_name": "mgmt", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "250", + "vlan_name": "internet", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "255", + "vlan_name": "v255", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "600", + "vlan_name": "v600", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "700", + "vlan_name": "FW", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "939", + "vlan_name": "v939", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "955", + "vlan_name": "vlan955", + "status": "active", + "interfaces": [] + }, + { + "vlan_id": "1002", + "vlan_name": "fddi-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1003", + "vlan_name": "trcrf-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1004", + "vlan_name": "fddinet-default", + "status": "act/unsup", + "interfaces": [] + }, + { + "vlan_id": "1005", + "vlan_name": "trbrf-default", + "status": "act/unsup", + "interfaces": [] + } + ], + "show version": [ + { + "software_image": "C2960X-UNIVERSALK9-M", + "version": "15.2(4)E9", + "release": "fc2", + "rommon": "Bootstrap", + "hostname": "2960-01", + "uptime": "8 weeks, 2 days, 10 hours, 32 minutes", + "uptime_years": "", + "uptime_weeks": "8", + "uptime_days": "2", + "uptime_hours": "10", + "uptime_minutes": "32", + "reload_reason": "power-on", + "running_image": "c2960x-universalk9-mz.152-4.E9.bin", + "hardware": [ + "WS-C2960X-48FPD-L", + "WS-C2960X-48FPD-L" + ], + "serial": [ + "FJC2304W0BB", + "FJC2304W0BA" + ], + "config_register": "0xF", + "mac_address": [ + "D0:EC:35:07:CC:80", + "D0:EC:35:07:CF:00" + ], + "restarted": "12:56:08 UTC Tue Apr 9 2024" + } + ], + "show interfaces": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc0", + "bia": "d0ec.3507.ccc0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "07:08:47", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "39727", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan41", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc1", + "bia": "d0ec.3507.ccc1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:01", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "2402278", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan255", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc2", + "bia": "d0ec.3507.ccc2", + "description": "a description", + "ip_address": "10.60.255.59", + "prefix_length": "24", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "hardware_type": "EtherSVI", + "mac_address": "d0ec.3507.ccc3", + "bia": "d0ec.3507.ccc3", + "description": "a description", + "ip_address": "198.51.100.1", + "prefix_length": "27", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "13000", + "output_rate": "24000", + "input_pps": "9", + "output_pps": "8", + "input_packets": "43261775", + "output_packets": "42012824", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "FastEthernet0", + "link_status": "administratively down", + "protocol_status": "down", + "hardware_type": "APM86XXX FastEthernet", + "mac_address": "d0ec.3507.ccb9", + "bia": "d0ec.3507.ccb9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "100000 Kbit", + "delay": "100 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/1", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf01", + "bia": "d0ec.3507.cf01", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf02", + "bia": "d0ec.3507.cf02", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/3", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf03", + "bia": "d0ec.3507.cf03", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/4", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf04", + "bia": "d0ec.3507.cf04", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/5", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf05", + "bia": "d0ec.3507.cf05", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf06", + "bia": "d0ec.3507.cf06", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf07", + "bia": "d0ec.3507.cf07", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/8", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf08", + "bia": "d0ec.3507.cf08", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf09", + "bia": "d0ec.3507.cf09", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/10", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0a", + "bia": "d0ec.3507.cf0a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/11", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0b", + "bia": "d0ec.3507.cf0b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/12", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0c", + "bia": "d0ec.3507.cf0c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/13", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0d", + "bia": "d0ec.3507.cf0d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/14", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0e", + "bia": "d0ec.3507.cf0e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/15", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf0f", + "bia": "d0ec.3507.cf0f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/16", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf10", + "bia": "d0ec.3507.cf10", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/17", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf11", + "bia": "d0ec.3507.cf11", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/18", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf12", + "bia": "d0ec.3507.cf12", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/19", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf13", + "bia": "d0ec.3507.cf13", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/20", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf14", + "bia": "d0ec.3507.cf14", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/21", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf15", + "bia": "d0ec.3507.cf15", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/22", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf16", + "bia": "d0ec.3507.cf16", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/23", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf17", + "bia": "d0ec.3507.cf17", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/24", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf18", + "bia": "d0ec.3507.cf18", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/25", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf19", + "bia": "d0ec.3507.cf19", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/26", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1a", + "bia": "d0ec.3507.cf1a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/27", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1b", + "bia": "d0ec.3507.cf1b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/28", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1c", + "bia": "d0ec.3507.cf1c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/29", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1d", + "bia": "d0ec.3507.cf1d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/30", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1e", + "bia": "d0ec.3507.cf1e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/31", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf1f", + "bia": "d0ec.3507.cf1f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/32", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf20", + "bia": "d0ec.3507.cf20", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/33", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf21", + "bia": "d0ec.3507.cf21", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/34", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf22", + "bia": "d0ec.3507.cf22", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/35", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf23", + "bia": "d0ec.3507.cf23", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/36", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf24", + "bia": "d0ec.3507.cf24", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/37", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf25", + "bia": "d0ec.3507.cf25", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/38", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf26", + "bia": "d0ec.3507.cf26", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/39", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf27", + "bia": "d0ec.3507.cf27", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/40", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf28", + "bia": "d0ec.3507.cf28", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/41", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf29", + "bia": "d0ec.3507.cf29", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/42", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2a", + "bia": "d0ec.3507.cf2a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/43", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2b", + "bia": "d0ec.3507.cf2b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/44", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2c", + "bia": "d0ec.3507.cf2c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/45", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2d", + "bia": "d0ec.3507.cf2d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:07", + "last_output": "00:00:42", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "96000", + "output_rate": "2112000", + "input_pps": "31", + "output_pps": "248", + "input_packets": "1007688320", + "output_packets": "3637308419", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/46", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2e", + "bia": "d0ec.3507.cf2e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/47", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf2f", + "bia": "d0ec.3507.cf2f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:03", + "last_output": "00:00:10", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "54000", + "input_pps": "0", + "output_pps": "59", + "input_packets": "349234942", + "output_packets": "1404218469", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/48", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf30", + "bia": "d0ec.3507.cf30", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/49", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf31", + "bia": "d0ec.3507.cf31", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet1/0/50", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cf32", + "bia": "d0ec.3507.cf32", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet1/0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.cf33", + "bia": "d0ec.3507.cf33", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "00:00:48", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "53000", + "input_pps": "0", + "output_pps": "59", + "input_packets": "686710", + "output_packets": "240867522", + "runts": "1", + "giants": "0", + "input_errors": "2", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.cf34", + "bia": "d0ec.3507.cf34", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "Not Present", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/1", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc81", + "bia": "d0ec.3507.cc81", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc82", + "bia": "d0ec.3507.cc82", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/3", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc83", + "bia": "d0ec.3507.cc83", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/4", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc84", + "bia": "d0ec.3507.cc84", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "1000Mb/s", + "media_type": "10/100/1000BaseTX", + "bandwidth": "1000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:25", + "last_output": "00:00:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "3000", + "input_pps": "0", + "output_pps": "4", + "input_packets": "581662", + "output_packets": "35834976", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/5", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc85", + "bia": "d0ec.3507.cc85", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/6", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc86", + "bia": "d0ec.3507.cc86", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/7", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc87", + "bia": "d0ec.3507.cc87", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/8", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc88", + "bia": "d0ec.3507.cc88", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/9", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc89", + "bia": "d0ec.3507.cc89", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/10", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8a", + "bia": "d0ec.3507.cc8a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/11", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8b", + "bia": "d0ec.3507.cc8b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/12", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8c", + "bia": "d0ec.3507.cc8c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/13", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8d", + "bia": "d0ec.3507.cc8d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/14", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8e", + "bia": "d0ec.3507.cc8e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/15", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc8f", + "bia": "d0ec.3507.cc8f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/16", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc90", + "bia": "d0ec.3507.cc90", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/17", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc91", + "bia": "d0ec.3507.cc91", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/18", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc92", + "bia": "d0ec.3507.cc92", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/19", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc93", + "bia": "d0ec.3507.cc93", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/20", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc94", + "bia": "d0ec.3507.cc94", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/21", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc95", + "bia": "d0ec.3507.cc95", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/22", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc96", + "bia": "d0ec.3507.cc96", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/23", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc97", + "bia": "d0ec.3507.cc97", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/24", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc98", + "bia": "d0ec.3507.cc98", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/25", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc99", + "bia": "d0ec.3507.cc99", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/26", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9a", + "bia": "d0ec.3507.cc9a", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/27", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9b", + "bia": "d0ec.3507.cc9b", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/28", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9c", + "bia": "d0ec.3507.cc9c", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/29", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9d", + "bia": "d0ec.3507.cc9d", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/30", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9e", + "bia": "d0ec.3507.cc9e", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/31", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cc9f", + "bia": "d0ec.3507.cc9f", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/32", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca0", + "bia": "d0ec.3507.cca0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/33", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca1", + "bia": "d0ec.3507.cca1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/34", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca2", + "bia": "d0ec.3507.cca2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/35", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca3", + "bia": "d0ec.3507.cca3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/36", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca4", + "bia": "d0ec.3507.cca4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/37", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca5", + "bia": "d0ec.3507.cca5", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/38", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca6", + "bia": "d0ec.3507.cca6", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/39", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca7", + "bia": "d0ec.3507.cca7", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/40", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca8", + "bia": "d0ec.3507.cca8", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/41", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.cca9", + "bia": "d0ec.3507.cca9", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/42", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccaa", + "bia": "d0ec.3507.ccaa", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/43", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccab", + "bia": "d0ec.3507.ccab", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/44", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccac", + "bia": "d0ec.3507.ccac", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/45", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccad", + "bia": "d0ec.3507.ccad", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/46", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccae", + "bia": "d0ec.3507.ccae", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/47", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccaf", + "bia": "d0ec.3507.ccaf", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/48", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb0", + "bia": "d0ec.3507.ccb0", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Auto-duplex", + "speed": "Auto-speed", + "media_type": "10/100/1000BaseTX", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/49", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb1", + "bia": "d0ec.3507.ccb1", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "GigabitEthernet2/0/50", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb2", + "bia": "d0ec.3507.ccb2", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "", + "speed": "", + "media_type": "", + "bandwidth": "10000 Kbit", + "delay": "1000 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet2/0/1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb3", + "bia": "d0ec.3507.ccb3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "SFP-10GBase-SR", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:01", + "last_output": "00:00:02", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "2083000", + "output_rate": "135000", + "input_pps": "256", + "output_pps": "46", + "input_packets": "4844777200", + "output_packets": "1399160106", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "TenGigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down (notconnect)", + "hardware_type": "Ten Gigabit Ethernet", + "mac_address": "d0ec.3507.ccb4", + "bia": "d0ec.3507.ccb4", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "Not Present", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "never", + "last_output": "never", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "0", + "output_rate": "0", + "input_pps": "0", + "output_pps": "0", + "input_packets": "0", + "output_packets": "0", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + }, + { + "interface": "Port-channel1", + "link_status": "up", + "protocol_status": "up (connected)", + "hardware_type": "EtherChannel", + "mac_address": "d0ec.3507.ccb3", + "bia": "d0ec.3507.ccb3", + "description": "a description", + "ip_address": "", + "prefix_length": "", + "mtu": "1500", + "duplex": "Full-duplex", + "speed": "10Gb/s", + "media_type": "unknown", + "bandwidth": "10000000 Kbit", + "delay": "10 usec", + "encapsulation": "ARPA", + "last_input": "00:00:00", + "last_output": "00:01:00", + "last_output_hang": "never", + "queue_strategy": "fifo", + "input_rate": "2083000", + "output_rate": "135000", + "input_pps": "256", + "output_pps": "46", + "input_packets": "4844777007", + "output_packets": "1399159965", + "runts": "0", + "giants": "0", + "input_errors": "0", + "crc": "0", + "frame": "0", + "overrun": "0", + "abort": "", + "output_errors": "0", + "vlan_id": "", + "vlan_id_inner": "", + "vlan_id_outer": "" + } + ], + "show interfaces switchport": [ + { + "interface": "Gi1/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/15", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/16", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/17", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/18", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/19", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/20", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/21", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/22", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/23", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/24", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/25", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/26", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/27", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/28", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/29", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/30", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/31", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/32", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/33", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/34", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/35", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/36", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/37", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/38", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/39", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/40", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/41", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/42", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/43", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "160", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/44", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/45", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "244", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/46", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/47", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "244", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/48", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi1/0/49", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "trunk", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Gi1/0/50", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "dynamic auto", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Te1/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Te1/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/3", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/4", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "static access", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/5", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/6", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/7", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/8", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/9", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/10", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/11", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/12", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/13", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/14", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/15", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/16", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/17", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/18", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/19", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/20", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/21", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/22", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/23", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/24", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/25", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/26", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/27", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/28", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/29", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/30", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/31", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/32", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/33", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/34", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/35", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/36", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/37", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/38", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/39", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/40", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/41", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/42", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/43", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/44", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/45", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/46", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/47", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/48", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "Off", + "mode": "down", + "admin_mode": "static access", + "access_vlan": "111", + "native_vlan": "1", + "voice_vlan": "11", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Gi2/0/49", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "dynamic auto", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Gi2/0/50", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "", + "mode": "", + "admin_mode": "dynamic auto", + "access_vlan": "", + "native_vlan": "", + "voice_vlan": "", + "trunking_vlans": [] + }, + { + "interface": "Te2/0/1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk (member of bundle Po1)", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Te2/0/2", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "down", + "admin_mode": "dynamic auto", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + }, + { + "interface": "Po1", + "switchport": "Enabled", + "switchport_monitor": "", + "switchport_negotiation": "On", + "mode": "trunk", + "admin_mode": "trunk", + "access_vlan": "1", + "native_vlan": "1", + "voice_vlan": "none", + "trunking_vlans": [ + "ALL" + ] + } + ], + "show etherchannel summary": [ + { + "group": "1", + "bundle_name": "Po1", + "bundle_status": "SU", + "bundle_protocol": "LACP", + "member_interface": [ + "Gi1/0/49", + "Te2/0/1" + ], + "member_interface_status": [ + "D", + "P" + ] + } + ], + "show ip interface": [ + { + "interface": "Vlan1", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan41", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan255", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [ + "10.60.255.59" + ], + "prefix_length": [ + "24" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Vlan955", + "link_status": "up", + "protocol_status": "up", + "ip_address": [ + "198.51.100.1" + ], + "prefix_length": [ + "27" + ], + "vrf": "", + "mtu": "1500", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "FastEthernet0", + "link_status": "administratively down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/1", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/3", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/4", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/5", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/11", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/12", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/13", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/14", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/15", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/17", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/18", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/19", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/20", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/21", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/22", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/23", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/24", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/25", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/26", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/27", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/28", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/29", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/30", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/31", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/32", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/33", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/34", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/35", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/36", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/37", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/38", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/39", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/40", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/41", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/42", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/43", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/44", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/45", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/46", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/47", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/48", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/49", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet1/0/50", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet1/0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet1/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/1", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/3", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/4", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/5", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/6", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/7", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/8", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/9", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/10", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/11", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/12", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/13", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/14", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/15", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/16", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/17", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/18", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/19", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/20", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/21", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/22", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/23", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/24", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/25", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/26", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/27", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/28", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/29", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/30", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/31", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/32", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/33", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/34", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/35", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/36", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/37", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/38", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/39", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/40", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/41", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/42", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/43", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/44", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/45", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/46", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/47", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/48", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/49", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "GigabitEthernet2/0/50", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet2/0/1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "TenGigabitEthernet2/0/2", + "link_status": "down", + "protocol_status": "down", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + }, + { + "interface": "Port-channel1", + "link_status": "up", + "protocol_status": "up", + "ip_address": [], + "prefix_length": [], + "vrf": "", + "mtu": "", + "ip_helper": [], + "outgoing_acl": "", + "inbound_acl": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json new file mode 100755 index 00000000..65ab30f3 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_devices/expected_result_2.json @@ -0,0 +1,7 @@ +{ + "device_type": "WS-C2960X-48FPD-L", + "hostname": "2960-01", + "mask_length": 27, + "mgmt_interface": "Vlan955", + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json new file mode 100755 index 00000000..cb846d70 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_all/expected_result_2.json @@ -0,0 +1,1655 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "type": "1000base-t" + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "lag" + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "type": "10gbase-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "type": "virtual" + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json index a781f5ca..5222ed55 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_1.json @@ -106,7 +106,7 @@ "type": "other" }, "GigabitEthernet0/2/0": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -121,7 +121,7 @@ "type": "other" }, "GigabitEthernet0/2/1": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -136,7 +136,7 @@ "type": "other" }, "GigabitEthernet0/2/2": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -151,7 +151,7 @@ "type": "other" }, "GigabitEthernet0/2/3": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -166,7 +166,7 @@ "type": "other" }, "GigabitEthernet0/2/4": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -181,7 +181,7 @@ "type": "other" }, "GigabitEthernet0/2/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -196,7 +196,7 @@ "type": "other" }, "GigabitEthernet0/2/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json new file mode 100755 index 00000000..cb846d70 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_no_options/expected_result_2.json @@ -0,0 +1,1655 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "type": "other" + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "type": "1000base-t" + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "lag" + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "10gbase-t" + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "type": "10gbase-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "type": "virtual" + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json index 6570bc9c..aa480d15 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_1.json @@ -15,10 +15,7 @@ "mtu": "1500", "tagged_vlans": [], "type": "other", - "untagged_vlan": { - "id": "1", - "name": "default" - } + "untagged_vlan": {} }, "GigabitEthernet0/0/0": { "802.1Q_mode": "", @@ -123,7 +120,7 @@ "untagged_vlan": {} }, "GigabitEthernet0/2/0": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -143,7 +140,7 @@ } }, "GigabitEthernet0/2/1": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -163,7 +160,7 @@ } }, "GigabitEthernet0/2/2": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -183,7 +180,7 @@ } }, "GigabitEthernet0/2/3": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -203,7 +200,7 @@ } }, "GigabitEthernet0/2/4": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -223,7 +220,7 @@ } }, "GigabitEthernet0/2/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -243,7 +240,7 @@ } }, "GigabitEthernet0/2/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -275,16 +272,11 @@ "link_status": "False", "mac_address": "ac3a.6789.5d57", "mtu": "1500", - "tagged_vlans": [ - { - "id": "500", - "name": "VLAN0500" - } - ], + "tagged_vlans": [], "type": "other", "untagged_vlan": { - "id": "1", - "name": "default" + "id": "500", + "name": "VLAN0500" } }, "Loopback0": { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json new file mode 100755 index 00000000..8c7eed61 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vlans/expected_result_2.json @@ -0,0 +1,2181 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "244", + "name": "mgmt" + } + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "244", + "name": "mgmt" + } + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "160", + "name": "v160" + } + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "111", + "name": "data" + } + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "tagged_vlans": [], + "type": "10gbase-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json index 4b14c6f3..9b5825a6 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_1.json @@ -113,7 +113,7 @@ "vrf": {} }, "GigabitEthernet0/2/0": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -129,7 +129,7 @@ "vrf": {} }, "GigabitEthernet0/2/1": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -145,7 +145,7 @@ "vrf": {} }, "GigabitEthernet0/2/2": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -161,7 +161,7 @@ "vrf": {} }, "GigabitEthernet0/2/3": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -177,7 +177,7 @@ "vrf": {} }, "GigabitEthernet0/2/4": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -193,7 +193,7 @@ "vrf": {} }, "GigabitEthernet0/2/5": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { @@ -209,7 +209,7 @@ "vrf": {} }, "GigabitEthernet0/2/6": { - "802.1Q_mode": "", + "802.1Q_mode": "tagged-all", "description": "isr description", "ip_addresses": [ { diff --git a/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json new file mode 100755 index 00000000..57e09409 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_xe/sync_network_data_with_vrfs/expected_result_2.json @@ -0,0 +1,1765 @@ +{ + "interfaces": { + "FastEthernet0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb9", + "mtu": "1500", + "type": "other", + "vrf": {} + }, + "GigabitEthernet1/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf01", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf0f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf10", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf11", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf12", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf13", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf02", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf14", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf15", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf16", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf17", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf18", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf19", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf03", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf1f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf20", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf21", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf22", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf23", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf24", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf25", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf26", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf27", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf04", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf28", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf29", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/45": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf2e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/47": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf2f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf30", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/49": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "False", + "mac_address": "d0ec.3507.cf31", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf05", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf32", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf06", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf07", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf08", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet1/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf09", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc81", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/10": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc8f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc90", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc91", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc92", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc93", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc82", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc94", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc95", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc96", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/23": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc97", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc98", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/25": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc99", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/26": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9a", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/27": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9b", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/28": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9c", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/29": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9d", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc83", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/30": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9e", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/31": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc9f", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/32": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca0", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/33": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca1", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/34": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca2", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/35": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca3", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/36": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca4", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/37": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca5", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/38": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca6", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/39": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca7", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cc84", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/40": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca8", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/41": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cca9", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/42": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaa", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/43": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccab", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/44": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccac", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/45": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccad", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/46": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccae", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/47": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccaf", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/48": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb0", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/49": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb1", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc85", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/50": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb2", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc86", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/7": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc87", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/8": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc88", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "GigabitEthernet2/0/9": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cc89", + "mtu": "1500", + "type": "1000base-t", + "vrf": {} + }, + "Port-channel1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "lag", + "vrf": {} + }, + "TenGigabitEthernet1/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.cf33", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "TenGigabitEthernet1/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.cf34", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "TenGigabitEthernet2/0/1": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "Port-channel1", + "link_status": "True", + "mac_address": "d0ec.3507.ccb3", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "TenGigabitEthernet2/0/2": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccb4", + "mtu": "1500", + "type": "10gbase-t", + "vrf": {} + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc0", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.60.255.59", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "d0ec.3507.ccc2", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc1", + "mtu": "1500", + "type": "virtual", + "vrf": {} + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "d0ec.3507.ccc3", + "mtu": "1500", + "type": "virtual", + "vrf": {} + } + }, + "serial": "FJC2304W0BB" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/test_formatter.py b/nautobot_device_onboarding/tests/test_formatter.py index 574876a8..f60173fe 100755 --- a/nautobot_device_onboarding/tests/test_formatter.py +++ b/nautobot_device_onboarding/tests/test_formatter.py @@ -180,7 +180,7 @@ def test_extract_and_post_process_result_python_dict(self): self.assertEqual(expected_parsed_result, actual_result) def test_extract_and_post_process_result_non_json_string(self): - parsed_command_output = "jeff" + parsed_command_output = "baz" actual_result = extract_and_post_process( parsed_command_output, { @@ -280,8 +280,8 @@ def test_extract_and_post_process_result_pre_processor(self): { "command": "show interfaces switchport", "parser": "textfsm", - "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans}", - "post_processor": "{{ obj | get_vlan_data(vlan_map) | tojson }}", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}", + "post_processor": "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}", }, { "obj": "1.1.1.1", @@ -298,6 +298,7 @@ def test_extract_and_post_process_result_pre_processor(self): "access_vlan": "10", "admin_mode": "trunk", "mode": "down (suspended member of bundle Po8)", + "native_vlan": "10", "trunking_vlans": ["10"], } ], @@ -461,7 +462,9 @@ def test_perform_data_extraction_sync_network_data_no_options(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest( + msg=f"test_perform_data_extraction_sync_network_data_no_options with platform {platform}" + ): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_no_options/expected_result_{command_getter_file.split('_')[-1]}", @@ -526,7 +529,9 @@ def test_perform_data_extraction_sync_network_data_with_vrfs(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest( + msg=f"test_perform_data_extraction_sync_network_data_with_vrfs with platform {platform}" + ): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_with_vrfs/expected_result_{command_getter_file.split('_')[-1]}", @@ -591,7 +596,9 @@ def test_perform_data_extraction_sync_network_data_with_vlans(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest( + msg=f"test_perform_data_extraction_sync_network_data_with_vlans with platform {platform}" + ): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_with_vlans/expected_result_{command_getter_file.split('_')[-1]}", @@ -657,7 +664,7 @@ def test_perform_data_extraction_sync_network_data_all(self): getters = find_files_by_prefix(current_test_dir, "command_getter") # NOTE: Cleanup later, should always require tests to be present if len(getters) > 0: - with self.subTest(msg=f"test_perform_data_extraction_sync_devices with platform {platform}"): + with self.subTest(msg=f"test_perform_data_extraction_sync_network_data_all with platform {platform}"): for command_getter_file in getters: with open( f"{MOCK_DIR}/{platform}/sync_network_data_all/expected_result_{command_getter_file.split('_')[-1]}", diff --git a/nautobot_device_onboarding/tests/test_jinja_filters.py b/nautobot_device_onboarding/tests/test_jinja_filters.py index 89f9dc81..ec047070 100755 --- a/nautobot_device_onboarding/tests/test_jinja_filters.py +++ b/nautobot_device_onboarding/tests/test_jinja_filters.py @@ -169,7 +169,7 @@ def test_get_vlan_data_empty_item_data(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "access" expected_value = [] - actual_value = get_vlan_data([], []) + actual_value = get_vlan_data([], [], "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -177,7 +177,7 @@ def test_get_vlan_data_tagged_all_tagged_all(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "tagged-all" expected_value = [] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["ALL"]}], [{"10": "VLAN0010"}]) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["ALL"]}], [{"10": "VLAN0010"}], "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -185,7 +185,9 @@ def test_get_vlan_data_tagged_all_tagged_range(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "tagged-all" expected_value = [] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "VLAN0010"}) + actual_value = get_vlan_data( + [{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "VLAN0010"}, "tagged" + ) self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -193,7 +195,7 @@ def test_get_vlan_data_access_create_defined_name(self, mock_mode): """Get vlan information from an item.""" mock_mode.return_value = "access" expected_value = [{"id": "10", "name": "DATA"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["1-4094"]}], {"10": "DATA"}, "untagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -201,7 +203,7 @@ def test_get_vlan_data_access_tagged_vlans_defined_trunking_as_list(self, mock_m """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "10", "name": "DATA"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["10"]}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["10"]}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -209,7 +211,7 @@ def test_get_vlan_data_access_tagged_vlans_defined_trunking_as_str(self, mock_mo """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "10", "name": "DATA"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "10"}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "10"}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -217,7 +219,7 @@ def test_get_vlan_data_access_tagged_vlans_no_name_trunking_as_list(self, mock_m """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "12", "name": "VLAN0012"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["12"]}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": ["12"]}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) @unittest.mock.patch("nautobot_device_onboarding.jinja_filters.interface_mode_logic") @@ -225,7 +227,7 @@ def test_get_vlan_data_access_tagged_vlans_no_name_trunking_as_str(self, mock_mo """Get vlan information from an item.""" mock_mode.return_value = "tagged" expected_value = [{"id": "12", "name": "VLAN0012"}] - actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "12"}], {"10": "DATA"}) + actual_value = get_vlan_data([{"access_vlan": "10", "trunking_vlans": "12"}], {"10": "DATA"}, "tagged") self.assertEqual(expected_value, actual_value) def test_parse_junos_ip_address_values_as_list_single(self): diff --git a/pyproject.toml b/pyproject.toml index ec219787..fca660ba 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.0.0b1" +version = "4.0.0rc0" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" diff --git a/tasks.py b/tasks.py index 4d592625..9ca1b536 100644 --- a/tasks.py +++ b/tasks.py @@ -49,7 +49,7 @@ def is_truthy(arg): { "nautobot_device_onboarding": { "nautobot_ver": "2.2.3", - "project_name": "nautobot-device-onboarding-2", + "project_name": "nautobot-device-onboarding", "python_ver": "3.11", "local": False, "compose_dir": os.path.join(os.path.dirname(__file__), "development"), @@ -149,15 +149,27 @@ def docker_compose(context, command, **kwargs): def run_command(context, command, **kwargs): """Wrapper to run a command locally or inside the nautobot container.""" if is_truthy(context.nautobot_device_onboarding.local): + if "command_env" in kwargs: + kwargs["env"] = { + **kwargs.get("env", {}), + **kwargs.pop("command_env"), + } context.run(command, **kwargs) else: # Check if nautobot is running, no need to start another nautobot container to run a command docker_compose_status = "ps --services --filter status=running" results = docker_compose(context, docker_compose_status, hide="out") if "nautobot" in results.stdout: - compose_command = f"exec nautobot {command}" + compose_command = "exec" else: - compose_command = f"run --rm --entrypoint '{command}' nautobot" + compose_command = "run --rm --entrypoint=''" + + if "command_env" in kwargs: + command_env = kwargs.pop("command_env") + for key, value in command_env.items(): + compose_command += f' --env="{key}={value}"' + + compose_command += f" -- nautobot {command}" pty = kwargs.pop("pty", True) @@ -327,15 +339,22 @@ def logs(context, service="", follow=False, tail=0): # ------------------------------------------------------------------------------ # ACTIONS # ------------------------------------------------------------------------------ -@task(help={"file": "Python file to execute"}) -def nbshell(context, file=""): +@task( + help={ + "file": "Python file to execute", + "env": "Environment variables to pass to the command", + "plain": "Flag to run nbshell in plain mode (default: False)", + }, +) +def nbshell(context, file="", env={}, plain=False): """Launch an interactive nbshell session.""" command = [ "nautobot-server", "nbshell", + "--plain" if plain else "", f"< '{file}'" if file else "", ] - run_command(context, " ".join(command), pty=not bool(file)) + run_command(context, " ".join(command), pty=not bool(file), command_env=env) @task @@ -674,7 +693,7 @@ def pylint(context): def autoformat(context): """Run code autoformatting.""" black(context, autoformat=True) - ruff(context, action="both", fix=True) + ruff(context, fix=True) @task( @@ -804,8 +823,33 @@ def tests(context, failfast=False, keepdb=False, lint_only=False): pylint(context) print("Running mkdocs...") build_and_check_docs(context) + print("Checking app config schema...") + validate_app_config(context) if not lint_only: print("Running unit tests...") unittest(context, failfast=failfast, keepdb=keepdb) unittest_coverage(context) print("All tests have passed!") + + +@task +def generate_app_config_schema(context): + """Generate the app config schema from the current app config. + + WARNING: Review and edit the generated file before committing. + + Its content is inferred from: + + - The current configuration in `PLUGINS_CONFIG` + - `NautobotAppConfig.default_settings` + - `NautobotAppConfig.required_settings` + """ + start(context, service="nautobot") + nbshell(context, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "generate"}) + + +@task +def validate_app_config(context): + """Validate the app config based on the app config schema.""" + start(context, service="nautobot") + nbshell(context, plain=True, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "validate"}) From dc5dd1ae784d25aea7953c669ebe5c0302879e11 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Mon, 10 Jun 2024 15:01:52 -0500 Subject: [PATCH 10/81] add vlans to junos as best effort --- .../command_mappers/juniper_junos.yml | 24 +- .../command_getter_result_1.json | 3 +- .../expected_result_1.json | 416 +++++++++++++----- 3 files changed, 327 insertions(+), 116 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml index 94797deb..27b07473 100755 --- a/nautobot_device_onboarding/command_mappers/juniper_junos.yml +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -95,14 +95,16 @@ sync_network_data: parser: "none" jpath: '"interface-information"[]."physical-interface"[]["logical-interface"[?name[?data==`{{ current_key }}`]]][][].{name: "vrfname"[0].data}' # yamllint disable-line rule:quoted-strings iterable_type: "dict" -# Vlans on JUNOS are a bit hit or miss show ethernet-switching vs show vlans vs neither working. -# interfaces__tagged_vlans: -# commands: -# - command: "show interfaces brief | display json" -# parser: "none" -# jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."todo"[].data' # yamllint disable-line rule:quoted-string -# interfaces__untagged_vlan: -# commands: -# - command: "show interfaces brief | display json" -# parser: "none" -# jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key }}`]]][][]."todo"[].data' # yamllint disable-line rule:quoted-strings + # Vlans on JUNOS are a bit hit or miss show ethernet-switching vs show vlans vs neither working also in most cases JUNOS aren't used in access land. + interfaces__tagged_vlans: + commands: + - command: "show vlans | display json" + parser: "textfsm" + jpath: "[?contains(interfaces, `{{ current_key }}`*)].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'tagged') | tojson }}" + interfaces__untagged_vlan: + commands: + - command: "show vlans | display json" + parser: "textfsm" + jpath: "[?contains(interfaces, `{{ current_key }}`*)].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" + post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json index ce3a60cc..55674c28 100755 --- a/nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/command_getter_result_1.json @@ -25967,5 +25967,6 @@ ] } ] - } + }, + "show vlans | display json": [] } \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json index 31e739d0..984c81a2 100755 --- a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json @@ -8,7 +8,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", "mtu": 1602, - "type": "lag" + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": [] }, "ae0.0": { "802.1Q_mode": "", @@ -23,7 +25,9 @@ "link_status": "True", "mac_address": [], "mtu": 1602, - "type": "lag" + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": [] }, "ae11": { "802.1Q_mode": "", @@ -33,7 +37,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:c2", "mtu": 1602, - "type": "lag" + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": [] }, "ae11.0": { "802.1Q_mode": "", @@ -48,7 +54,9 @@ "link_status": "True", "mac_address": [], "mtu": 1602, - "type": "lag" + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": [] }, "ae14": { "802.1Q_mode": "", @@ -58,7 +66,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:c3", "mtu": 1602, - "type": "lag" + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": [] }, "ae14.0": { "802.1Q_mode": "", @@ -73,7 +83,9 @@ "link_status": "True", "mac_address": [], "mtu": 1602, - "type": "lag" + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": [] }, "ae3": { "802.1Q_mode": "", @@ -83,7 +95,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:c1", "mtu": 1514, - "type": "lag" + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": [] }, "cbp0": { "802.1Q_mode": "", @@ -93,7 +107,9 @@ "link_status": "True", "mac_address": "2a:8a:1c:56:72:11", "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "demux0": { "802.1Q_mode": "", @@ -103,7 +119,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "dsc": { "802.1Q_mode": "", @@ -113,7 +131,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "em0": { "802.1Q_mode": "", @@ -123,7 +143,9 @@ "link_status": "True", "mac_address": "02:00:00:00:00:04", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "em0.0": { "802.1Q_mode": "", @@ -138,7 +160,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "em1": { "802.1Q_mode": "", @@ -148,7 +172,9 @@ "link_status": "True", "mac_address": "02:00:02:00:00:04", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "em1.0": { "802.1Q_mode": "", @@ -163,7 +189,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "esi": { "802.1Q_mode": "", @@ -173,7 +201,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti0": { "802.1Q_mode": "", @@ -183,7 +213,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti1": { "802.1Q_mode": "", @@ -193,7 +225,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti2": { "802.1Q_mode": "", @@ -203,7 +237,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti3": { "802.1Q_mode": "", @@ -213,7 +249,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti4": { "802.1Q_mode": "", @@ -223,7 +261,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti5": { "802.1Q_mode": "", @@ -233,7 +273,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti6": { "802.1Q_mode": "", @@ -243,7 +285,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fti7": { "802.1Q_mode": "", @@ -253,7 +297,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fxp0": { "802.1Q_mode": "", @@ -263,7 +309,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:ff", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "fxp0.0": { "802.1Q_mode": "", @@ -273,7 +321,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/0": { "802.1Q_mode": "", @@ -283,7 +333,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:60", "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/0.2950": { "802.1Q_mode": "", @@ -298,7 +350,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/0.2953": { "802.1Q_mode": "", @@ -313,7 +367,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/0.32767": { "802.1Q_mode": "", @@ -323,7 +379,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/1": { "802.1Q_mode": "", @@ -333,7 +391,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:61", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/2": { "802.1Q_mode": "", @@ -343,7 +403,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:62", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/3": { "802.1Q_mode": "", @@ -353,7 +415,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:63", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/4": { "802.1Q_mode": "", @@ -363,7 +427,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:64", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/5": { "802.1Q_mode": "", @@ -373,7 +439,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:65", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/6": { "802.1Q_mode": "", @@ -383,7 +451,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:66", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/7": { "802.1Q_mode": "", @@ -393,7 +463,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:67", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/8": { "802.1Q_mode": "", @@ -403,7 +475,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:68", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/0/9": { "802.1Q_mode": "", @@ -413,7 +487,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:69", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/0": { "802.1Q_mode": "", @@ -423,7 +499,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:6c", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/1": { "802.1Q_mode": "", @@ -433,7 +511,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:6d", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/2": { "802.1Q_mode": "", @@ -443,7 +523,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:6e", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/3": { "802.1Q_mode": "", @@ -453,7 +535,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:6f", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/4": { "802.1Q_mode": "", @@ -463,7 +547,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:70", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/5": { "802.1Q_mode": "", @@ -473,7 +559,9 @@ "link_status": "False", "mac_address": "28:8a:1c:56:72:71", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/6": { "802.1Q_mode": "", @@ -483,7 +571,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:72", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/6.16386": { "802.1Q_mode": "", @@ -493,7 +583,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/7": { "802.1Q_mode": "", @@ -503,7 +595,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:73", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/7.16386": { "802.1Q_mode": "", @@ -513,7 +607,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/8": { "802.1Q_mode": "", @@ -523,7 +619,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:74", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/8.16386": { "802.1Q_mode": "", @@ -533,7 +631,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/9": { "802.1Q_mode": "", @@ -543,7 +643,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:75", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ge-1/1/9.16386": { "802.1Q_mode": "", @@ -553,7 +655,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "gre": { "802.1Q_mode": "", @@ -563,7 +667,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "ipip": { "802.1Q_mode": "", @@ -573,7 +679,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "irb": { "802.1Q_mode": "", @@ -583,7 +691,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:f0", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "jsrv": { "802.1Q_mode": "", @@ -593,7 +703,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "jsrv.1": { "802.1Q_mode": "", @@ -608,7 +720,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lc-0/0/0": { "802.1Q_mode": "", @@ -618,7 +732,9 @@ "link_status": "True", "mac_address": [], "mtu": [], - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lc-0/0/0.32769": { "802.1Q_mode": "", @@ -628,7 +744,9 @@ "link_status": "True", "mac_address": [], "mtu": [], - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lo0": { "802.1Q_mode": "", @@ -638,7 +756,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lo0.0": { "802.1Q_mode": "", @@ -653,7 +773,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lo0.16384": { "802.1Q_mode": "", @@ -668,7 +790,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lo0.16385": { "802.1Q_mode": "", @@ -678,7 +802,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi": { "802.1Q_mode": "", @@ -688,7 +814,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.0": { "802.1Q_mode": "", @@ -698,7 +826,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.1": { "802.1Q_mode": "", @@ -708,7 +838,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.2": { "802.1Q_mode": "", @@ -718,7 +850,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.3": { "802.1Q_mode": "", @@ -728,7 +862,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.4": { "802.1Q_mode": "", @@ -738,7 +874,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.5": { "802.1Q_mode": "", @@ -748,7 +886,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.6": { "802.1Q_mode": "", @@ -758,7 +898,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "lsi.7": { "802.1Q_mode": "", @@ -768,7 +910,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "me0": { "802.1Q_mode": "", @@ -778,7 +922,9 @@ "link_status": "True", "mac_address": "02:00:00:00:00:0b", "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "me0.0": { "802.1Q_mode": "", @@ -788,7 +934,9 @@ "link_status": "True", "mac_address": [], "mtu": 1514, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "mtun": { "802.1Q_mode": "", @@ -798,7 +946,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pfe-0/0/0": { "802.1Q_mode": "", @@ -808,7 +958,9 @@ "link_status": "True", "mac_address": [], "mtu": [], - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pfe-0/0/0.16383": { "802.1Q_mode": "", @@ -818,7 +970,9 @@ "link_status": "True", "mac_address": [], "mtu": [], - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pfh-0/0/0": { "802.1Q_mode": "", @@ -828,7 +982,9 @@ "link_status": "True", "mac_address": [], "mtu": [], - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pfh-0/0/0.16383": { "802.1Q_mode": "", @@ -838,7 +994,9 @@ "link_status": "True", "mac_address": [], "mtu": [], - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pfh-0/0/0.16384": { "802.1Q_mode": "", @@ -848,7 +1006,9 @@ "link_status": "True", "mac_address": [], "mtu": [], - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pimd": { "802.1Q_mode": "", @@ -858,7 +1018,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pime": { "802.1Q_mode": "", @@ -868,7 +1030,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pip0": { "802.1Q_mode": "", @@ -878,7 +1042,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:b0", "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "pp0": { "802.1Q_mode": "", @@ -888,7 +1054,9 @@ "link_status": "True", "mac_address": [], "mtu": 1532, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "rbeb": { "802.1Q_mode": "", @@ -898,7 +1066,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "tap": { "802.1Q_mode": "", @@ -908,7 +1078,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "vtep": { "802.1Q_mode": "", @@ -918,7 +1090,9 @@ "link_status": "True", "mac_address": [], "mtu": 9192, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/0": { "802.1Q_mode": "", @@ -928,7 +1102,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:00", "mtu": 1602, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/0.0": { "802.1Q_mode": "", @@ -938,7 +1114,9 @@ "link_status": "True", "mac_address": [], "mtu": 1602, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/1": { "802.1Q_mode": "", @@ -948,7 +1126,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:01", "mtu": 1602, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/1.0": { "802.1Q_mode": "", @@ -958,7 +1138,9 @@ "link_status": "True", "mac_address": [], "mtu": 1602, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/2": { "802.1Q_mode": "", @@ -968,7 +1150,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:02", "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/2.3100": { "802.1Q_mode": "", @@ -983,7 +1167,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/2.3101": { "802.1Q_mode": "", @@ -998,7 +1184,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/2.3102": { "802.1Q_mode": "", @@ -1013,7 +1201,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/2.3103": { "802.1Q_mode": "", @@ -1028,7 +1218,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/2.3104": { "802.1Q_mode": "", @@ -1043,7 +1235,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/2.32767": { "802.1Q_mode": "", @@ -1053,7 +1247,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/3": { "802.1Q_mode": "", @@ -1063,7 +1259,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:03", "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-0/0/3.0": { "802.1Q_mode": "", @@ -1073,7 +1271,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-1/2/0": { "802.1Q_mode": "", @@ -1083,7 +1283,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:78", "mtu": 1602, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-1/2/0.0": { "802.1Q_mode": "", @@ -1093,7 +1295,9 @@ "link_status": "True", "mac_address": [], "mtu": 1602, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-1/3/0": { "802.1Q_mode": "", @@ -1103,7 +1307,9 @@ "link_status": "True", "mac_address": "28:8a:1c:56:72:84", "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] }, "xe-1/3/0.0": { "802.1Q_mode": "", @@ -1113,7 +1319,9 @@ "link_status": "True", "mac_address": [], "mtu": 1522, - "type": "other" + "tagged_vlans": [], + "type": "other", + "untagged_vlan": [] } }, "serial": "T9958" From 5224ef1a168ccc0ecf46869589ed89839f4ea531 Mon Sep 17 00:00:00 2001 From: David Cates Date: Wed, 12 Jun 2024 17:26:15 +0000 Subject: [PATCH 11/81] remove rd=None from vrf assignment filter --- .../diffsync/models/sync_network_data_models.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index 122a72c1..b1b5664c 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -493,20 +493,19 @@ def _get_and_assign_vrf(cls, diffsync, attrs, interface): try: vrf = VRF.objects.get( name=attrs["vrf"]["name"], - rd=None, namespace=diffsync.job.namespace, ) except ObjectDoesNotExist: diffsync.job.logger.error( f"Failed to assign vrf to {interface.device}:{interface}, unable to locate a vrf with attributes " - f"[name: {attrs['vrf']['name']}" + f"[name: {attrs['vrf']['name']} " f"namespace: {diffsync.job.namespace}]" ) raise diffsync_exceptions.ObjectNotCreated except MultipleObjectsReturned: diffsync.job.logger.error( f"Failed to assign vrf to {interface.device}:{interface}, there are multipple vrfs with attributes " - f"[name: {attrs['vrf']['name']}" + f"[name: {attrs['vrf']['name']} " f"namespace: {diffsync.job.namespace}]. " "Unsure which to assign." ) From 21507735524bd67e0dcb6cd236cc0b2f35944ac0 Mon Sep 17 00:00:00 2001 From: David Cates Date: Wed, 12 Jun 2024 17:26:36 +0000 Subject: [PATCH 12/81] update version to rc2 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fca660ba..d0aa4510 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.0.0rc0" +version = "4.0.0rc2" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" From 740a39b0642f4af24dcda7eddbf9acb9b11aa3a1 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 26 Jun 2024 21:45:42 -0500 Subject: [PATCH 13/81] few fixes to prep rc2 --- docs/user/app_yaml_overrides.md | 2 +- nautobot_device_onboarding/command_mappers/cisco_ios.yml | 1 + nautobot_device_onboarding/nornir_plays/schemas.py | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/user/app_yaml_overrides.md b/docs/user/app_yaml_overrides.md index 34240bd9..8a99cc49 100755 --- a/docs/user/app_yaml_overrides.md +++ b/docs/user/app_yaml_overrides.md @@ -9,7 +9,7 @@ There are only a few components to the file and they're described below: - `root key data name` - Is fully defined in the schema definition. - `commands` - List of commands to execute in order to get the required data. - `command` - Actual `show` command to execute. -- `parser` - Whether to use a parser (textfsm, pyats, ttp, etc) alternatively `no` can be used if the platform supports some other method to return structured data. E.g. (`| display json`) or an equivalent. +- `parser` - Whether to use a parser (textfsm, pyats, ttp, etc) alternatively `none` can be used if the platform supports some other method to return structured data. E.g. (`| display json`) or an equivalent. - `jpath` - The jmespath (specifically jdiffs implementation) to extract the data from the parsed json returned from parser. - `post_processor` - Jinja2 capable code to further transform the returned data post jpath extraction. - `iterable_type` - A optional value to force a parsed result to a specific data type. diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index c6aa6ba8..ca339215 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -17,6 +17,7 @@ sync_devices: parser: "textfsm" jpath: "[*].hardware[]" post_processor: "{{ obj | unique | first }}" + iterable_type: "str" mgmt_interface: commands: - command: "show interfaces" diff --git a/nautobot_device_onboarding/nornir_plays/schemas.py b/nautobot_device_onboarding/nornir_plays/schemas.py index f9b27108..ae8b3972 100755 --- a/nautobot_device_onboarding/nornir_plays/schemas.py +++ b/nautobot_device_onboarding/nornir_plays/schemas.py @@ -12,7 +12,7 @@ def sync_devices_schema(json_schema=True): "properties": { "hostname": {"type": "string", "description": "Hostname of the network device"}, "serial": {"type": "string", "description": "Serial number of the network device"}, - "device_type": {"type": "string", "description": "Type of the network device"}, + "device_type": {"type": ["string", "integer"], "description": "Type of the network device"}, "mgmt_interface": {"type": "string", "description": "Management interface of the network device"}, "mask_length": { "type": "integer", @@ -117,7 +117,7 @@ def sync_network_data_schema(json_schema=True): "minItems": 1, }, "hostname": {"type": "string"}, - "device_type": {"type": "string"}, + "device_type": {"type": ["string", "integer"]}, "mgmt_interface": {"type": "string"}, "mask_length": {"type": "integer"}, }, From 8074bd22490978b414795e3f9b4a8f450e9fdc8b Mon Sep 17 00:00:00 2001 From: Zack Tobar Date: Thu, 27 Jun 2024 19:07:12 -0500 Subject: [PATCH 14/81] Fix error if Serial # is only numbers. --- nautobot_device_onboarding/command_mappers/cisco_ios.yml | 2 ++ nautobot_device_onboarding/nornir_plays/schemas.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index ca339215..53657f6e 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -11,6 +11,7 @@ sync_devices: parser: "textfsm" jpath: "[*].serial[]" post_processor: "{{ obj | unique | first }}" + iterable_type: "str" device_type: commands: - command: "show version" @@ -45,6 +46,7 @@ sync_network_data: parser: "textfsm" jpath: "[*].serial[]" post_processor: "{{ obj | unique | first }}" + iterable_type: "str" interfaces: root_key: true commands: diff --git a/nautobot_device_onboarding/nornir_plays/schemas.py b/nautobot_device_onboarding/nornir_plays/schemas.py index ae8b3972..33a31189 100755 --- a/nautobot_device_onboarding/nornir_plays/schemas.py +++ b/nautobot_device_onboarding/nornir_plays/schemas.py @@ -11,7 +11,7 @@ def sync_devices_schema(json_schema=True): "required": ["hostname", "serial", "device_type", "mgmt_interface", "platform", "network_driver"], "properties": { "hostname": {"type": "string", "description": "Hostname of the network device"}, - "serial": {"type": "string", "description": "Serial number of the network device"}, + "serial": {"type": ["string", "integer"], "description": "Serial number of the network device"}, "device_type": {"type": ["string", "integer"], "description": "Type of the network device"}, "mgmt_interface": {"type": "string", "description": "Management interface of the network device"}, "mask_length": { @@ -112,7 +112,7 @@ def sync_network_data_schema(json_schema=True): "required": ["serial", "hostname", "device_type", "mgmt_interface", "mask_length"], "properties": { "serial": { - "type": "string", + "type": ["string", "integer"], "description": "Serial number of the network device", "minItems": 1, }, From 929308b417624a25d59bc1cc06d00fe82c4392c4 Mon Sep 17 00:00:00 2001 From: David Cates Date: Fri, 28 Jun 2024 15:56:42 +0000 Subject: [PATCH 15/81] update description for sync network data job --- nautobot_device_onboarding/jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 4df60113..a725e768 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -528,7 +528,7 @@ class Meta: """Metadata about this Job.""" name = "Sync Network Data From Network" - description = "Synchronize extended device attribute information into Nautobot from one or more network devices. Information includes Interfaces, IPAddresses, Prefixes, and Vrfs." + description = "Synchronize extended device attribute information into Nautobot from one or more network devices. Information includes Interfaces, IPAddresses, Prefixes, Vlans and Vrfs." debug = BooleanVar(description="Enable for more verbose logging.") sync_vlans = BooleanVar(default=False, description="Sync VLANs and interface VLAN assignments.") From 595f6602c05171ce48d9f5bbb10dbc4b38202c88 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Fri, 28 Jun 2024 16:07:35 +0000 Subject: [PATCH 16/81] extremely important update --- nautobot_device_onboarding/jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index a725e768..0e9ef175 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -528,7 +528,7 @@ class Meta: """Metadata about this Job.""" name = "Sync Network Data From Network" - description = "Synchronize extended device attribute information into Nautobot from one or more network devices. Information includes Interfaces, IPAddresses, Prefixes, Vlans and Vrfs." + description = "Synchronize extended device attribute information into Nautobot from one or more network devices. Information includes Interfaces, IP Addresses, Prefixes, VLANs and VRFs." debug = BooleanVar(description="Enable for more verbose logging.") sync_vlans = BooleanVar(default=False, description="Sync VLANs and interface VLAN assignments.") From 9ca79b6b3f60479086a2e5cf69c1ff8433949066 Mon Sep 17 00:00:00 2001 From: David Cates Date: Fri, 28 Jun 2024 17:48:01 +0000 Subject: [PATCH 17/81] update error handling in _handle_failed_devices --- .../adapters/sync_network_data_adapters.py | 14 +++++++++++++- .../tests/test_diffsync_utils.py | 5 ++++- .../utils/diffsync_utils.py | 16 ++++++++++++---- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index e80794c2..0414cdf3 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -358,12 +358,24 @@ def _handle_failed_devices(self, device_data): f"{device_data[hostname].get('failed_reason')}" ) failed_devices.append(hostname) + # remove devices that failed from the command getter results for hostname in failed_devices: del device_data[hostname] + + device_queryset, devices_with_errors = diffsync_utils.generate_device_queryset_from_command_getter_result( + job=self.job, command_getter_result=device_data + ) + + # remove devices that have errors found while creating the queryset from the command getter results + for hostname in devices_with_errors: + del device_data[hostname] + + failed_devices = failed_devices + devices_with_errors if failed_devices: self.job.logger.warning(f"Failed devices: {failed_devices}") + self.job.command_getter_result = device_data - self.job.devices_to_load = diffsync_utils.generate_device_queryset_from_command_getter_result(device_data) + self.job.devices_to_load = device_queryset def _handle_general_load_exception(self, error, hostname, data, model_type): """If a diffsync model fails to load, log the error.""" diff --git a/nautobot_device_onboarding/tests/test_diffsync_utils.py b/nautobot_device_onboarding/tests/test_diffsync_utils.py index 0e756b2f..10e2915e 100644 --- a/nautobot_device_onboarding/tests/test_diffsync_utils.py +++ b/nautobot_device_onboarding/tests/test_diffsync_utils.py @@ -63,9 +63,12 @@ def setUp(self): # pylint: disable=invalid-name def test_generate_device_queryset_from_command_getter_result(self): """Test generating a queryset from data returned from command getter.""" - queryset = generate_device_queryset_from_command_getter_result(command_getter_result=self.command_getter_result) + queryset, devices_with_errors = generate_device_queryset_from_command_getter_result( + job=self.mock_job, command_getter_result=self.command_getter_result + ) hostnames_list = list(queryset.values_list("name", flat=True)) self.assertEqual(2, queryset.count()) + self.assertEqual(devices_with_errors, []) self.assertIn("demo-cisco-1", hostnames_list) self.assertIn("demo-cisco-2", hostnames_list) diff --git a/nautobot_device_onboarding/utils/diffsync_utils.py b/nautobot_device_onboarding/utils/diffsync_utils.py index b623b15f..8e32c71f 100644 --- a/nautobot_device_onboarding/utils/diffsync_utils.py +++ b/nautobot_device_onboarding/utils/diffsync_utils.py @@ -8,17 +8,25 @@ from nautobot.ipam.models import IPAddress, Prefix -def generate_device_queryset_from_command_getter_result(command_getter_result): +def generate_device_queryset_from_command_getter_result(job, command_getter_result): """Generate a Nautobot device queryset based on data returned from Command Getter Nornir Task.""" devices_to_sync_hostnames = [] devices_to_sync_serial_numbers = [] + devices_with_errors = [] for hostname, device_data in command_getter_result.items(): - devices_to_sync_hostnames.append(hostname) - devices_to_sync_serial_numbers.append(device_data["serial"]) + try: + devices_to_sync_hostnames.append(hostname) + devices_to_sync_serial_numbers.append(device_data["serial"]) + except Exception as err: + devices_with_errors.append(hostname) + job.logger.error(f"Error while creating device queryset, hostname: {hostname}, {type(err).__name__} {err}") + if job.debug: + job.logger.debug(f"{hostname}: {device_data}") + continue device_queryset = Device.objects.filter(name__in=devices_to_sync_hostnames).filter( serial__in=devices_to_sync_serial_numbers ) - return device_queryset + return device_queryset, devices_with_errors def check_data_type(data): From f0fa20e320976f5baa0149cb1c52a429715c7e0f Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Fri, 28 Jun 2024 13:29:33 -0500 Subject: [PATCH 18/81] implement fix for iterable type 'int' and solve json loads changing string to int --- .../command_mappers/arista_eos.yml | 2 + .../command_mappers/cisco_ios.yml | 2 + .../command_mappers/cisco_nxos.yml | 2 + .../command_mappers/cisco_wlc.yml | 1 + .../command_mappers/cisco_xe.yml | 2 + .../command_mappers/juniper_junos.yml | 2 + .../nornir_plays/formatter.py | 6 +- .../arista_eos/command_getter_result_1.json | 22 +- .../expected_result_1.json | 10 +- .../expected_result_1.json | 10 +- .../expected_result_1.json | 10 +- .../expected_result_1.json | 208 +++++++++--------- .../expected_result_1.json | 208 +++++++++--------- .../expected_result_1.json | 208 +++++++++--------- .../tests/test_formatter.py | 55 ++++- 15 files changed, 408 insertions(+), 340 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/arista_eos.yml b/nautobot_device_onboarding/command_mappers/arista_eos.yml index 9636a4df..6e5f3421 100755 --- a/nautobot_device_onboarding/command_mappers/arista_eos.yml +++ b/nautobot_device_onboarding/command_mappers/arista_eos.yml @@ -26,6 +26,7 @@ sync_devices: parser: "none" jpath: "interfaces.*.interfaceAddress[?ipAddr.address==`{{ obj }}`].ipAddr.maskLen" post_processor: "{{ obj[0] }}" + iterable_type: "int" sync_network_data: pre_processor: vlan_map: @@ -64,6 +65,7 @@ sync_network_data: parser: "none" jpath: 'interfaces."{{ current_key }}".[mtu]' # yamllint disable-line rule:quoted-strings post_processor: "{{ obj[0] }}" + iterable_type: "str" interfaces__mac_address: commands: - command: "show interfaces | json" diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index ca339215..98012f56 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -30,6 +30,7 @@ sync_devices: parser: "textfsm" jpath: "[?ip_address=='{{ obj }}'].prefix_length" post_processor: "{{ obj | unique | first }}" + iterable_type: "int" sync_network_data: pre_processor: vlan_map: @@ -69,6 +70,7 @@ sync_network_data: - command: "show interfaces" parser: "textfsm" jpath: "[?interface=='{{ current_key }}'].mtu" + iterable_type: "str" interfaces__mac_address: commands: - command: "show interfaces" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index 996a09b8..349a1d0d 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -26,6 +26,7 @@ sync_devices: parser: "textfsm" jpath: "[?ip_address=='{{ obj }}'].subnet" post_processor: "{% if '/' in obj[0] %}{{ obj[0].split('/')[1] }}{% else %}31{% endif %}" + iterable_type: "int" sync_network_data: pre_processor: vlan_map: @@ -65,6 +66,7 @@ sync_network_data: - command: "show interface" parser: "textfsm" jpath: "[?interface=='{{ current_key }}'].mtu" + iterable_type: "str" interfaces__mac_address: commands: - command: "show interface" diff --git a/nautobot_device_onboarding/command_mappers/cisco_wlc.yml b/nautobot_device_onboarding/command_mappers/cisco_wlc.yml index da258795..67aa9309 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_wlc.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_wlc.yml @@ -26,3 +26,4 @@ sync_devices: parser: "textfsm" jpath: "[*].netmask" post_processor: "{% if obj | length > 0 %}{{ obj[0] | netmask_to_cidr }}{% else %}{{ obj }}{% endif %}" + iterable_type: "int" diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml index c6aa6ba8..ee914956 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_xe.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -29,6 +29,7 @@ sync_devices: parser: "textfsm" jpath: "[?ip_address=='{{ obj }}'].prefix_length" post_processor: "{{ obj | unique | first }}" + iterable_type: "int" sync_network_data: pre_processor: vlan_map: @@ -68,6 +69,7 @@ sync_network_data: - command: "show interfaces" parser: "textfsm" jpath: "[?interface=='{{ current_key }}'].mtu" + iterable_type: "str" interfaces__mac_address: commands: - command: "show interfaces" diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml index 27b07473..f770c1ce 100755 --- a/nautobot_device_onboarding/command_mappers/juniper_junos.yml +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -27,6 +27,7 @@ sync_devices: parser: "none" jpath: '"route-information"[]."route-table"[]."rt"[]."rt-destination"[].data' # yamllint disable-line rule:quoted-strings post_processor: "{% set mask = [] %}{% for ip_route in obj %}{% if ip_route | is_network %}{% if ip_route | ipaddress_network('version') == 4 %}{% if original_host | is_ip_within(ip_route) %}{% set _=mask.append(ip_route.split('/')[1]) %}{% endif %}{% endif %}{% endif %}{% endfor %}{{ mask | unique | first}}" + iterable_type: "int" sync_network_data: serial: commands: @@ -60,6 +61,7 @@ sync_network_data: parser: "none" jpath: '"interface-information"[]["physical-interface"[?name[?data==`{{ current_key.split(".")[0] }}`]]][][]."mtu"[].data' # yamllint disable-line rule:quoted-strings post_processor: "{% if obj | length > 0 %}{% if 'nlimited' in obj[0] %}9192{% else %}{{ obj[0] }}{% endif %}{% endif %}" + iterable_type: "str" interfaces__mac_address: commands: - command: "show interfaces | display json" diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py index 8cd132c3..746fbee0 100755 --- a/nautobot_device_onboarding/nornir_plays/formatter.py +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -53,7 +53,7 @@ def normalize_processed_data(processed_data, iterable_type): # If processed_data is an empty data structure, return default based on iterable_type if not processed_data: return process_empty_result(iterable_type) - if isinstance(processed_data, str): + if isinstance(processed_data, str) and not processed_data.isdigit(): try: # If processed_data is a json string try to load it into a python datatype. post_processed_data = json.loads(processed_data) @@ -73,6 +73,10 @@ def normalize_processed_data(processed_data, iterable_type): post_processed_data = post_processed_data[0] if not post_processed_data and iterable_type in ["str", "dict"]: return process_empty_result(iterable_type) + if iterable_type == "int": + return int(post_processed_data) + if iterable_type == "str": + return str(post_processed_data) return post_processed_data diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json index cc4d26d8..91a7c8ca 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/command_getter_result_1.json @@ -11,7 +11,7 @@ "name": "Ethernet1", "lineProtocolStatus": "down", "interfaceStatus": "disabled", - "mtu": 1500, + "mtu": "1500", "interfaceAddressBrief": { "ipAddr": { "address": "1.1.1.1", @@ -55,7 +55,7 @@ "name": "Ethernet4", "lineProtocolStatus": "up", "interfaceStatus": "connected", - "mtu": 1500, + "mtu": "1500", "interfaceAddressBrief": { "ipAddr": { "address": "0.0.0.0", @@ -99,7 +99,7 @@ "name": "Management1", "lineProtocolStatus": "up", "interfaceStatus": "connected", - "mtu": 1500, + "mtu": "1500", "interfaceAddressBrief": { "ipAddr": { "address": "10.1.1.219", @@ -214,7 +214,7 @@ "lastStatusChangeTimestamp": 1716994739.7751265, "lineProtocolStatus": "down", "loopbackMode": "loopbackNone", - "mtu": 1500, + "mtu": "1500", "name": "Ethernet1", "physicalAddress": "52:54:00:91:1e:bf" }, @@ -273,7 +273,7 @@ "lastStatusChangeTimestamp": 1716994739.775847, "lineProtocolStatus": "up", "loopbackMode": "loopbackNone", - "mtu": 9214, + "mtu": "9214", "name": "Ethernet2", "physicalAddress": "52:54:00:15:b8:13" }, @@ -332,7 +332,7 @@ "lastStatusChangeTimestamp": 1716994739.7754223, "lineProtocolStatus": "up", "loopbackMode": "loopbackNone", - "mtu": 9214, + "mtu": "9214", "name": "Ethernet3", "physicalAddress": "52:54:00:07:8d:69" }, @@ -407,7 +407,7 @@ "lastStatusChangeTimestamp": 1716994739.7757108, "lineProtocolStatus": "up", "loopbackMode": "loopbackNone", - "mtu": 1500, + "mtu": "1500", "name": "Ethernet4", "physicalAddress": "52:54:00:91:1e:bf" }, @@ -483,7 +483,7 @@ "lastStatusChangeTimestamp": 1716994731.7559597, "lineProtocolStatus": "up", "loopbackMode": "loopbackNone", - "mtu": 1500, + "mtu": "1500", "name": "Management1", "physicalAddress": "52:54:00:0d:29:5c" } @@ -502,7 +502,7 @@ "ipv4Routable0": false, "ipv4Routable240": false, "lineProtocolStatus": "down", - "mtu": 1500, + "mtu": "1500", "name": "Ethernet1", "nonRoutableClassEIntf": false }, @@ -517,7 +517,7 @@ "ipv4Routable0": false, "ipv4Routable240": false, "lineProtocolStatus": "up", - "mtu": 1500, + "mtu": "1500", "name": "Ethernet4", "nonRoutableClassEIntf": false }, @@ -532,7 +532,7 @@ "ipv4Routable0": false, "ipv4Routable240": false, "lineProtocolStatus": "up", - "mtu": 1500, + "mtu": "1500", "name": "Management1", "nonRoutableClassEIntf": false } diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json index 758d4c33..a5af7864 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json @@ -12,7 +12,7 @@ "lag": [], "link_status": "False", "mac_address": "52:54:00:91:1e:bf", - "mtu": 1500, + "mtu": "1500", "type": "1000base-t" }, "Ethernet2": { @@ -22,7 +22,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:15:b8:13", - "mtu": 9214, + "mtu": "9214", "type": "1000base-t" }, "Ethernet3": { @@ -32,7 +32,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:07:8d:69", - "mtu": 9214, + "mtu": "9214", "type": "1000base-t" }, "Ethernet4": { @@ -47,7 +47,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:91:1e:bf", - "mtu": 1500, + "mtu": "1500", "type": "1000base-t" }, "Management1": { @@ -62,7 +62,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:0d:29:5c", - "mtu": 1500, + "mtu": "1500", "type": "1000base-t" } }, diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json index 4b3fe8c0..c6cbabe7 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json @@ -12,7 +12,7 @@ "lag": [], "link_status": "False", "mac_address": "52:54:00:91:1e:bf", - "mtu": 1500, + "mtu": "1500", "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": {} @@ -24,7 +24,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:15:b8:13", - "mtu": 9214, + "mtu": "9214", "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { @@ -39,7 +39,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:07:8d:69", - "mtu": 9214, + "mtu": "9214", "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": { @@ -59,7 +59,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:91:1e:bf", - "mtu": 1500, + "mtu": "1500", "tagged_vlans": [ { "id": "2", @@ -84,7 +84,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:0d:29:5c", - "mtu": 1500, + "mtu": "1500", "tagged_vlans": [], "type": "1000base-t", "untagged_vlan": {} diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json index 7cb38097..669319fb 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json @@ -12,7 +12,7 @@ "lag": [], "link_status": "False", "mac_address": "52:54:00:91:1e:bf", - "mtu": 1500, + "mtu": "1500", "type": "1000base-t", "vrf": { "name": "default" @@ -25,7 +25,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:15:b8:13", - "mtu": 9214, + "mtu": "9214", "type": "1000base-t", "vrf": {} }, @@ -36,7 +36,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:07:8d:69", - "mtu": 9214, + "mtu": "9214", "type": "1000base-t", "vrf": {} }, @@ -52,7 +52,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:91:1e:bf", - "mtu": 1500, + "mtu": "1500", "type": "1000base-t", "vrf": { "name": "jeff" @@ -70,7 +70,7 @@ "lag": [], "link_status": "True", "mac_address": "52:54:00:0d:29:5c", - "mtu": 1500, + "mtu": "1500", "type": "1000base-t", "vrf": { "name": "default" diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json index 53cec81a..571cb30c 100755 --- a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_no_options/expected_result_1.json @@ -7,7 +7,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", - "mtu": 1602, + "mtu": "1602", "type": "lag" }, "ae0.0": { @@ -22,7 +22,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "lag" }, "ae11": { @@ -32,7 +32,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c2", - "mtu": 1602, + "mtu": "1602", "type": "lag" }, "ae11.0": { @@ -47,7 +47,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "lag" }, "ae14": { @@ -57,7 +57,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c3", - "mtu": 1602, + "mtu": "1602", "type": "lag" }, "ae14.0": { @@ -72,7 +72,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "lag" }, "ae3": { @@ -82,7 +82,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c1", - "mtu": 1514, + "mtu": "1514", "type": "lag" }, "cbp0": { @@ -92,7 +92,7 @@ "lag": [], "link_status": "True", "mac_address": "2a:8a:1c:56:72:11", - "mtu": 9192, + "mtu": "9192", "type": "other" }, "demux0": { @@ -102,7 +102,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "dsc": { @@ -112,7 +112,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "em0": { @@ -122,7 +122,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:00:00:00:04", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "em0.0": { @@ -137,7 +137,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "em1": { @@ -147,7 +147,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:02:00:00:04", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "em1.0": { @@ -162,7 +162,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "esi": { @@ -172,7 +172,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti0": { @@ -182,7 +182,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti1": { @@ -192,7 +192,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti2": { @@ -202,7 +202,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti3": { @@ -212,7 +212,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti4": { @@ -222,7 +222,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti5": { @@ -232,7 +232,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti6": { @@ -242,7 +242,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fti7": { @@ -252,7 +252,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "fxp0": { @@ -262,7 +262,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:ff", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "fxp0.0": { @@ -272,7 +272,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/0": { @@ -282,7 +282,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:60", - "mtu": 1522, + "mtu": "1522", "type": "other" }, "ge-1/0/0.2950": { @@ -297,7 +297,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "ge-1/0/0.2953": { @@ -312,7 +312,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "ge-1/0/0.32767": { @@ -322,7 +322,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "ge-1/0/1": { @@ -332,7 +332,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:61", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/2": { @@ -342,7 +342,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:62", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/3": { @@ -352,7 +352,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:63", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/4": { @@ -362,7 +362,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:64", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/5": { @@ -372,7 +372,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:65", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/6": { @@ -382,7 +382,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:66", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/7": { @@ -392,7 +392,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:67", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/8": { @@ -402,7 +402,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:68", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/0/9": { @@ -412,7 +412,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:69", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/0": { @@ -422,7 +422,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6c", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/1": { @@ -432,7 +432,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6d", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/2": { @@ -442,7 +442,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6e", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/3": { @@ -452,7 +452,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6f", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/4": { @@ -462,7 +462,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:70", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/5": { @@ -472,7 +472,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:71", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/6": { @@ -482,7 +482,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:72", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/6.16386": { @@ -492,7 +492,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/7": { @@ -502,7 +502,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:73", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/7.16386": { @@ -512,7 +512,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/8": { @@ -522,7 +522,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:74", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/8.16386": { @@ -532,7 +532,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/9": { @@ -542,7 +542,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:75", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "ge-1/1/9.16386": { @@ -552,7 +552,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "gre": { @@ -562,7 +562,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "ipip": { @@ -572,7 +572,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "irb": { @@ -582,7 +582,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:f0", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "jsrv": { @@ -592,7 +592,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "jsrv.1": { @@ -607,7 +607,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "lc-0/0/0": { @@ -617,7 +617,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other" }, "lc-0/0/0.32769": { @@ -627,7 +627,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other" }, "lo0": { @@ -637,7 +637,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lo0.0": { @@ -652,7 +652,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lo0.16384": { @@ -667,7 +667,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lo0.16385": { @@ -677,7 +677,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi": { @@ -687,7 +687,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.0": { @@ -697,7 +697,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.1": { @@ -707,7 +707,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.2": { @@ -717,7 +717,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.3": { @@ -727,7 +727,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.4": { @@ -737,7 +737,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.5": { @@ -747,7 +747,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.6": { @@ -757,7 +757,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "lsi.7": { @@ -767,7 +767,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "me0": { @@ -777,7 +777,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:00:00:00:0b", - "mtu": 1514, + "mtu": "1514", "type": "other" }, "me0.0": { @@ -787,7 +787,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other" }, "mtun": { @@ -797,7 +797,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "pfe-0/0/0": { @@ -807,7 +807,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other" }, "pfe-0/0/0.16383": { @@ -817,7 +817,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other" }, "pfh-0/0/0": { @@ -827,7 +827,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other" }, "pfh-0/0/0.16383": { @@ -837,7 +837,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other" }, "pfh-0/0/0.16384": { @@ -847,7 +847,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other" }, "pimd": { @@ -857,7 +857,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "pime": { @@ -867,7 +867,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "pip0": { @@ -877,7 +877,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:b0", - "mtu": 9192, + "mtu": "9192", "type": "other" }, "pp0": { @@ -887,7 +887,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1532, + "mtu": "1532", "type": "other" }, "rbeb": { @@ -897,7 +897,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "tap": { @@ -907,7 +907,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "vtep": { @@ -917,7 +917,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other" }, "xe-0/0/0": { @@ -927,7 +927,7 @@ "lag": "ae0", "link_status": "True", "mac_address": "28:8a:1c:56:72:00", - "mtu": 1602, + "mtu": "1602", "type": "other" }, "xe-0/0/0.0": { @@ -937,7 +937,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "other" }, "xe-0/0/1": { @@ -947,7 +947,7 @@ "lag": "ae14", "link_status": "True", "mac_address": "28:8a:1c:56:72:01", - "mtu": 1602, + "mtu": "1602", "type": "other" }, "xe-0/0/1.0": { @@ -957,7 +957,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "other" }, "xe-0/0/2": { @@ -967,7 +967,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:02", - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/2.3100": { @@ -982,7 +982,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/2.3101": { @@ -997,7 +997,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/2.3102": { @@ -1012,7 +1012,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/2.3103": { @@ -1027,7 +1027,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/2.3104": { @@ -1042,7 +1042,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/2.32767": { @@ -1052,7 +1052,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/3": { @@ -1062,7 +1062,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:03", - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-0/0/3.0": { @@ -1072,7 +1072,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-1/2/0": { @@ -1082,7 +1082,7 @@ "lag": "ae11", "link_status": "True", "mac_address": "28:8a:1c:56:72:78", - "mtu": 1602, + "mtu": "1602", "type": "other" }, "xe-1/2/0.0": { @@ -1092,7 +1092,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "other" }, "xe-1/3/0": { @@ -1102,7 +1102,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:84", - "mtu": 1522, + "mtu": "1522", "type": "other" }, "xe-1/3/0.0": { @@ -1112,7 +1112,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other" } }, diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json index 984c81a2..ad6e8261 100755 --- a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vlans/expected_result_1.json @@ -7,7 +7,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "lag", "untagged_vlan": [] @@ -24,7 +24,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "lag", "untagged_vlan": [] @@ -36,7 +36,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c2", - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "lag", "untagged_vlan": [] @@ -53,7 +53,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "lag", "untagged_vlan": [] @@ -65,7 +65,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c3", - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "lag", "untagged_vlan": [] @@ -82,7 +82,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "lag", "untagged_vlan": [] @@ -94,7 +94,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c1", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "lag", "untagged_vlan": [] @@ -106,7 +106,7 @@ "lag": [], "link_status": "True", "mac_address": "2a:8a:1c:56:72:11", - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -118,7 +118,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -130,7 +130,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -142,7 +142,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:00:00:00:04", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -159,7 +159,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -171,7 +171,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:02:00:00:04", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -188,7 +188,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -200,7 +200,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -212,7 +212,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -224,7 +224,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -236,7 +236,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -248,7 +248,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -260,7 +260,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -272,7 +272,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -284,7 +284,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -296,7 +296,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -308,7 +308,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:ff", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -320,7 +320,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -332,7 +332,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:60", - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -349,7 +349,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -366,7 +366,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -378,7 +378,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -390,7 +390,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:61", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -402,7 +402,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:62", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -414,7 +414,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:63", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -426,7 +426,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:64", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -438,7 +438,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:65", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -450,7 +450,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:66", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -462,7 +462,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:67", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -474,7 +474,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:68", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -486,7 +486,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:69", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -498,7 +498,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6c", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -510,7 +510,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6d", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -522,7 +522,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6e", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -534,7 +534,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6f", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -546,7 +546,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:70", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -558,7 +558,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:71", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -570,7 +570,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:72", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -582,7 +582,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -594,7 +594,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:73", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -606,7 +606,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -618,7 +618,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:74", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -630,7 +630,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -642,7 +642,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:75", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -654,7 +654,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -666,7 +666,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -678,7 +678,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -690,7 +690,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:f0", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -702,7 +702,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -719,7 +719,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -731,7 +731,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -743,7 +743,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -755,7 +755,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -772,7 +772,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -789,7 +789,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -801,7 +801,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -813,7 +813,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -825,7 +825,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -837,7 +837,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -849,7 +849,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -861,7 +861,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -873,7 +873,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -885,7 +885,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -897,7 +897,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -909,7 +909,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -921,7 +921,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:00:00:00:0b", - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -933,7 +933,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -945,7 +945,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -957,7 +957,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -969,7 +969,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -981,7 +981,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -993,7 +993,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1005,7 +1005,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1017,7 +1017,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1029,7 +1029,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1041,7 +1041,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:b0", - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1053,7 +1053,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1532, + "mtu": "1532", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1065,7 +1065,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1077,7 +1077,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1089,7 +1089,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1101,7 +1101,7 @@ "lag": "ae0", "link_status": "True", "mac_address": "28:8a:1c:56:72:00", - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1113,7 +1113,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1125,7 +1125,7 @@ "lag": "ae14", "link_status": "True", "mac_address": "28:8a:1c:56:72:01", - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1137,7 +1137,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1149,7 +1149,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:02", - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1166,7 +1166,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1183,7 +1183,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1200,7 +1200,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1217,7 +1217,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1234,7 +1234,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1246,7 +1246,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1258,7 +1258,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:03", - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1270,7 +1270,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1282,7 +1282,7 @@ "lag": "ae11", "link_status": "True", "mac_address": "28:8a:1c:56:72:78", - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1294,7 +1294,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1306,7 +1306,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:84", - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] @@ -1318,7 +1318,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "tagged_vlans": [], "type": "other", "untagged_vlan": [] diff --git a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json index f3bc0ec4..4560593a 100755 --- a/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/juniper_junos/sync_network_data_with_vrfs/expected_result_1.json @@ -7,7 +7,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", - "mtu": 1602, + "mtu": "1602", "type": "lag", "vrf": {} }, @@ -23,7 +23,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "lag", "vrf": {} }, @@ -34,7 +34,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c2", - "mtu": 1602, + "mtu": "1602", "type": "lag", "vrf": {} }, @@ -50,7 +50,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "lag", "vrf": {} }, @@ -61,7 +61,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c3", - "mtu": 1602, + "mtu": "1602", "type": "lag", "vrf": {} }, @@ -77,7 +77,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "lag", "vrf": {} }, @@ -88,7 +88,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c1", - "mtu": 1514, + "mtu": "1514", "type": "lag", "vrf": {} }, @@ -99,7 +99,7 @@ "lag": [], "link_status": "True", "mac_address": "2a:8a:1c:56:72:11", - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -110,7 +110,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -121,7 +121,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -132,7 +132,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:00:00:00:04", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -148,7 +148,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -159,7 +159,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:02:00:00:04", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -175,7 +175,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -186,7 +186,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -197,7 +197,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -208,7 +208,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -219,7 +219,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -230,7 +230,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -241,7 +241,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -252,7 +252,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -263,7 +263,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -274,7 +274,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -285,7 +285,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:ff", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -296,7 +296,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -307,7 +307,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:60", - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -323,7 +323,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -339,7 +339,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -350,7 +350,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -361,7 +361,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:61", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -372,7 +372,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:62", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -383,7 +383,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:63", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -394,7 +394,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:64", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -405,7 +405,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:65", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -416,7 +416,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:66", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -427,7 +427,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:67", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -438,7 +438,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:68", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -449,7 +449,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:69", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -460,7 +460,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6c", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -471,7 +471,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6d", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -482,7 +482,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6e", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -493,7 +493,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:6f", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -504,7 +504,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:70", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -515,7 +515,7 @@ "lag": [], "link_status": "False", "mac_address": "28:8a:1c:56:72:71", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -526,7 +526,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:72", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -537,7 +537,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -548,7 +548,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:73", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -559,7 +559,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -570,7 +570,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:74", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -581,7 +581,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -592,7 +592,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:75", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -603,7 +603,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -614,7 +614,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -625,7 +625,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -636,7 +636,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:f0", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -647,7 +647,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:c0", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -663,7 +663,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -674,7 +674,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other", "vrf": {} }, @@ -685,7 +685,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other", "vrf": {} }, @@ -696,7 +696,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -712,7 +712,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -728,7 +728,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -739,7 +739,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -750,7 +750,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -761,7 +761,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -772,7 +772,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -783,7 +783,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -794,7 +794,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -805,7 +805,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -816,7 +816,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -827,7 +827,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -838,7 +838,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -849,7 +849,7 @@ "lag": [], "link_status": "True", "mac_address": "02:00:00:00:00:0b", - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -860,7 +860,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1514, + "mtu": "1514", "type": "other", "vrf": {} }, @@ -871,7 +871,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -882,7 +882,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other", "vrf": {} }, @@ -893,7 +893,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other", "vrf": {} }, @@ -904,7 +904,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other", "vrf": {} }, @@ -915,7 +915,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other", "vrf": {} }, @@ -926,7 +926,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": [], + "mtu": "", "type": "other", "vrf": {} }, @@ -937,7 +937,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -948,7 +948,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -959,7 +959,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:b0", - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -970,7 +970,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1532, + "mtu": "1532", "type": "other", "vrf": {} }, @@ -981,7 +981,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -992,7 +992,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -1003,7 +1003,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 9192, + "mtu": "9192", "type": "other", "vrf": {} }, @@ -1014,7 +1014,7 @@ "lag": "ae0", "link_status": "True", "mac_address": "28:8a:1c:56:72:00", - "mtu": 1602, + "mtu": "1602", "type": "other", "vrf": {} }, @@ -1025,7 +1025,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "other", "vrf": {} }, @@ -1036,7 +1036,7 @@ "lag": "ae14", "link_status": "True", "mac_address": "28:8a:1c:56:72:01", - "mtu": 1602, + "mtu": "1602", "type": "other", "vrf": {} }, @@ -1047,7 +1047,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "other", "vrf": {} }, @@ -1058,7 +1058,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:02", - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1074,7 +1074,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1090,7 +1090,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1106,7 +1106,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1122,7 +1122,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1138,7 +1138,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1149,7 +1149,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1160,7 +1160,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:03", - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1171,7 +1171,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1182,7 +1182,7 @@ "lag": "ae11", "link_status": "True", "mac_address": "28:8a:1c:56:72:78", - "mtu": 1602, + "mtu": "1602", "type": "other", "vrf": {} }, @@ -1193,7 +1193,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1602, + "mtu": "1602", "type": "other", "vrf": {} }, @@ -1204,7 +1204,7 @@ "lag": [], "link_status": "True", "mac_address": "28:8a:1c:56:72:84", - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} }, @@ -1215,7 +1215,7 @@ "lag": [], "link_status": "True", "mac_address": [], - "mtu": 1522, + "mtu": "1522", "type": "other", "vrf": {} } diff --git a/nautobot_device_onboarding/tests/test_formatter.py b/nautobot_device_onboarding/tests/test_formatter.py index f60173fe..3d2cc0a8 100755 --- a/nautobot_device_onboarding/tests/test_formatter.py +++ b/nautobot_device_onboarding/tests/test_formatter.py @@ -8,7 +8,11 @@ import yaml from nornir.core.inventory import ConnectionOptions, Defaults, Host -from nautobot_device_onboarding.nornir_plays.formatter import extract_and_post_process, perform_data_extraction +from nautobot_device_onboarding.nornir_plays.formatter import ( + extract_and_post_process, + perform_data_extraction, + normalize_processed_data, +) from nautobot_device_onboarding.nornir_plays.transform import add_platform_parsing_info MOCK_DIR = os.path.join("nautobot_device_onboarding", "tests", "mock") @@ -31,6 +35,55 @@ def find_files_by_prefix(directory, prefix): return matching_files +class TestFormatterNormalizeProccessedData(unittest.TestCase): + """Tests to ensure normalize_processed_data is working.""" + + def test_normalize_processed_data_str_stringified_integer(self): + self.assertEqual(normalize_processed_data("7201", "str"), "7201") + + def test_normalize_processed_data_str__list_index_string(self): + self.assertEqual(normalize_processed_data(["IOS-SW-1"], "str"), "IOS-SW-1") + + def test_normalize_processed_data_str__string(self): + self.assertEqual(normalize_processed_data("Vlan10", "str"), "Vlan10") + + def test_normalize_processed_data_none_stringified_integer(self): + self.assertEqual(normalize_processed_data("7201", None), "7201") + + def test_normalize_processed_data_none_list_index_string(self): + self.assertEqual(normalize_processed_data(["IOS-SW-1"], None), "IOS-SW-1") + + def test_normalize_processed_data_none_string(self): + self.assertEqual(normalize_processed_data("Vlan10", None), "Vlan10") + + def test_normalize_processed_data_none_int(self): + self.assertEqual(normalize_processed_data(10, None), 10) + + def test_normalize_processed_data_empty_none(self): + self.assertEqual(normalize_processed_data([], None), []) + + def test_normalize_processed_data_empty_str(self): + self.assertEqual(normalize_processed_data([], "str"), "") + + def test_normalize_processed_data_empty_dict(self): + self.assertEqual(normalize_processed_data([], "dict"), {}) + + def test_normalize_processed_data_empty_int(self): + self.assertEqual(normalize_processed_data([], "int"), []) + + def test_normalize_processed_data_str_int(self): + self.assertEqual(normalize_processed_data(10, "str"), "10") + + def test_normalize_processed_data_int_str(self): + self.assertEqual(normalize_processed_data("10", "int"), 10) + + def test_normalize_processed_data_int_int(self): + self.assertEqual(normalize_processed_data(10, "int"), 10) + + def test_normalize_processed_data_int_list_index_int(self): + self.assertEqual(normalize_processed_data([881], "int"), 881) + + class TestFormatterExtractAndProcess(unittest.TestCase): """Tests Basic Operations of formatter.""" From 9c4ccb095be23d5d66c2a8e567ae6fed6f913325 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Fri, 28 Jun 2024 19:36:37 +0000 Subject: [PATCH 19/81] error handling for vlans --- nautobot_device_onboarding/jinja_filters.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/nautobot_device_onboarding/jinja_filters.py b/nautobot_device_onboarding/jinja_filters.py index 160859d2..b5f548e8 100755 --- a/nautobot_device_onboarding/jinja_filters.py +++ b/nautobot_device_onboarding/jinja_filters.py @@ -1,5 +1,6 @@ """Filters for Jinja2 PostProcessing.""" +import logging from itertools import chain from django_jinja import library @@ -9,6 +10,9 @@ # https://docs.nautobot.com/projects/core/en/stable/development/apps/api/platform-features/jinja2-filters/ +logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") +logger = logging.getLogger(__name__) + @library.filter def map_interface_type(interface_type): @@ -105,6 +109,10 @@ def interface_mode_logic(item): # pylint: disable=too-many-return-statements def get_vlan_data(item, vlan_mapping, tag_type): # pylint: disable=too-many-return-statements """Get vlan information from an item.""" current_item = item + # If for some reason the vlan mapping does not come back, skip adding vlans. + if isinstance(vlan_mapping, list): + logger.debug(f"Unable to format, vlan dict not returned: vlan_mapping {vlan_mapping}") + return [] if isinstance(item, list) and len(item) == 1: current_item = item[0] int_mode = interface_mode_logic(item) From 904bc54ba5a7416262351c142525ea7d30973f70 Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 8 Jul 2024 13:18:07 -0400 Subject: [PATCH 20/81] first past add cables support --- .../command_mappers/cisco_ios.yml | 6 ++ .../command_mappers/cisco_nxos.yml | 7 +++ .../adapters/sync_network_data_adapters.py | 49 ++++++++++++++- .../models/sync_network_data_models.py | 18 +++++- .../nornir_plays/command_getter.py | 8 ++- .../nornir_plays/formatter.py | 3 + .../fixtures/sync_network_data_fixture.py | 34 +++++++++++ .../expected_result_1.json | 19 +++++- .../expected_result_2.json | 19 +++++- .../expected_result_1.json | 0 .../mock/command_mappers/mock_cisco_ios.yml | 7 +++ .../tests/test_command_getter.py | 61 +++++++++++++++++-- .../tests/test_formatter.py | 3 +- 13 files changed, 223 insertions(+), 11 deletions(-) rename nautobot_device_onboarding/tests/mock/cisco_ios/{sync_network_data_no_options => sync_network_data_with_cables}/expected_result_1.json (92%) rename nautobot_device_onboarding/tests/mock/cisco_ios/{sync_network_data_no_options => sync_network_data_with_cables}/expected_result_2.json (90%) create mode 100644 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index 98012f56..743818a5 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -121,3 +121,9 @@ sync_network_data: jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" + neighbors: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "*.neighbor" + post_processor: "{% set result=[] %}{% for interface in obj %}{{ result.append([local_interface: local_interface, remote_interface: neighbor_interface, remote_device: neighbor_name])}}{% endfor %}{{ result | tojson }}" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index 349a1d0d..7d77c823 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -116,3 +116,10 @@ sync_network_data: jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS, native_vlan: NATIVE_VLAN}" post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" + neighbors: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "" + post_processor: "" + iterable_type: "list" diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 0414cdf3..07835396 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -6,7 +6,7 @@ from diffsync.enum import DiffSyncModelFlags from django.conf import settings from django.core.exceptions import ValidationError -from nautobot.dcim.models import Interface +from nautobot.dcim.models import Cable, Interface from nautobot.ipam.models import VLAN, VRF, IPAddress from nautobot_ssot.contrib import NautobotAdapter from netaddr import EUI, mac_unix_expanded @@ -45,6 +45,7 @@ class SyncNetworkDataNautobotAdapter(FilteredNautobotAdapter): untagged_vlan_to_interface = sync_network_data_models.SyncNetworkDataUnTaggedVlanToInterface lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface + cable = sync_network_data_models.SyncNetworkDataCable primary_ips = None @@ -58,6 +59,7 @@ class SyncNetworkDataNautobotAdapter(FilteredNautobotAdapter): "tagged_vlans_to_interface", "lag_to_interface", "vrf_to_interface", + "cable", ] def _cache_primary_ips(self, device_queryset): @@ -229,6 +231,24 @@ def load_vrf_to_interface(self): network_vrf_to_interface.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST self.add(network_vrf_to_interface) + def load_cables(self): + """ + Load Cables into diffsync store. + + Only cables returned by the CommandGetter job should be synced. + """ + + for cable in Cable.objects.all(): + network_cable = self.cable( + diffsync=self, + termination_a_device=cable.termination_a.device.name, + termination_a_interface=cable.termination_a.name, + termination_b_device=cable.termination_b.device.name, + termination_b_interface=cable.termination_b.name, + ) + network_cable.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(network_cable) + def load(self): """Generic implementation of the load function.""" if not hasattr(self, "top_level") or not self.top_level: @@ -329,6 +349,7 @@ def __init__(self, *args, job, sync=None, **kwargs): untagged_vlan_to_interface = sync_network_data_models.SyncNetworkDataUnTaggedVlanToInterface lag_to_interface = sync_network_data_models.SyncNetworkDataLagToInterface vrf_to_interface = sync_network_data_models.SyncNetworkDataVrfToInterface + cable = sync_network_data_models.SyncNetworkDataCable top_level = [ "ip_address", @@ -340,6 +361,7 @@ def __init__(self, *args, job, sync=None, **kwargs): "tagged_vlans_to_interface", "lag_to_interface", "vrf_to_interface", + "cable", ] def _handle_failed_devices(self, device_data): @@ -652,6 +674,29 @@ def load_vrf_to_interface(self): ) continue + def load_cables(self): + """Load cables into the Diffsync store. + + When loading cables from the network, assume local device is termination a device. + """ + for hostname, device_data in self.job.command_getter_result.items(): + # for interface in device_data["interfaces"]: + for neighbor in device_data["neighbors"].items(): + try: + network_cable = self.cable( + diffsync=self, + termination_a_device=hostname, + termination_a_interface=neighbor["local_interface"], + termination_b_device=neighbor["neighbor_name"], + termination_b_interface=neighbor["neighbor_interface"], + ) + self.add(network_cable) + except Exception as err: + self._handle_general_load_exception( + error=err, hostname=hostname, data=device_data, model_type="cable" + ) + continue + def load(self): """Load network data.""" self.execute_command_getter() @@ -668,3 +713,5 @@ def load(self): self.load_lag_to_interface() if self.job.sync_vrfs: self.load_vrf_to_interface() + if self.job.sync_cables: + self.load_cables() diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index b1b5664c..c296025b 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -11,7 +11,7 @@ from diffsync import exceptions as diffsync_exceptions from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError from nautobot.dcim.choices import InterfaceTypeChoices -from nautobot.dcim.models import Device, Interface, Location +from nautobot.dcim.models import Cable, Device, Interface, Location from nautobot.extras.models import Status from nautobot.ipam.models import VLAN, VRF, IPAddress, IPAddressToInterface from nautobot_ssot.contrib import CustomFieldAnnotation, NautobotModel @@ -563,3 +563,19 @@ def update(self, attrs): # TODO: Cable Model +class SyncNetworkDataCable(FilteredNautobotModel): + """Shared data model representing a cable between two interfaces.""" + + _modelname = "cable" + _model = Cable + _identifiers = ( + "termination_a_device", + "termination_a_interface", + "termination_b_device", + "termination_b_interface", + ) + + termination_a_device: str + termination_a_interface: str + termination_b_device: str + termination_b_interface: str diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 4c961531..126af33c 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -48,7 +48,7 @@ def deduplicate_command_list(data): return unique_list -def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs): +def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables): """Using merged command mapper info and look up all commands that need to be run.""" all_commands = [] for key, value in yaml_parsed_info.items(): @@ -74,6 +74,9 @@ def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs): # If syncing vrfs isn't inscope remove the unneeded commands. if not sync_vrfs and key == "interfaces__vrf": continue + # If syncing cables isn't inscope remove the unneeded commands. + if not sync_cables and key == "neighbors": + continue all_commands.append(command) else: if isinstance(current_root_key, dict): @@ -83,6 +86,9 @@ def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs): # If syncing vrfs isn't inscope remove the unneeded commands. if not sync_vrfs and key == "interfaces__vrf": continue + # If syncing cables isn't inscope remove the unneeded commands. + if not sync_cables and key == "neighbors": + continue # Means their isn't a "nested" structures. e.g 1 command all_commands.append(current_root_key) return deduplicate_command_list(all_commands) diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py index 746fbee0..64031a21 100755 --- a/nautobot_device_onboarding/nornir_plays/formatter.py +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -120,6 +120,7 @@ def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_d result_dict = {} sync_vlans = host.defaults.data.get("sync_vlans", False) sync_vrfs = host.defaults.data.get("sync_vrfs", False) + sync_cables = host.defaults.data.get("sync_cables", False) get_context_from_pre_processor = {} if command_info_dict.get("pre_processor"): for pre_processor_name, field_data in command_info_dict["pre_processor"].items(): @@ -144,6 +145,8 @@ def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_d # If syncing vrfs isn't inscope remove the unneeded commands. if not sync_vrfs and ssot_field == "interfaces__vrf": continue + if not sync_cables and ssot_field == "neighbors": + continue if ssot_field == "pre_processor": continue if isinstance(field_data["commands"], dict): diff --git a/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py index b56b4fdd..38101abe 100644 --- a/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py +++ b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py @@ -92,6 +92,23 @@ "vrf": {"name": "mgmt"}, }, }, + "neighbors": [ + { + "remote_device": "demo-cisco-2", + "local_interface": "GigabitEthernet1", + "remote_interface": "GigabitEthernet1", + }, + { + "remote_device": "demo-cisco-3", + "local_interface": "GigabitEthernet2", + "remote_interface": "GigabitEthernet2", + }, + { + "remote_device": "demo-cisco-4", + "local_interface": "GigabitEthernet3", + "remote_interface": "GigabitEthernet3", + }, + ], }, "demo-cisco-2": { "serial": "9ABUXU5882222", @@ -156,6 +173,23 @@ "vrf": {"name": "mgmt"}, }, }, + "neighbors": [ + { + "remote_device": "demo-cisco-1", + "local_interface": "GigabitEthernet1", + "remote_interface": "GigabitEthernet1", + }, + { + "remote_device": "demo-cisco-3", + "local_interface": "GigabitEthernet2", + "remote_interface": "GigabitEthernet2", + }, + { + "remote_device": "demo-cisco-4", + "local_interface": "GigabitEthernet3", + "remote_interface": "GigabitEthernet3", + }, + ], }, } failed_device = {"demo-cisco-3": {"failed": True, "failed_reason": "Authentication failure"}} diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_1.json similarity index 92% rename from nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json rename to nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_1.json index d4e5073b..05309cd3 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_1.json @@ -271,5 +271,22 @@ "type": "virtual" } }, - "serial": "FOC2341Y2CQ" + "serial": "FOC2341Y2CQ", + "neighbors": [ + { + "remote_device": "demo-cisco-2", + "local_interface": "GigabitEthernet1", + "remote_interface": "GigabitEthernet1" + }, + { + "remote_device": "demo-cisco-3", + "local_interface": "GigabitEthernet2", + "remote_interface": "GigabitEthernet2" + }, + { + "remote_device": "demo-cisco-4", + "local_interface": "GigabitEthernet3", + "remote_interface": "GigabitEthernet3" + } + ] } \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_2.json similarity index 90% rename from nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json rename to nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_2.json index 9b4c9258..a788917b 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_2.json @@ -196,5 +196,22 @@ "type": "virtual" } }, - "serial": "FOC1541W2SP" + "serial": "FOC1541W2SP", + "neighbors": [ + { + "remote_device": "demo-cisco-1", + "local_interface": "GigabitEthernet1", + "remote_interface": "GigabitEthernet1" + }, + { + "remote_device": "demo-cisco-3", + "local_interface": "GigabitEthernet2", + "remote_interface": "GigabitEthernet2" + }, + { + "remote_device": "demo-cisco-4", + "local_interface": "GigabitEthernet3", + "remote_interface": "GigabitEthernet3" + } + ] } \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json new file mode 100644 index 00000000..e69de29b diff --git a/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml b/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml index 60d6a241..25b4458a 100755 --- a/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml +++ b/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml @@ -116,3 +116,10 @@ sync_network_data: jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" post_processor: "{% if obj | length > 0 %}{{ vlan_map | selectattr('id', 'eq', obj[0]) | list | tojson }}{% else %}{{ obj }}{% endif %}" iterable_type: "dict" + neighbors: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "[*].interface" + post_processor: "{% set result=[] %}{% for neighbor in obj %}{{ result.append({'local_interface': local_interface, 'remote_device': 'neighbor_name', 'remote_interface': neighbor_interface}) or '' }}{% endfor %}{{ result | tojson }}" + iterable_type: "list" diff --git a/nautobot_device_onboarding/tests/test_command_getter.py b/nautobot_device_onboarding/tests/test_command_getter.py index 9ac90c8c..2f68575b 100755 --- a/nautobot_device_onboarding/tests/test_command_getter.py +++ b/nautobot_device_onboarding/tests/test_command_getter.py @@ -20,7 +20,10 @@ def setUp(self): def test_deduplicate_command_list_sync_devices(self): """Test dedup on sync_devices ssot job.""" get_commands_to_run = _get_commands_to_run( - self.expected_data["sync_devices"], sync_vlans=False, sync_vrfs=False + self.expected_data["sync_devices"], + sync_vlans=False, + sync_vrfs=False, + sync_cables=False, ) expected_commands_to_run = [ {"command": "show version", "jpath": "[*].hostname", "parser": "textfsm"}, @@ -36,7 +39,10 @@ def test_deduplicate_command_list_sync_devices(self): def test_deduplicate_command_list_sync_data_no_vrfs_no_vlans(self): """Test dedup on sync_network_data ssot job.""" get_commands_to_run = _get_commands_to_run( - self.expected_data["sync_network_data"], sync_vlans=False, sync_vrfs=False + self.expected_data["sync_network_data"], + sync_vlans=False, + sync_vrfs=False, + sync_cables=False, ) expected_commands_to_run = [ {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, @@ -67,7 +73,10 @@ def test_deduplicate_command_list_sync_data_no_vrfs_no_vlans(self): def test_deduplicate_command_list_sync_data_with_vrfs_no_vlans(self): """Test dedup on sync_network_data ssot job.""" get_commands_to_run = _get_commands_to_run( - self.expected_data["sync_network_data"], sync_vlans=False, sync_vrfs=True + self.expected_data["sync_network_data"], + sync_vlans=False, + sync_vrfs=True, + sync_cables=False, ) expected_commands_to_run = [ {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, @@ -105,7 +114,10 @@ def test_deduplicate_command_list_sync_data_with_vrfs_no_vlans(self): def test_deduplicate_command_list_sync_data_no_vrfs_with_vlans(self): """Test dedup on sync_network_data ssot job.""" get_commands_to_run = _get_commands_to_run( - self.expected_data["sync_network_data"], sync_vlans=True, sync_vrfs=False + self.expected_data["sync_network_data"], + sync_vlans=True, + sync_vrfs=False, + sync_cables=False, ) expected_commands_to_run = [ {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, @@ -136,7 +148,10 @@ def test_deduplicate_command_list_sync_data_no_vrfs_with_vlans(self): def test_deduplicate_command_list_sync_data_with_vrfs_and_vlans(self): """Test dedup on sync_network_data ssot job.""" get_commands_to_run = _get_commands_to_run( - self.expected_data["sync_network_data"], sync_vlans=True, sync_vrfs=True + self.expected_data["sync_network_data"], + sync_vlans=True, + sync_vrfs=True, + sync_cables=False, ) expected_commands_to_run = [ {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, @@ -170,3 +185,39 @@ def test_deduplicate_command_list_sync_data_with_vrfs_and_vlans(self): }, ] self.assertEqual(get_commands_to_run, expected_commands_to_run) + + def test_deduplicate_command_list_sync_data_cables(self): + get_commands_to_run = _get_commands_to_run( + self.expected_data["sync_network_data"], sync_vlans=False, sync_vrfs=False, sync_cables=True + ) + expected_commands_to_run = [ + {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, + {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, + { + "command": "show interfaces", + "parser": "textfsm", + "jpath": "[*].interface", + "post_processor": "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}", + }, + { + "command": "show interfaces switchport", + "parser": "textfsm", + "jpath": "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, trunking_vlans: trunking_vlans}", + "post_processor": "{{ obj | interface_mode_logic }}", + "iterable_type": "str", + }, + { + "command": "show etherchannel summary", + "parser": "textfsm", + "jpath": "[?contains(@.member_interface, `{{ current_key | abbreviated_interface_name }}`)].bundle_name", + "post_processor": "{% if obj | length > 0 %}{{ obj[0] | canonical_interface_name }}{% else %}{{ obj }}{% endif %}", + "iterable_type": "str", + }, + { + "command": "show cdp neighbors detail", + "parser": "textfsm", + "jpath": "*.neighbor", + "post_processor": "{% set result=[] %}{% for interface in obj %}{{ result.append([local_interface: local_interface, remote_interface: neighbor_interface, remote_device: neighbor_name])}}{% endfor %}{{ result | tojson }}", + }, + ] + self.assertEqual(get_commands_to_run, expected_commands_to_run) diff --git a/nautobot_device_onboarding/tests/test_formatter.py b/nautobot_device_onboarding/tests/test_formatter.py index 3d2cc0a8..4687a6be 100755 --- a/nautobot_device_onboarding/tests/test_formatter.py +++ b/nautobot_device_onboarding/tests/test_formatter.py @@ -108,13 +108,14 @@ def setUp(self): platform="platform", ) }, - defaults=Defaults(data={"sync_vlans": False, "sync_vrfs": False}), + defaults=Defaults(data={"sync_vlans": False, "sync_vrfs": False, "sync_cables": False}), ) def test_perform_data_extraction_simple_host_values(self): self.assertEqual("198.51.100.1", self.host.name) self.assertFalse(self.host.defaults.data.get("sync_vlans")) self.assertFalse(self.host.defaults.data.get("sync_vrfs")) + self.assertFalse(self.host.defaults.data.get("sync_cablesß")) def test_extract_and_post_process_empty_command_result_str(self): parsed_command_output = "" From 7be49b39bd6eaa8a3fbb4136884ab26e5615786f Mon Sep 17 00:00:00 2001 From: scetron Date: Wed, 10 Jul 2024 10:41:16 -0400 Subject: [PATCH 21/81] fix typos --- docs/user/app_detailed_design.md | 10 +++++----- docs/user/app_use_cases.md | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/user/app_detailed_design.md b/docs/user/app_detailed_design.md index ccfa3967..cbf64a68 100755 --- a/docs/user/app_detailed_design.md +++ b/docs/user/app_detailed_design.md @@ -17,12 +17,12 @@ To learn how to extend the app, or update its default YAML definitions visit [Ex ## How the SSoT **Sync Devices From Network** Job Works 1. The job is executed with inputs selected. - - List of comma seperated IP/DNS names is provided. + - List of comma separated IP/DNS names is provided. - Other required fields are selected in the job inputs form. 2. The SSoT framework loads the Nautobot adapter information. -3. The SSoT frameworks network adapater `load()` method calls nornir functionality. - - The job inputs data is passed to the InitNornir initializer, because we only have basic information a custom `EmptyInventory` Nornir inventory plugin is packaged with the App. This get initialized in the `InitNornir` function, but actually initialzes a true inventory that is empty. +3. The SSoT frameworks network adapter `load()` method calls nornir functionality. + - The job inputs data is passed to the InitNornir initializer, because we only have basic information a custom `EmptyInventory` Nornir inventory plugin is packaged with the App. This get initialized in the `InitNornir` function, but actually initializes a true inventory that is empty. - Since `Platform` information may need to be auto-detected before adding a Nornir `Host` object to the inventory, a `create_inventory` function is executed that uses the SSH-Autodetect via Netmiko to try to determine the platform so it can be injected into the `Host` object. - Finally, all the platform specific commands to run, along with all the jpath, `post_processor` information loaded from the platform specific YAML files must be injected into the Nornir data object to be accessible later in the extract, transform functions. 4. Within the context of a Nornir `with_processor` context manager call the `netmiko_send_commands` Nornir task. @@ -30,7 +30,7 @@ To learn how to extend the app, or update its default YAML definitions visit [Ex 5. Utilize native Nornir Processor to overload functionality on `task_instance_completed()` to run command outputs through extract and transformation functions. - This essentially is our "ET" portion of a "ETL" process. - Next, the JSON result from the show command after the parser executes (E.g. textfsm), gets run through the jdiff function `extract_data_from_json()` with the data and the `jpath` from the YAML file definition. - - Finally, an optional `post_processor` jinja2 capable execution can further transform the data for that command before passing it to finish the SSoT syncronizaton. + - Finally, an optional `post_processor` jinja2 capable execution can further transform the data for that command before passing it to finish the SSoT synchronization. ## How the SSoT **Sync Network Data From Network** Job Works @@ -48,7 +48,7 @@ To learn how to extend the app, or update its default YAML definitions visit [Ex 5. Utilize native Nornir Processor to overload functionality on `subtask_instance_completed()` to run command outputs through extract and transformation functions. - This essentially is our "ET" portion of a "ETL" process. - Next, the JSON result from the show command after the parser executes (E.g. textfsm), gets run through the jdiff function `extract_data_from_json()` with the data and the `jpath` from the YAML file definition. - - Finally, an optional `post_processor` jinja2 capable execution can further transform the data for that command before passing it to finish the SSoT syncronizaton. + - Finally, an optional `post_processor` jinja2 capable execution can further transform the data for that command before passing it to finish the SSoT synchronization. ## Detailed Design Diagram diff --git a/docs/user/app_use_cases.md b/docs/user/app_use_cases.md index 65d48c1a..4f57e998 100755 --- a/docs/user/app_use_cases.md +++ b/docs/user/app_use_cases.md @@ -108,7 +108,7 @@ Optional Fields: ### Enhance Existing Device -A existing devices data can be expanded to include additonal objects by: +A existing devices data can be expanded to include additional objects by: - A SSoT job execution. - Via Jobs menu @@ -141,6 +141,6 @@ Required Fields: ## Using Git(Datasources) to Override the Apps Defaults -By utilizing the Nautobot core feature `Datasource` the command mappers, jpaths, post_processors for each platform can be overriden. This also gives an easy way for a user to add platform support without having to get those fixes directly upstreamed into this application. +By utilizing the Nautobot core feature `Datasource` the command mappers, jpaths, post_processors for each platform can be overridden. This also gives an easy way for a user to add platform support without having to get those fixes directly upstreamed into this application. The format of these YAML files are and how to extend this application is covered in [App YAML Overrides](./app_yaml_overrides.md). From 22e3ce86ccc030e1d9d14624b08131a75adaa86c Mon Sep 17 00:00:00 2001 From: scetron Date: Wed, 10 Jul 2024 10:41:27 -0400 Subject: [PATCH 22/81] add sync cables to job --- nautobot_device_onboarding/jobs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 0e9ef175..306e8041 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -533,6 +533,7 @@ class Meta: debug = BooleanVar(description="Enable for more verbose logging.") sync_vlans = BooleanVar(default=False, description="Sync VLANs and interface VLAN assignments.") sync_vrfs = BooleanVar(default=False, description="Sync VRFs and interface VRF assignments.") + sync_cables = BooleanVar(default=False, description="Sync cables between interfaces via a LLDP or CDP.") namespace = ObjectVar( model=Namespace, required=True, description="The namespace for all IP addresses created or updated in the sync." ) From 817711183431107e9e3374611c119dede38256e5 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:07:44 -0400 Subject: [PATCH 23/81] update parsing/yaml --- .../command_mappers/cisco_ios.yml | 15 +++++++++++++-- .../command_mappers/cisco_nxos.yml | 19 +++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index 743818a5..9f908a88 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -121,9 +121,20 @@ sync_network_data: jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" - neighbors: + cables: + root_key: true commands: - command: "show cdp neighbors detail" parser: "textfsm" - jpath: "*.neighbor" + jpath: "[*].local_interface" post_processor: "{% set result=[] %}{% for interface in obj %}{{ result.append([local_interface: local_interface, remote_interface: neighbor_interface, remote_device: neighbor_name])}}{% endfor %}{{ result | tojson }}" + cables__remote_interface: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "[?local_interface=='{{ current_key }}'].neighbor_interface" + cables__remote_device: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "[?local_interface=='{{ current_key }}'].neighbor_name" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index 7d77c823..506fc6cd 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -116,10 +116,21 @@ sync_network_data: jpath: "[?INTERFACE=='{{ current_key }}'].{admin_mode: MODE, mode: MODE, access_vlan: ACCESS_VLAN, trunking_vlans: TRUNKING_VLANS, native_vlan: NATIVE_VLAN}" post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" - neighbors: + cables: + root_key: true commands: - command: "show cdp neighbors detail" parser: "textfsm" - jpath: "" - post_processor: "" - iterable_type: "list" + jpath: "[*].local_interface" + post_processor: "{% set result={} %}{% for local_interface in obj %}{{ result.update({local_interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" + cables__remote_interface: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "[?local_interface=='{{ current_key }}'].neighbor_interface" + cables__remote_device: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "[?local_interface=='{{ current_key }}'].neighbor_name" + From d68e5a1dd856090c8fd7ee2581c453c35a7ece75 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:08:12 -0400 Subject: [PATCH 24/81] add sync cables to job --- nautobot_device_onboarding/jobs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 306e8041..3b161abe 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -607,6 +607,7 @@ def run( platform, sync_vlans, sync_vrfs, + sync_cables, *args, **kwargs, ): @@ -624,6 +625,7 @@ def run( self.platform = platform self.sync_vlans = sync_vlans self.sync_vrfs = sync_vrfs + self.sync_cables = sync_cables # Check for last_network_data_sync CustomField if self.debug: @@ -673,7 +675,7 @@ def run( if len(filtered_devices_names) <= 300: self.logger.info(f"Devices: {filtered_devices_names}") else: - self.logger.warning("Over 300 devies were selected to sync") + self.logger.warning("Over 300 devices were selected to sync") self.job_result.task_kwargs = { "debug": debug, @@ -684,6 +686,7 @@ def run( "device_role": device_role, "sync_vlans": sync_vlans, "sync_vrfs": sync_vrfs, + "sync_cables": sync_cables, } super().run(dryrun, memory_profiling, *args, **kwargs) From 0268611b886d8818a4dda5cc4c76ebe1066f35ea Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:08:27 -0400 Subject: [PATCH 25/81] edit --- docs/user/app_getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/app_getting_started.md b/docs/user/app_getting_started.md index 0c012bed..ae2f4d33 100644 --- a/docs/user/app_getting_started.md +++ b/docs/user/app_getting_started.md @@ -32,7 +32,7 @@ Navigate to the Device Onboarding Job: Jobs > Perform Device Onboarding (origina or -Navigate to the SSoT dashboard and run `Sync Devices` to get basic device and information onboarding, followed by `Sync Network Data` to add additonal details from the network to these devices. E.g. Interfaces, IPs, VRFs, VLANs. +Navigate to the SSoT dashboard and run `Sync Devices` to get basic device and information onboarding, followed by `Sync Network Data` to add additional details from the network to these devices. E.g. Interfaces, IPs, VRFs, VLANs. ## What are the next steps? From b6767ef1a8134d68c5c94d07bc260c90fd1ca7b4 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:08:47 -0400 Subject: [PATCH 26/81] update model --- .../models/sync_network_data_models.py | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index c296025b..cd03e44e 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -569,13 +569,30 @@ class SyncNetworkDataCable(FilteredNautobotModel): _modelname = "cable" _model = Cable _identifiers = ( - "termination_a_device", - "termination_a_interface", - "termination_b_device", - "termination_b_interface", + "termination_a__app_label", + "termination_a__model", + "termination_a__device__name", + "termination_a__name", + "termination_b__app_label", + "termination_b__model", + "termination_b__device__name", + "termination_b__name", + "status__name", ) - termination_a_device: str - termination_a_interface: str - termination_b_device: str - termination_b_interface: str + termination_a__app_label: str + termination_a__model: str + termination_a__device__name: str + termination_a__name: str + termination_b__app_label: str + termination_b__model: str + termination_b__device__name: str + termination_b__name: str + status__name: str + + # @classmethod + # def create(cls, diffsync, ids, attrs): + # """Create a new Cable object.""" + + # # if the same termination pair exists in reverse, don't create + # return super().create(diffsync, ids, attrs) From 76a62c840c75f13589a07a54c639c1600c040dd6 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:09:01 -0400 Subject: [PATCH 27/81] change neighbors to models --- nautobot_device_onboarding/nornir_plays/command_getter.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 126af33c..86161273 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -75,7 +75,7 @@ def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables): if not sync_vrfs and key == "interfaces__vrf": continue # If syncing cables isn't inscope remove the unneeded commands. - if not sync_cables and key == "neighbors": + if not sync_cables and key == "cables": continue all_commands.append(command) else: @@ -87,7 +87,7 @@ def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables): if not sync_vrfs and key == "interfaces__vrf": continue # If syncing cables isn't inscope remove the unneeded commands. - if not sync_cables and key == "neighbors": + if not sync_cables and key == "cables": continue # Means their isn't a "nested" structures. e.g 1 command all_commands.append(current_root_key) @@ -109,6 +109,7 @@ def netmiko_send_commands(task: Task, command_getter_yaml_data: Dict, command_ge command_getter_yaml_data[task.host.platform][command_getter_job], orig_job_kwargs.get("sync_vlans", False), orig_job_kwargs.get("sync_vrfs", False), + orig_job_kwargs.get("sync_cables", False), ) # All commands in this for loop are running within 1 device connection. for result_idx, command in enumerate(commands): @@ -283,6 +284,7 @@ def sync_network_data_command_getter(job_result, log_level, kwargs): "network_driver_mappings": SUPPORTED_NETWORK_DRIVERS, "sync_vlans": kwargs["sync_vlans"], "sync_vrfs": kwargs["sync_vrfs"], + "sync_cables": kwargs["sync_cables"], }, }, }, From 415410b0ce1b315feeb32b439b01eb9f9d310bc3 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:09:26 -0400 Subject: [PATCH 28/81] change neighbors to models --- nautobot_device_onboarding/nornir_plays/formatter.py | 2 +- .../tests/fixtures/sync_network_data_fixture.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py index 64031a21..41b0d832 100755 --- a/nautobot_device_onboarding/nornir_plays/formatter.py +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -145,7 +145,7 @@ def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_d # If syncing vrfs isn't inscope remove the unneeded commands. if not sync_vrfs and ssot_field == "interfaces__vrf": continue - if not sync_cables and ssot_field == "neighbors": + if not sync_cables and ssot_field == "cables": continue if ssot_field == "pre_processor": continue diff --git a/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py index 38101abe..624a42a6 100644 --- a/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py +++ b/nautobot_device_onboarding/tests/fixtures/sync_network_data_fixture.py @@ -92,7 +92,7 @@ "vrf": {"name": "mgmt"}, }, }, - "neighbors": [ + "cables": [ { "remote_device": "demo-cisco-2", "local_interface": "GigabitEthernet1", @@ -173,7 +173,7 @@ "vrf": {"name": "mgmt"}, }, }, - "neighbors": [ + "cables": [ { "remote_device": "demo-cisco-1", "local_interface": "GigabitEthernet1", From 1378e84a9c234c4a59ed0d6bca92341b3d87da46 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:09:38 -0400 Subject: [PATCH 29/81] change test to match jpath --- nautobot_device_onboarding/tests/test_command_getter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/tests/test_command_getter.py b/nautobot_device_onboarding/tests/test_command_getter.py index 2f68575b..8821d152 100755 --- a/nautobot_device_onboarding/tests/test_command_getter.py +++ b/nautobot_device_onboarding/tests/test_command_getter.py @@ -216,7 +216,7 @@ def test_deduplicate_command_list_sync_data_cables(self): { "command": "show cdp neighbors detail", "parser": "textfsm", - "jpath": "*.neighbor", + "jpath": "[*].local_interface", "post_processor": "{% set result=[] %}{% for interface in obj %}{{ result.append([local_interface: local_interface, remote_interface: neighbor_interface, remote_device: neighbor_name])}}{% endfor %}{{ result | tojson }}", }, ] From 2cc95bd99d2c5fb3e737bfe46e938bede8bde9c7 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 14:10:08 -0400 Subject: [PATCH 30/81] adjust skip unmatched src --- .../adapters/sync_network_data_adapters.py | 85 ++++++++++++++----- 1 file changed, 66 insertions(+), 19 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 07835396..14d66b04 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -128,7 +128,7 @@ def load_vlans(self): location__name=vlan.location.name if vlan.location else "", ) try: - network_vlan.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + network_vlan.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_SRC self.add(network_vlan) except diffsync.exceptions.ObjectAlreadyExists: pass @@ -238,16 +238,37 @@ def load_cables(self): Only cables returned by the CommandGetter job should be synced. """ - for cable in Cable.objects.all(): + for cable in self.job.devices_to_load.get_cables(): + if cable.termination_a.device.name < cable.termination_b.device.name: + termination_a_device = cable.termination_a.device.name + termination_a_interface = cable.termination_a.name + termination_b_device = cable.termination_b.device.name + termination_b_interface = cable.termination_b.name + else: + termination_a_device = cable.termination_b.device.name + termination_a_interface = cable.termination_b.name + termination_b_device = cable.termination_a.device.name + termination_b_interface = cable.termination_a.name + network_cable = self.cable( diffsync=self, - termination_a_device=cable.termination_a.device.name, - termination_a_interface=cable.termination_a.name, - termination_b_device=cable.termination_b.device.name, - termination_b_interface=cable.termination_b.name, + status__name="Connected", + termination_a__app_label="dcim", + termination_a__model="interface", + termination_a__device__name=termination_a_device, + termination_a__name=termination_a_interface, + termination_b__app_label="dcim", + termination_b__model="interface", + termination_b__device__name=termination_b_device, + termination_b__name=termination_b_interface, ) network_cable.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST - self.add(network_cable) + try: + self.add(network_cable) + if self.job.debug: + self.job.logger.debug(f"Loaded Cable: {network_cable}") + except diffsync.exceptions.ObjectAlreadyExists: + continue def load(self): """Generic implementation of the load function.""" @@ -413,14 +434,14 @@ def execute_command_getter(self): # verify data returned is a dict data_type_check = diffsync_utils.check_data_type(result) if self.job.debug: - self.job.logger.debug(f"CommandGetter data type check resut: {data_type_check}") + self.job.logger.debug(f"CommandGetter data type check result: {data_type_check}") if data_type_check: self._handle_failed_devices(device_data=result) else: self.job.logger.error( "Data returned from CommandGetter is not the correct type. No devices will be onboarded" ) - raise ValidationError("Unexpected data returend from CommandGetter.") + raise ValidationError("Unexpected data returned from CommandGetter.") def _process_mac_address(self, mac_address): """Convert a mac address to match the value stored by Nautobot.""" @@ -675,22 +696,48 @@ def load_vrf_to_interface(self): continue def load_cables(self): - """Load cables into the Diffsync store. + """Load cables into the Diffsync store.""" - When loading cables from the network, assume local device is termination a device. - """ for hostname, device_data in self.job.command_getter_result.items(): - # for interface in device_data["interfaces"]: - for neighbor in device_data["neighbors"].items(): + if self.job.debug: + self.job.logger.debug(f"Loading Cables from {hostname}") + self.job.logger.debug(f"Cable Data: {device_data['cables']}") + + for local_interface, neighbor_data in device_data["cables"].items(): + self.job.logger.debug(f"Local Interface: {local_interface}, Neighbor Data: {neighbor_data}") + + # always put the alphabetically first device as termination a + if hostname < neighbor_data["remote_device"]: + termination_a_device = hostname + termination_a_interface = local_interface + termination_b_device = neighbor_data["remote_device"] + termination_b_interface = neighbor_data["remote_interface"] + else: + termination_a_device = neighbor_data["remote_device"] + termination_a_interface = neighbor_data["remote_interface"] + termination_b_device = hostname + termination_b_interface = local_interface + try: network_cable = self.cable( diffsync=self, - termination_a_device=hostname, - termination_a_interface=neighbor["local_interface"], - termination_b_device=neighbor["neighbor_name"], - termination_b_interface=neighbor["neighbor_interface"], + status__name="Connected", # ask for default status in the job form + termination_a__app_label="dcim", + termination_a__model="interface", + termination_a__device__name=termination_a_device, + termination_a__name=termination_a_interface, + termination_b__app_label="dcim", + termination_b__model="interface", + termination_b__device__name=termination_b_device, + termination_b__name=termination_b_interface, ) - self.add(network_cable) + try: + self.add(network_cable) + if self.job.debug: + self.job.logger.debug(f"Loaded Cable: {network_cable}") + except diffsync.exceptions.ObjectAlreadyExists: + # object already in the diffsync store. + pass except Exception as err: self._handle_general_load_exception( error=err, hostname=hostname, data=device_data, model_type="cable" From f43c13af41aa4cd879ac13ceee69b60f2102227f Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 11 Jul 2024 16:37:21 -0400 Subject: [PATCH 31/81] linting --- .../command_mappers/arista_eos.yml | 10 +++++----- .../command_mappers/cisco_nxos.yml | 1 - .../diffsync/adapters/sync_network_data_adapters.py | 4 +--- nautobot_device_onboarding/jobs.py | 1 - 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/arista_eos.yml b/nautobot_device_onboarding/command_mappers/arista_eos.yml index 6e5f3421..cf60f39e 100755 --- a/nautobot_device_onboarding/command_mappers/arista_eos.yml +++ b/nautobot_device_onboarding/command_mappers/arista_eos.yml @@ -45,32 +45,32 @@ sync_network_data: commands: - command: "show interfaces | json" parser: "none" - jpath: "interfaces.*.name" # when root_key=true this extracted value is what becomes interable in keys using __ under `current_key`. + jpath: "interfaces.*.name" # when root_key=true this extracted value is what becomes iterable in keys using __ under `current_key`. post_processor: "{% set result={} %}{% for interface in obj %}{{ result.update({interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" interfaces__type: commands: - command: "show interfaces | json" parser: "none" - jpath: 'interfaces."{{ current_key }}".hardware' # yamllint disable-line rule:quoted-strings + jpath: 'interfaces."{{ current_key }}".hardware' # yamllint disable-line rule:quoted-strings post_processor: "{{ obj | map_interface_type }}" interfaces__ip_addresses: commands: - command: "show interfaces | json" parser: "none" - jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen }][]' # yamllint disable-line rule:quoted-strings + jpath: 'interfaces."{{ current_key }}".interfaceAddress[].[{ip_address: primaryIp.address, prefix_length: primaryIp.maskLen }][]' # yamllint disable-line rule:quoted-strings post_processor: "{{ obj | tojson }}" interfaces__mtu: commands: - command: "show interfaces | json" parser: "none" - jpath: 'interfaces."{{ current_key }}".[mtu]' # yamllint disable-line rule:quoted-strings + jpath: 'interfaces."{{ current_key }}".[mtu]' # yamllint disable-line rule:quoted-strings post_processor: "{{ obj[0] }}" iterable_type: "str" interfaces__mac_address: commands: - command: "show interfaces | json" parser: "none" - jpath: 'interfaces."{{ current_key }}".physicalAddress' # yamllint disable-line rule:quoted-strings + jpath: 'interfaces."{{ current_key }}".physicalAddress' # yamllint disable-line rule:quoted-strings interfaces__description: commands: - command: "show interfaces | json" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index 506fc6cd..7921dc75 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -133,4 +133,3 @@ sync_network_data: - command: "show cdp neighbors detail" parser: "textfsm" jpath: "[?local_interface=='{{ current_key }}'].neighbor_name" - diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 14d66b04..9aaeea60 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -6,7 +6,7 @@ from diffsync.enum import DiffSyncModelFlags from django.conf import settings from django.core.exceptions import ValidationError -from nautobot.dcim.models import Cable, Interface +from nautobot.dcim.models import Interface from nautobot.ipam.models import VLAN, VRF, IPAddress from nautobot_ssot.contrib import NautobotAdapter from netaddr import EUI, mac_unix_expanded @@ -237,7 +237,6 @@ def load_cables(self): Only cables returned by the CommandGetter job should be synced. """ - for cable in self.job.devices_to_load.get_cables(): if cable.termination_a.device.name < cable.termination_b.device.name: termination_a_device = cable.termination_a.device.name @@ -697,7 +696,6 @@ def load_vrf_to_interface(self): def load_cables(self): """Load cables into the Diffsync store.""" - for hostname, device_data in self.job.command_getter_result.items(): if self.job.debug: self.job.logger.debug(f"Loading Cables from {hostname}") diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 3b161abe..3a4bb16c 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -631,7 +631,6 @@ def run( if self.debug: self.logger.debug("Checking for last_network_data_sync custom field") try: - cf = CustomField.objects.get(key="last_network_data_sync") except ObjectDoesNotExist: cf, _ = CustomField.objects.get_or_create( From 910b99146f3ed6ed2a09a2fada368827dd6856da Mon Sep 17 00:00:00 2001 From: Stephen Corry Date: Thu, 11 Jul 2024 18:06:25 -0400 Subject: [PATCH 32/81] Update nautobot_device_onboarding/tests/test_formatter.py Co-authored-by: Jeff Kala <48843785+jeffkala@users.noreply.github.com> --- nautobot_device_onboarding/tests/test_formatter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/tests/test_formatter.py b/nautobot_device_onboarding/tests/test_formatter.py index 4687a6be..44096ec2 100755 --- a/nautobot_device_onboarding/tests/test_formatter.py +++ b/nautobot_device_onboarding/tests/test_formatter.py @@ -115,7 +115,7 @@ def test_perform_data_extraction_simple_host_values(self): self.assertEqual("198.51.100.1", self.host.name) self.assertFalse(self.host.defaults.data.get("sync_vlans")) self.assertFalse(self.host.defaults.data.get("sync_vrfs")) - self.assertFalse(self.host.defaults.data.get("sync_cablesß")) + self.assertFalse(self.host.defaults.data.get("sync_cables")) def test_extract_and_post_process_empty_command_result_str(self): parsed_command_output = "" From 9c7577430995f081f4a8d3d3dc569cff93be76b2 Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 12 Jul 2024 14:11:42 -0400 Subject: [PATCH 33/81] simplify cables command mapper --- .../command_mappers/cisco_ios.yml | 13 +------------ .../command_mappers/cisco_nxos.yml | 13 +------------ .../adapters/sync_network_data_adapters.py | 19 ++++++++++++------- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index 9f908a88..b4b2cbf2 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -126,15 +126,4 @@ sync_network_data: commands: - command: "show cdp neighbors detail" parser: "textfsm" - jpath: "[*].local_interface" - post_processor: "{% set result=[] %}{% for interface in obj %}{{ result.append([local_interface: local_interface, remote_interface: neighbor_interface, remote_device: neighbor_name])}}{% endfor %}{{ result | tojson }}" - cables__remote_interface: - commands: - - command: "show cdp neighbors detail" - parser: "textfsm" - jpath: "[?local_interface=='{{ current_key }}'].neighbor_interface" - cables__remote_device: - commands: - - command: "show cdp neighbors detail" - parser: "textfsm" - jpath: "[?local_interface=='{{ current_key }}'].neighbor_name" + jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index 7921dc75..b5a93cf5 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -121,15 +121,4 @@ sync_network_data: commands: - command: "show cdp neighbors detail" parser: "textfsm" - jpath: "[*].local_interface" - post_processor: "{% set result={} %}{% for local_interface in obj %}{{ result.update({local_interface: {}}) or '' }}{% endfor %}{{ result | tojson }}" - cables__remote_interface: - commands: - - command: "show cdp neighbors detail" - parser: "textfsm" - jpath: "[?local_interface=='{{ current_key }}'].neighbor_interface" - cables__remote_device: - commands: - - command: "show cdp neighbors detail" - parser: "textfsm" - jpath: "[?local_interface=='{{ current_key }}'].neighbor_name" + jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 9aaeea60..71f80e47 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -10,6 +10,7 @@ from nautobot.ipam.models import VLAN, VRF, IPAddress from nautobot_ssot.contrib import NautobotAdapter from netaddr import EUI, mac_unix_expanded +from netutils.interface import canonical_interface_name from nautobot_device_onboarding.diffsync.models import sync_network_data_models from nautobot_device_onboarding.nornir_plays.command_getter import sync_network_data_command_getter @@ -701,18 +702,22 @@ def load_cables(self): self.job.logger.debug(f"Loading Cables from {hostname}") self.job.logger.debug(f"Cable Data: {device_data['cables']}") - for local_interface, neighbor_data in device_data["cables"].items(): - self.job.logger.debug(f"Local Interface: {local_interface}, Neighbor Data: {neighbor_data}") + for neighbor_data in device_data["cables"]: + local_interface = canonical_interface_name(neighbor_data["local_interface"]) + remote_interface = canonical_interface_name(neighbor_data["remote_interface"]) + remote_device = neighbor_data["remote_device"] + if self.job.debug: + self.job.logger.debug(f"Neighbor Data: {neighbor_data}") # always put the alphabetically first device as termination a - if hostname < neighbor_data["remote_device"]: + if hostname < remote_device: termination_a_device = hostname termination_a_interface = local_interface - termination_b_device = neighbor_data["remote_device"] - termination_b_interface = neighbor_data["remote_interface"] + termination_b_device = remote_device + termination_b_interface = remote_interface else: - termination_a_device = neighbor_data["remote_device"] - termination_a_interface = neighbor_data["remote_interface"] + termination_a_device = remote_device + termination_a_interface = remote_interface termination_b_device = hostname termination_b_interface = local_interface From f73da7793bd70f7fba1891da2d91b6866fe787b0 Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 12 Jul 2024 14:14:10 -0400 Subject: [PATCH 34/81] fix ruff unsupported default action --- tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks.py b/tasks.py index 9ca1b536..c5b4be23 100644 --- a/tasks.py +++ b/tasks.py @@ -703,7 +703,7 @@ def autoformat(context): "output_format": "see https://docs.astral.sh/ruff/settings/#output-format", }, ) -def ruff(context, action="lint", fix=False, output_format="text"): +def ruff(context, action="lint", fix=False, output_format="full"): """Run ruff to perform code formatting and/or linting.""" if action != "lint": command = "ruff format" From f5c4ce068e087b1d99814cfcf25e8abdc08a2487 Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 12 Jul 2024 14:32:08 -0400 Subject: [PATCH 35/81] add cables schema --- .../nornir_plays/schemas.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/nautobot_device_onboarding/nornir_plays/schemas.py b/nautobot_device_onboarding/nornir_plays/schemas.py index ae8b3972..2d999eb2 100755 --- a/nautobot_device_onboarding/nornir_plays/schemas.py +++ b/nautobot_device_onboarding/nornir_plays/schemas.py @@ -85,6 +85,18 @@ def sync_network_data_schema(json_schema=True): }, "description": "List of tagged VLANs associated with the interface (optional)", }, + "cables": { + "type": "object", + "items": { + "type": "object", + "required": ["local_interface", "remote_interface", "remote_device"], + "properties": { + "local_interface": {"type": "string", "description": "Interface Name of the local device"}, + "remote_interface": {"type": "string", "description": "Interface Name of the remote device"}, + "remote_device": {"type": "string", "description": "Name of the remote device"}, + }, + }, + }, }, } return { @@ -189,5 +201,16 @@ def sync_network_data_schema(json_schema=True): }, }, }, + "cables": { + "type": "object", + "items": { + "type": "object", + "required": ["local_interface", "remote_interface", "remote_device"], + "properties": { + "local_interface": {"type": "string", "description": "Interface Name of the local device"}, + "remote_interface": {"type": "string", "description": "Interface Name of the remote device"}, + "remote_device": {"type": "string", "description": "Name of the remote device"}, + }, + }, }, } From de140e0bf3c4f199d2ce7b13227bea716141ca31 Mon Sep 17 00:00:00 2001 From: scetron Date: Sun, 14 Jul 2024 21:23:03 -0400 Subject: [PATCH 36/81] update mock and test data --- .../expected_result_1.json | 275 ++++ .../expected_result_2.json | 200 +++ .../expected_result_2.json | 4 +- .../expected_result_1.json | 1220 ----------------- .../mock/command_mappers/mock_cisco_ios.yml | 6 +- 5 files changed, 479 insertions(+), 1226 deletions(-) create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json create mode 100755 nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json mode change 100755 => 100644 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json new file mode 100755 index 00000000..d4e5073b --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_1.json @@ -0,0 +1,275 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3581", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/11": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358b", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/12": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358c", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/13": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358d", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/14": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.358e", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/15": { + "802.1Q_mode": "tagged", + "description": "***connection to SW1***", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.358f", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/16": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3590", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3582", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3583", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.3584", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3585", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3586", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3587", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3588", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "tagged-all", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.3589", + "mtu": "1500", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "6c71.0d1d.35c0", + "mtu": "1500", + "type": "virtual" + }, + "Vlan10": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "6c71.0d1d.35c1", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FOC2341Y2CQ" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json new file mode 100755 index 00000000..9b4c9258 --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_no_options/expected_result_2.json @@ -0,0 +1,200 @@ +{ + "interfaces": { + "GigabitEthernet0/1": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1501", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/10": { + "802.1Q_mode": "tagged-all", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.150a", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/2": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1502", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/3": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1503", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1504", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1505", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/6": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1506", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/7": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1507", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/8": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1508", + "mtu": "1500", + "type": "1000base-t" + }, + "GigabitEthernet0/9": { + "802.1Q_mode": "access", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1509", + "mtu": "1500", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "", + "prefix_length": "" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "2c3f.3899.1540", + "mtu": "1500", + "type": "virtual" + }, + "Vlan255": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "10.35.255.75", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1541", + "mtu": "1500", + "type": "virtual" + }, + "Vlan955": { + "802.1Q_mode": "", + "description": "", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "2c3f.3899.1542", + "mtu": "1500", + "type": "virtual" + } + }, + "serial": "FOC1541W2SP" +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_2.json b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_2.json index a788917b..137430f0 100755 --- a/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_2.json +++ b/nautobot_device_onboarding/tests/mock/cisco_ios/sync_network_data_with_cables/expected_result_2.json @@ -197,7 +197,7 @@ } }, "serial": "FOC1541W2SP", - "neighbors": [ + "cables": [ { "remote_device": "demo-cisco-1", "local_interface": "GigabitEthernet1", @@ -214,4 +214,4 @@ "remote_interface": "GigabitEthernet3" } ] -} \ No newline at end of file +} diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json old mode 100755 new mode 100644 index 3768f672..e69de29b --- a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json @@ -1,1220 +0,0 @@ -{ - "interfaces": { - "Ethernet1/1": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/1.1": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "139.65.22.246", - "prefix_length": "30" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/10": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99f5", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/11": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99f6", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/12": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99f7", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/13": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99f8", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/14": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99f9", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/15": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99fa", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/16": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99fb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/17": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99fc", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/18": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99fd", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/19": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99fe", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/2": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/2.1": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "139.65.22.250", - "prefix_length": "30" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/20": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99ff", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/21": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a00", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/22": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a01", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/23": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a02", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/24": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a03", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/25": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a04", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/26": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a05", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/27": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a06", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/28": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/28.2": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "172.16.0.2", - "prefix_length": "31" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/29": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a08", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/3": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99ee", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/30": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a09", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/31": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0a", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/32": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0b", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/33": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0c", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/34": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0d", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/35": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0e", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/36": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0f", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/37": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a10", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/38": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a11", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/39": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a12", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/4": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99ef", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/40": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a13", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/41": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/42": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/43": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a16", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/44": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a17", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/45": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a18", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/46": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a19", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/47": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a1a", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/48": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a1b", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/49": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a1c", - "mtu": "1500", - "type": "other" - }, - "Ethernet1/5": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99f0", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/50": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a1d", - "mtu": "1500", - "type": "other" - }, - "Ethernet1/51": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a1e", - "mtu": "1500", - "type": "other" - }, - "Ethernet1/52": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a1f", - "mtu": "1500", - "type": "other" - }, - "Ethernet1/53": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a20", - "mtu": "9216", - "type": "other" - }, - "Ethernet1/54": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.9a21", - "mtu": "1500", - "type": "other" - }, - "Ethernet1/6": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99f1", - "mtu": "1500", - "type": "1000base-t" - }, - "Ethernet1/7": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99f2", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/8": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99f3", - "mtu": "9216", - "type": "1000base-t" - }, - "Ethernet1/9": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99f4", - "mtu": "9216", - "type": "1000base-t" - }, - "Vlan1": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan110": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.1.67", - "prefix_length": "28" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan115": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.1.83", - "prefix_length": "28" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan128": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.6.133", - "prefix_length": "27" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan135": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.135.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan136": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "144.5.136.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan160": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.6.174", - "prefix_length": "28" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan176": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.6.190", - "prefix_length": "28" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan192": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.6.198", - "prefix_length": "29" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan200": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.111.19", - "prefix_length": "29" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan201": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.73.3", - "prefix_length": "29" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan202": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.111.42", - "prefix_length": "29" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan210": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.111.98", - "prefix_length": "29" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan214": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.111.3", - "prefix_length": "29" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan215": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.57.131", - "prefix_length": "26" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan216": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.57.195", - "prefix_length": "26" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan218": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.218.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan219": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.219.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan220": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.59.243", - "prefix_length": "29" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan3112": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "172.22.32.1", - "prefix_length": "21" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "9216", - "type": "virtual" - }, - "Vlan3130": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "172.22.8.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan3146": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.197.131", - "prefix_length": "25" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan345": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.5.174", - "prefix_length": "28" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan350": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "139.65.137.3", - "prefix_length": "26" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan63": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.63.3", - "prefix_length": "25" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "9216", - "type": "virtual" - }, - "Vlan64": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.34.6.126", - "prefix_length": "26" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan66": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.66.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan67": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.67.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan68": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.68.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "False", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan70": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.70.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan71": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.71.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "Vlan72": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.72.3", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "virtual" - }, - "loopback0": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.27.111.247", - "prefix_length": "32" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "", - "mtu": "1500", - "type": "other" - }, - "mgmt0": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "198.51.100.1", - "prefix_length": "24" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99e4", - "mtu": "1500", - "type": "other" - }, - "port-channel29": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0a", - "mtu": "9216", - "type": "lag" - }, - "port-channel3": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "0000.0000.0000", - "mtu": "1500", - "type": "lag" - }, - "port-channel33": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0c", - "mtu": "1500", - "type": "lag" - }, - "port-channel35": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a0e", - "mtu": "1500", - "type": "lag" - }, - "port-channel36": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "0000.0000.0000", - "mtu": "1500", - "type": "lag" - }, - "port-channel37": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a10", - "mtu": "9216", - "type": "lag" - }, - "port-channel41": { - "802.1Q_mode": "", - "description": "a description", - "ip_addresses": [ - { - "ip_address": "10.1.0.2", - "prefix_length": "30" - } - ], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99eb", - "mtu": "1500", - "type": "lag" - }, - "port-channel43": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a16", - "mtu": "1500", - "type": "lag" - }, - "port-channel45": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.9a18", - "mtu": "9216", - "type": "lag" - }, - "port-channel53": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "False", - "mac_address": "0000.0000.0000", - "mtu": "9216", - "type": "lag" - }, - "port-channel6": { - "802.1Q_mode": "access", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99f1", - "mtu": "1500", - "type": "lag" - }, - "port-channel7": { - "802.1Q_mode": "tagged", - "description": "a description", - "ip_addresses": [], - "lag": "", - "link_status": "True", - "mac_address": "286f.7f7e.99f3", - "mtu": "9216", - "type": "lag" - } - }, - "serial": "FDO20432435" -} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml b/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml index 25b4458a..7e665658 100755 --- a/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml +++ b/nautobot_device_onboarding/tests/mock/command_mappers/mock_cisco_ios.yml @@ -116,10 +116,8 @@ sync_network_data: jpath: "[?contains(interface, '{{ current_key | abbreviated_interface_name }}')].native_vlan" post_processor: "{% if obj | length > 0 %}{{ vlan_map | selectattr('id', 'eq', obj[0]) | list | tojson }}{% else %}{{ obj }}{% endif %}" iterable_type: "dict" - neighbors: + cables: commands: - command: "show cdp neighbors detail" parser: "textfsm" - jpath: "[*].interface" - post_processor: "{% set result=[] %}{% for neighbor in obj %}{{ result.append({'local_interface': local_interface, 'remote_device': 'neighbor_name', 'remote_interface': neighbor_interface}) or '' }}{% endfor %}{{ result | tojson }}" - iterable_type: "list" + jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" From 44359db130ea0634f6d7c308ca00a255aa18a66e Mon Sep 17 00:00:00 2001 From: scetron Date: Sun, 14 Jul 2024 21:23:22 -0400 Subject: [PATCH 37/81] update test jpath format --- nautobot_device_onboarding/tests/test_command_getter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nautobot_device_onboarding/tests/test_command_getter.py b/nautobot_device_onboarding/tests/test_command_getter.py index 8821d152..07947767 100755 --- a/nautobot_device_onboarding/tests/test_command_getter.py +++ b/nautobot_device_onboarding/tests/test_command_getter.py @@ -216,8 +216,7 @@ def test_deduplicate_command_list_sync_data_cables(self): { "command": "show cdp neighbors detail", "parser": "textfsm", - "jpath": "[*].local_interface", - "post_processor": "{% set result=[] %}{% for interface in obj %}{{ result.append([local_interface: local_interface, remote_interface: neighbor_interface, remote_device: neighbor_name])}}{% endfor %}{{ result | tojson }}", + "jpath": "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}", }, ] self.assertEqual(get_commands_to_run, expected_commands_to_run) From e95b0713ad6f4561060fe24d3b72a467fff417df Mon Sep 17 00:00:00 2001 From: scetron Date: Sun, 14 Jul 2024 21:23:48 -0400 Subject: [PATCH 38/81] move status to an attribute --- .../adapters/sync_network_data_adapters.py | 108 +++++++++--------- .../models/sync_network_data_models.py | 12 +- 2 files changed, 56 insertions(+), 64 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 71f80e47..ec2c5a9f 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -107,7 +107,6 @@ def load_ip_addresses(self): status__name=ip_address.status.name, ) try: - network_ip_address.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST self.add(network_ip_address) except diffsync.exceptions.ObjectAlreadyExists: self.job.logger.warning( @@ -238,37 +237,39 @@ def load_cables(self): Only cables returned by the CommandGetter job should be synced. """ - for cable in self.job.devices_to_load.get_cables(): - if cable.termination_a.device.name < cable.termination_b.device.name: - termination_a_device = cable.termination_a.device.name - termination_a_interface = cable.termination_a.name - termination_b_device = cable.termination_b.device.name - termination_b_interface = cable.termination_b.name - else: - termination_a_device = cable.termination_b.device.name - termination_a_interface = cable.termination_b.name - termination_b_device = cable.termination_a.device.name - termination_b_interface = cable.termination_a.name + for device in self.job.devices_to_load: + for cable in device.get_cables(): + if cable.termination_a.device.name < cable.termination_b.device.name: + termination_a_device = cable.termination_a.device.name + termination_a_interface = cable.termination_a.name + termination_b_device = cable.termination_b.device.name + termination_b_interface = cable.termination_b.name + else: + termination_a_device = cable.termination_b.device.name + termination_a_interface = cable.termination_b.name + termination_b_device = cable.termination_a.device.name + termination_b_interface = cable.termination_a.name - network_cable = self.cable( - diffsync=self, - status__name="Connected", - termination_a__app_label="dcim", - termination_a__model="interface", - termination_a__device__name=termination_a_device, - termination_a__name=termination_a_interface, - termination_b__app_label="dcim", - termination_b__model="interface", - termination_b__device__name=termination_b_device, - termination_b__name=termination_b_interface, - ) - network_cable.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST - try: - self.add(network_cable) - if self.job.debug: - self.job.logger.debug(f"Loaded Cable: {network_cable}") - except diffsync.exceptions.ObjectAlreadyExists: - continue + network_cable = self.cable( + diffsync=self, + status__name=cable.status.name, + termination_a__app_label="dcim", + termination_a__model="interface", + termination_a__device__name=termination_a_device, + termination_a__name=termination_a_interface, + termination_b__app_label="dcim", + termination_b__model="interface", + termination_b__device__name=termination_b_device, + termination_b__name=termination_b_interface, + ) + + try: + self.add(network_cable) + network_cable.pk = cable.pk + if self.job.debug: + self.job.logger.debug(f"Loaded Cable: {network_cable}") + except diffsync.exceptions.ObjectAlreadyExists: + continue def load(self): """Generic implementation of the load function.""" @@ -296,6 +297,9 @@ def load(self): elif model_name == "vrf_to_interface": if self.job.sync_vrfs: self.load_vrf_to_interface() + elif model_name == "cable": + if self.job.sync_cables: + self.load_cables() else: diffsync_model = self._get_diffsync_class(model_name) self._load_objects(diffsync_model) @@ -721,31 +725,25 @@ def load_cables(self): termination_b_device = hostname termination_b_interface = local_interface + network_cable = self.cable( + diffsync=self, + status__name="Connected", # ask for default status in the job form + termination_a__app_label="dcim", + termination_a__model="interface", + termination_a__device__name=termination_a_device, + termination_a__name=termination_a_interface, + termination_b__app_label="dcim", + termination_b__model="interface", + termination_b__device__name=termination_b_device, + termination_b__name=termination_b_interface, + ) try: - network_cable = self.cable( - diffsync=self, - status__name="Connected", # ask for default status in the job form - termination_a__app_label="dcim", - termination_a__model="interface", - termination_a__device__name=termination_a_device, - termination_a__name=termination_a_interface, - termination_b__app_label="dcim", - termination_b__model="interface", - termination_b__device__name=termination_b_device, - termination_b__name=termination_b_interface, - ) - try: - self.add(network_cable) - if self.job.debug: - self.job.logger.debug(f"Loaded Cable: {network_cable}") - except diffsync.exceptions.ObjectAlreadyExists: - # object already in the diffsync store. - pass - except Exception as err: - self._handle_general_load_exception( - error=err, hostname=hostname, data=device_data, model_type="cable" - ) - continue + self.add(network_cable) + if self.job.debug: + self.job.logger.debug(f"Loaded Cable: {network_cable}") + except diffsync.exceptions.ObjectAlreadyExists: + # object already in the diffsync store. + pass def load(self): """Load network data.""" diff --git a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py index cd03e44e..4a9948a8 100644 --- a/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py +++ b/nautobot_device_onboarding/diffsync/models/sync_network_data_models.py @@ -562,7 +562,6 @@ def update(self, attrs): return super().update(attrs) -# TODO: Cable Model class SyncNetworkDataCable(FilteredNautobotModel): """Shared data model representing a cable between two interfaces.""" @@ -577,9 +576,10 @@ class SyncNetworkDataCable(FilteredNautobotModel): "termination_b__model", "termination_b__device__name", "termination_b__name", - "status__name", ) + _attributes = ("status__name",) + termination_a__app_label: str termination_a__model: str termination_a__device__name: str @@ -588,11 +588,5 @@ class SyncNetworkDataCable(FilteredNautobotModel): termination_b__model: str termination_b__device__name: str termination_b__name: str - status__name: str - # @classmethod - # def create(cls, diffsync, ids, attrs): - # """Create a new Cable object.""" - - # # if the same termination pair exists in reverse, don't create - # return super().create(diffsync, ids, attrs) + status__name: str From c2561ccfd22cf8ccea4df9684ee03cecf33c43af Mon Sep 17 00:00:00 2001 From: scetron Date: Sun, 14 Jul 2024 21:24:08 -0400 Subject: [PATCH 39/81] remove uneeded root_key flag --- nautobot_device_onboarding/command_mappers/cisco_ios.yml | 1 - nautobot_device_onboarding/command_mappers/cisco_nxos.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index b4b2cbf2..a3a09ae5 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -122,7 +122,6 @@ sync_network_data: post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" cables: - root_key: true commands: - command: "show cdp neighbors detail" parser: "textfsm" diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index b5a93cf5..10dbb482 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -117,7 +117,6 @@ sync_network_data: post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" cables: - root_key: true commands: - command: "show cdp neighbors detail" parser: "textfsm" From 0521f2f9a723986bdffca7f3114580a65686622b Mon Sep 17 00:00:00 2001 From: scetron Date: Sun, 14 Jul 2024 21:24:24 -0400 Subject: [PATCH 40/81] fix schema --- nautobot_device_onboarding/nornir_plays/schemas.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/nautobot_device_onboarding/nornir_plays/schemas.py b/nautobot_device_onboarding/nornir_plays/schemas.py index 2d999eb2..8a4490a3 100755 --- a/nautobot_device_onboarding/nornir_plays/schemas.py +++ b/nautobot_device_onboarding/nornir_plays/schemas.py @@ -86,13 +86,16 @@ def sync_network_data_schema(json_schema=True): "description": "List of tagged VLANs associated with the interface (optional)", }, "cables": { - "type": "object", + "type": "array", "items": { "type": "object", "required": ["local_interface", "remote_interface", "remote_device"], "properties": { "local_interface": {"type": "string", "description": "Interface Name of the local device"}, - "remote_interface": {"type": "string", "description": "Interface Name of the remote device"}, + "remote_interface": { + "type": "string", + "description": "Interface Name of the remote device", + }, "remote_device": {"type": "string", "description": "Name of the remote device"}, }, }, @@ -202,7 +205,7 @@ def sync_network_data_schema(json_schema=True): }, }, "cables": { - "type": "object", + "type": "array", "items": { "type": "object", "required": ["local_interface", "remote_interface", "remote_device"], @@ -212,5 +215,6 @@ def sync_network_data_schema(json_schema=True): "remote_device": {"type": "string", "description": "Name of the remote device"}, }, }, + }, }, } From db449241bc3410460c594fcf149827648f6eb917 Mon Sep 17 00:00:00 2001 From: scetron Date: Sun, 14 Jul 2024 21:24:32 -0400 Subject: [PATCH 41/81] fix test job --- nautobot_device_onboarding/tests/test_jobs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nautobot_device_onboarding/tests/test_jobs.py b/nautobot_device_onboarding/tests/test_jobs.py index 04f4df4c..233227ad 100644 --- a/nautobot_device_onboarding/tests/test_jobs.py +++ b/nautobot_device_onboarding/tests/test_jobs.py @@ -142,6 +142,7 @@ def test_sync_network_data__success(self, device_data): "dryrun": False, "sync_vlans": True, "sync_vrfs": True, + "sync_cables": True, "namespace": self.testing_objects["namespace"].pk, "interface_status": self.testing_objects["status"].pk, "ip_address_status": self.testing_objects["status"].pk, From 662fdfc7b9cade3451c4628d3e5b5169b93a82ea Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 15 Jul 2024 18:25:26 -0400 Subject: [PATCH 42/81] fix test data --- .../expected_result_1.json | 1220 ++++++++ .../expected_result_1.json | 2450 +++++++++++++++++ 2 files changed, 3670 insertions(+) diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json index e69de29b..4ab8d5c0 100644 --- a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1.json @@ -0,0 +1,1220 @@ +{ + "serial": "FDO20432435", + "interfaces": { + "Ethernet1/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/1.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.246", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/10": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f5", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f6", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f7", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f8", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f9", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fa", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fc", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fd", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fe", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/2.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.250", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ff", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a00", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a01", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/23": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a02", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a03", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/25": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a04", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/26": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a05", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/27": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a06", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/28": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/28.2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.16.0.2", + "prefix_length": "31" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a08", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ee", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/30": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a09", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/31": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/32": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0b", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/34": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0d", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0f", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/38": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a11", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/39": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a12", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ef", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/40": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a13", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/42": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/44": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a17", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/46": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a19", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/47": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1a", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/48": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1b", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/49": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1c", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f0", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/50": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1d", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/51": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1e", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/52": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1f", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a20", + "mtu": "9216", + "type": "other" + }, + "Ethernet1/54": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a21", + "mtu": "1500", + "type": "other" + }, + "Ethernet1/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f2", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/8": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "1000base-t" + }, + "Ethernet1/9": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f4", + "mtu": "9216", + "type": "1000base-t" + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan110": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.67", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan115": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.83", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan128": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.133", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan135": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.135.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan136": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "144.5.136.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan160": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan176": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.190", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan192": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.198", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan200": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.19", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan201": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.73.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan202": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.42", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan210": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.98", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan214": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan215": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.131", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan216": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.195", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan218": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.218.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan219": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.219.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan220": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.59.243", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan3112": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.32.1", + "prefix_length": "21" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual" + }, + "Vlan3130": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.8.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan3146": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.197.131", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan345": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.5.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan350": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.137.3", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan63": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.63.3", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "type": "virtual" + }, + "Vlan64": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.126", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan66": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.66.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan67": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.67.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan68": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.68.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan70": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.70.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan71": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.71.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "Vlan72": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.72.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "virtual" + }, + "loopback0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.247", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "type": "other" + }, + "mgmt0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99e4", + "mtu": "1500", + "type": "other" + }, + "port-channel29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "type": "lag" + }, + "port-channel3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag" + }, + "port-channel33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "type": "lag" + }, + "port-channel35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "type": "lag" + }, + "port-channel36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "type": "lag" + }, + "port-channel37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "type": "lag" + }, + "port-channel41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.1.0.2", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "lag" + }, + "port-channel43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "type": "lag" + }, + "port-channel45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "type": "lag" + }, + "port-channel53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "9216", + "type": "lag" + }, + "port-channel6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "type": "lag" + }, + "port-channel7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "type": "lag" + } + } +} \ No newline at end of file diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json index e69de29b..13c3589e 100644 --- a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json @@ -0,0 +1,2450 @@ +{ + "interfaces": { + "Ethernet1/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/1.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.246", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/10": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f5", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f6", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f7", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f8", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f9", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fa", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fc", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fd", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fe", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/2.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.250", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ff", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a00", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a01", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "136", + "name": "vlan136" + } + }, + "Ethernet1/23": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a02", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "64", + "name": "vlan64" + }, + { + "id": "110", + "name": "vid110" + }, + { + "id": "115", + "name": "v115" + }, + { + "id": "128", + "name": "vlan128" + }, + { + "id": "160", + "name": "id160" + }, + { + "id": "176", + "name": "vlan176" + }, + { + "id": "192", + "name": "vlan192" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a03", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "67", + "name": "vlan67" + } + }, + "Ethernet1/25": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a04", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/26": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a05", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/27": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a06", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/28": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/28.2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.16.0.2", + "prefix_length": "31" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a08", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ee", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "65", + "name": "vlan65" + }, + { + "id": "66", + "name": "vlan66" + }, + { + "id": "67", + "name": "vlan67" + }, + { + "id": "68", + "name": "vlan68" + }, + { + "id": "70", + "name": "vlan70" + }, + { + "id": "71", + "name": "vlan71" + }, + { + "id": "72", + "name": "vlan72" + }, + { + "id": "135", + "name": "VLAN135" + }, + { + "id": "218", + "name": "dns" + }, + { + "id": "219", + "name": "v219" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/30": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a09", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/31": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/32": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0b", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/34": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0d", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0f", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/38": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a11", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/39": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a12", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ef", + "mtu": "9216", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/40": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a13", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/42": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/44": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a17", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/46": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a19", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/47": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/48": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1b", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/49": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1c", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f0", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "200", + "name": "data" + } + }, + "Ethernet1/50": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1d", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/51": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1e", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/52": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1f", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a20", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/54": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a21", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "201", + "name": "fw" + } + }, + "Ethernet1/7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f2", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/8": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/9": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f4", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan110": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.67", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan115": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.83", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan128": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.133", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan135": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.135.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan136": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "144.5.136.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan160": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan176": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.190", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan192": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.198", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan200": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.19", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan201": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.73.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan202": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.42", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan210": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.98", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan214": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan215": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.131", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan216": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.195", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan218": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.218.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan219": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.219.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan220": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.59.243", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3112": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.32.1", + "prefix_length": "21" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3130": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.8.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3146": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.197.131", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan345": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.5.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan350": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.137.3", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan63": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.63.3", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan64": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.126", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan66": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.66.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan67": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.67.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan68": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.68.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan70": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.70.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan71": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.71.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan72": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.72.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "loopback0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.247", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "mgmt0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99e4", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "port-channel29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "65", + "name": "vlan65" + }, + { + "id": "66", + "name": "vlan66" + }, + { + "id": "67", + "name": "vlan67" + }, + { + "id": "68", + "name": "vlan68" + }, + { + "id": "70", + "name": "vlan70" + }, + { + "id": "71", + "name": "vlan71" + }, + { + "id": "72", + "name": "vlan72" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "210", + "name": "Mgmt.FW" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.1.0.2", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": {} + }, + "port-channel43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": { + "id": "201", + "name": "fw" + } + }, + "port-channel7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + } + }, + "serial": "FDO20432435", + "neighbors": [ + { + "remote_device": "demo-cisco-2", + "local_interface": "GigabitEthernet1", + "remote_interface": "GigabitEthernet1" + }, + { + "remote_device": "demo-cisco-3", + "local_interface": "GigabitEthernet2", + "remote_interface": "GigabitEthernet2" + }, + { + "remote_device": "demo-cisco-4", + "local_interface": "GigabitEthernet3", + "remote_interface": "GigabitEthernet3" + } + ] +} \ No newline at end of file From 59e8619942dcf658379ec51ff210e9631b3638d0 Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 15 Jul 2024 18:26:07 -0400 Subject: [PATCH 43/81] add adapter test for load cables --- .../tests/test_sync_network_data_adapters.py | 22 +++++++++++++++++++ nautobot_device_onboarding/tests/utils.py | 9 ++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py index 7ac5b055..d4f73297 100644 --- a/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py +++ b/nautobot_device_onboarding/tests/test_sync_network_data_adapters.py @@ -204,6 +204,28 @@ def test_load_vrf_to_interface(self): self.assertEqual(interface_name, diffsync_obj.name) self.assertEqual(interface_data["vrf"], diffsync_obj.vrf) + def test_load_cables(self): + """Test loading cable data returned from command getter into the diffsync store.""" + self.sync_network_data_adapter.load_cables() + for hostname, device_data in self.job.command_getter_result.items(): + for cable in device_data["cables"]: + if hostname < cable["remote_device"]: + termination_a_device = hostname + termination_a_interface = cable["local_interface"] + termination_b_device = cable["remote_device"] + termination_b_interface = cable["remote_interface"] + else: + termination_a_device = cable["remote_device"] + termination_a_interface = cable["remote_interface"] + termination_b_device = hostname + termination_b_interface = cable["local_interface"] + unique_id = f"dcim__interface__{termination_a_device}__{termination_a_interface}__dcim__interface__{termination_b_device}__{termination_b_interface}" + diffsync_obj = self.sync_network_data_adapter.get("cable", unique_id) + self.assertEqual(termination_a_device, diffsync_obj.termination_a__device__name) + self.assertEqual(termination_a_interface, diffsync_obj.termination_a__name) + self.assertEqual(termination_b_device, diffsync_obj.termination_b__device__name) + self.assertEqual(termination_b_interface, diffsync_obj.termination_b__name) + class SyncNetworkDataNautobotAdapterTestCase(TransactionTestCase): """Test SyncNetworkDataNautobotAdapter class.""" diff --git a/nautobot_device_onboarding/tests/utils.py b/nautobot_device_onboarding/tests/utils.py index 14c55825..2733d973 100644 --- a/nautobot_device_onboarding/tests/utils.py +++ b/nautobot_device_onboarding/tests/utils.py @@ -2,7 +2,7 @@ from django.contrib.contenttypes.models import ContentType from nautobot.dcim.choices import InterfaceModeChoices, InterfaceTypeChoices -from nautobot.dcim.models import Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform +from nautobot.dcim.models import Cable, Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices from nautobot.extras.models import Role, Secret, SecretsGroup, SecretsGroupAssociation, Status from nautobot.ipam.choices import IPAddressTypeChoices, PrefixTypeChoices @@ -10,7 +10,7 @@ def sync_network_data_ensure_required_nautobot_objects(): - """Ensure the requied Nautobot objects needed for testing exist.""" + """Ensure the required Nautobot objects needed for testing Sync Data from Network exist.""" testing_objects = {} status, _ = Status.objects.get_or_create(name="Active") @@ -22,6 +22,7 @@ def sync_network_data_ensure_required_nautobot_objects(): status.content_types.add(ContentType.objects.get_for_model(Interface)) status.content_types.add(ContentType.objects.get_for_model(VLAN)) status.content_types.add(ContentType.objects.get_for_model(VRF)) + status.content_types.add(ContentType.objects.get_for_model(Cable)) status.validated_save() username_secret, _ = Secret.objects.get_or_create( @@ -165,7 +166,7 @@ def sync_network_data_ensure_required_nautobot_objects(): def sync_devices_ensure_required_nautobot_objects(): - """Ensure the requied Nautobot objects needed for testing exist.""" + """Ensure the required Nautobot objects needed for Sync Device from Network testing exist.""" testing_objects = {} status, _ = Status.objects.get_or_create(name="Active") @@ -296,7 +297,7 @@ def sync_devices_ensure_required_nautobot_objects(): def sync_devices_ensure_required_nautobot_objects__jobs_testing(): - """Ensure the requied Nautobot objects needed for testing exist.""" + """Ensure the required Nautobot objects needed for testing exist.""" testing_objects = {} status, _ = Status.objects.get_or_create(name="Active") From e8e8d8a1ede15e921dbbbad790c02dfe4a1aa55f Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 17 Jul 2024 11:31:42 -0500 Subject: [PATCH 44/81] test a markdown emoji --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 541b03c7..801c3e98 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,19 @@ The `nautobot-device-onboarding` plugin is using the [netmiko](https://github.co Regardless, the Onboarding App greatly simplifies the onboarding process by allowing the user to specify a small amount of info and having the app populate a much larger amount of device data in Nautobot. +### Support Matrix (Sync Devices From Network) + +| Data Attribute | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | +| ----------------------- | --------- | ---------- | ------------- | --------- | ------------- | ---------- | ---------- | +| Hostname | :white_check_mark: | | | | || :x: | +| Serial Number | :white_check_mark: | | | | || :x: | +| Device Type | :white_check_mark: | | | | || :x: | +| Mgmt Interface | :white_check_mark: | | | | || :x: | +| Mgmt IP Address | :white_check_mark: | | | | || :x: | + +### Support Matrix (Sync Data From Network) + + ### Screenshots Device Onboarding is a Job that allows you to provide a few required pieces of information and onboard the device. From 3c19e29cfff13e9d962ee41ef763c4fc2cb88163 Mon Sep 17 00:00:00 2001 From: scetron Date: Wed, 17 Jul 2024 12:33:22 -0400 Subject: [PATCH 45/81] revert model change flag --- .../diffsync/adapters/sync_network_data_adapters.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index ec2c5a9f..0c8e9217 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -107,6 +107,7 @@ def load_ip_addresses(self): status__name=ip_address.status.name, ) try: + network_ip_address.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST self.add(network_ip_address) except diffsync.exceptions.ObjectAlreadyExists: self.job.logger.warning( @@ -128,7 +129,7 @@ def load_vlans(self): location__name=vlan.location.name if vlan.location else "", ) try: - network_vlan.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_SRC + network_vlan.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST self.add(network_vlan) except diffsync.exceptions.ObjectAlreadyExists: pass From 3a58b383d751f554fb3be5f3e1471fe32806f1aa Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 17 Jul 2024 11:46:45 -0500 Subject: [PATCH 46/81] add support matrix --- README.md | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 801c3e98..6c1c5c6d 100644 --- a/README.md +++ b/README.md @@ -19,16 +19,40 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo ### Support Matrix (Sync Devices From Network) -| Data Attribute | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | -| ----------------------- | --------- | ---------- | ------------- | --------- | ------------- | ---------- | ---------- | -| Hostname | :white_check_mark: | | | | || :x: | -| Serial Number | :white_check_mark: | | | | || :x: | -| Device Type | :white_check_mark: | | | | || :x: | -| Mgmt Interface | :white_check_mark: | | | | || :x: | -| Mgmt IP Address | :white_check_mark: | | | | || :x: | +| Data Attribute | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | +| ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | +| Hostname | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| Platform | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| Manufacturer | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| Serial Number | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| Device Type | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| Mgmt Interface | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| Mgmt IP Address | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | ### Support Matrix (Sync Data From Network) +| Interfaces | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | +| ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | +| Name | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| IP Address | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| Type | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| MTU | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| Description | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| Mac Address | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| Link Status | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| 802.1Q mode | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| Lag Member | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| Vrf Membership | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | + +| VLANS | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | +| ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | +| Untagged VLANs | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | +| Tagged VLANs | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: | + +| Cabling | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | +| ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | +| Untagged VLANs | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | +| Tagged VLANs | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | ### Screenshots From 7fc6c17a2d75790c6facb1dc4da97b94b64692c7 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 17 Jul 2024 12:24:23 -0500 Subject: [PATCH 47/81] add support matrix --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6c1c5c6d..a13aea74 100644 --- a/README.md +++ b/README.md @@ -51,8 +51,11 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo | Cabling | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | | ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | -| Untagged VLANs | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | -| Tagged VLANs | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | +| Cabling | :warning: | :warning: | :test_tube: | :x: | :x: | :x: | :x: | + +:white_check_mark: - Supported and stable. +:x: - No current support. +:warning: - Supported, but has limited testing. ### Screenshots From e36dd193607f840ff7ad188c2e3eaef8e6563f27 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 17 Jul 2024 12:25:32 -0500 Subject: [PATCH 48/81] add support matrix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a13aea74..9ea7ede3 100644 --- a/README.md +++ b/README.md @@ -51,11 +51,11 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo | Cabling | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | | ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | -| Cabling | :warning: | :warning: | :test_tube: | :x: | :x: | :x: | :x: | +| Terminations A and B | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | :white_check_mark: - Supported and stable. :x: - No current support. -:warning: - Supported, but has limited testing. +:test_tube: - Supported, but has limited testing. ### Screenshots From b31d36299ec310da6617f5ede4eced807fd64163 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 17 Jul 2024 12:31:19 -0500 Subject: [PATCH 49/81] add support matrix --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9ea7ede3..b6f1a3d7 100644 --- a/README.md +++ b/README.md @@ -51,11 +51,14 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo | Cabling | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | | ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | -| Terminations A and B | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | - -:white_check_mark: - Supported and stable. -:x: - No current support. -:test_tube: - Supported, but has limited testing. +| Terminations A | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | +| Terminations B | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | + +| Legend | +| :----: | +| :white_check_mark: - Supported and stable. | +| :x: - No current support. | +| :test_tube: - Supported, but has limited testing. | ### Screenshots From 57a37464cb22b2c9cbf72e788fe1fb656f808814 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 17 Jul 2024 12:33:28 -0500 Subject: [PATCH 50/81] add support matrix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6f1a3d7..1902d5e7 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo | Terminations B | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | | Legend | -| :----: | +| ----: | | :white_check_mark: - Supported and stable. | | :x: - No current support. | | :test_tube: - Supported, but has limited testing. | From d89cfd5d665f1e470b384af3323f2ff972976aa4 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Wed, 17 Jul 2024 12:33:46 -0500 Subject: [PATCH 51/81] add support matrix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1902d5e7..1594d946 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo | Terminations B | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | | Legend | -| ----: | +| :---- | | :white_check_mark: - Supported and stable. | | :x: - No current support. | | :test_tube: - Supported, but has limited testing. | From 4cfbca05061f10c7e464a92bc38bc762ced2e09a Mon Sep 17 00:00:00 2001 From: David Cates Date: Wed, 17 Jul 2024 18:15:26 +0000 Subject: [PATCH 52/81] add pks to device onboarding adapter load methods --- .../diffsync/adapters/sync_devices_adapters.py | 7 +++++-- tasks.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py index 08c446d8..41299d9f 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py @@ -62,7 +62,7 @@ def load_manufacturers(self): for manufacturer in Manufacturer.objects.all(): if self.job.debug: self.job.logger.debug("Loading Manufacturer data from Nautobot...") - onboarding_manufacturer = self.manufacturer(diffsync=self, name=manufacturer.name) + onboarding_manufacturer = self.manufacturer(diffsync=self, pk=manufacturer.pk, name=manufacturer.name) self.add(onboarding_manufacturer) if self.job.debug: self.job.logger.debug(f"Manufacturer: {manufacturer.name} loaded.") @@ -74,6 +74,7 @@ def load_platforms(self): for platform in Platform.objects.all(): onboarding_platform = self.platform( diffsync=self, + pk=platform.pk, name=platform.name, network_driver=platform.network_driver if platform.network_driver else "", manufacturer__name=platform.manufacturer.name if platform.manufacturer else None, @@ -89,8 +90,9 @@ def load_device_types(self): for device_type in DeviceType.objects.all(): onboarding_device_type = self.device_type( diffsync=self, + pk=device_type.pk, model=device_type.model, - part_number=device_type.model, + part_number=device_type.part_number, manufacturer__name=device_type.manufacturer.name, ) self.add(onboarding_device_type) @@ -117,6 +119,7 @@ def load_devices(self): interfaces = [] onboarding_device = self.device( diffsync=self, + pk=device.pk, device_type__model=device.device_type.model, location__name=device.location.name, name=device.name, diff --git a/tasks.py b/tasks.py index 9ca1b536..c5b4be23 100644 --- a/tasks.py +++ b/tasks.py @@ -703,7 +703,7 @@ def autoformat(context): "output_format": "see https://docs.astral.sh/ruff/settings/#output-format", }, ) -def ruff(context, action="lint", fix=False, output_format="text"): +def ruff(context, action="lint", fix=False, output_format="full"): """Run ruff to perform code formatting and/or linting.""" if action != "lint": command = "ruff format" From 2adbb119da96c2d839d4df387ea0a8e3d7fd5537 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 18 Jul 2024 12:15:21 -0400 Subject: [PATCH 53/81] add iosxe mapper --- nautobot_device_onboarding/command_mappers/cisco_xe.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml index ee914956..2a009dd8 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_xe.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -120,3 +120,8 @@ sync_network_data: jpath: "[?interface=='{{ current_key | abbreviated_interface_name }}'].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" iterable_type: "dict" + cables: + commands: + - command: "show cdp neighbors detail" + parser: "textfsm" + jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" From 2fa39349896c2b48ab20aa3fd4bbd392e0c7666a Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 19 Jul 2024 12:00:08 -0400 Subject: [PATCH 54/81] adjust mock data --- .../sync_network_data_with_cables/expected_result_1.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json index 13c3589e..beff3316 100644 --- a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_with_cables/expected_result_1.json @@ -2430,7 +2430,7 @@ } }, "serial": "FDO20432435", - "neighbors": [ + "cables": [ { "remote_device": "demo-cisco-2", "local_interface": "GigabitEthernet1", From 6a2e2a5c02b8a27eb4665670c916c66cfcde2c3b Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 19 Jul 2024 12:34:53 -0400 Subject: [PATCH 55/81] add pre-emptive / last resort error handling --- .../adapters/sync_network_data_adapters.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 0c8e9217..7c0706b9 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -240,6 +240,14 @@ def load_cables(self): """ for device in self.job.devices_to_load: for cable in device.get_cables(): + if cable.termination_b.device.name == "" or cable.termination_a.device.name == "": + self._handle_general_load_exception( + error="Device attached to a cable is missing a name. Devices must have a name to utilize cable onboarding.", + hostname=device.name, + data=cable, + model_type="cable", + ) + continue if cable.termination_a.device.name < cable.termination_b.device.name: termination_a_device = cable.termination_a.device.name termination_a_interface = cable.termination_a.name @@ -707,9 +715,45 @@ def load_cables(self): self.job.logger.debug(f"Loading Cables from {hostname}") self.job.logger.debug(f"Cable Data: {device_data['cables']}") + # last case check to make sure cable data is returned and returned in the correct format (list of dict) + if device_data.get("cables") is None or not isinstance(device_data.get("cables"), list): + self._handle_general_load_exception( + error="Cable data is missing from the returned device data or returned data is not a list.", + hostname=hostname, + data=device_data.get("cables"), + model_type="cable", + ) + return [] + for neighbor_data in device_data["cables"]: + if neighbor_data.get("local_interface") == "" or neighbor_data.get("local_interface") is None: + self._handle_general_load_exception( + error="Local interface is missing a name. Interfaces must have a name to utilize cable onboarding.", + hostname=hostname, + data=neighbor_data, + model_type="cable", + ) + continue local_interface = canonical_interface_name(neighbor_data["local_interface"]) + + if neighbor_data.get("remote_interface") == "" or neighbor_data.get("remote_interface") is None: + self._handle_general_load_exception( + error="Remote interface is missing a name. Interfaces must have a name to utilize cable onboarding.", + hostname=hostname, + data=neighbor_data, + model_type="cable", + ) + continue remote_interface = canonical_interface_name(neighbor_data["remote_interface"]) + + if neighbor_data.get("remote_device") == "" or neighbor_data.get("remote_device") is None: + self._handle_general_load_exception( + error="Remote device is missing a name. Devices must have a name to utilize cable onboarding.", + hostname=hostname, + data=neighbor_data, + model_type="cable", + ) + continue remote_device = neighbor_data["remote_device"] if self.job.debug: self.job.logger.debug(f"Neighbor Data: {neighbor_data}") From 0104ff1b6c6a157fc1aef1a2f5b43d22b6047343 Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 22 Jul 2024 11:02:21 -0400 Subject: [PATCH 56/81] adjust linting + adjust error handling --- .../adapters/sync_network_data_adapters.py | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 7c0706b9..69f904ad 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -708,7 +708,7 @@ def load_vrf_to_interface(self): ) continue - def load_cables(self): + def load_cables(self): # pylint: disable=inconsistent-return-statements """Load cables into the Diffsync store.""" for hostname, device_data in self.job.command_getter_result.items(): if self.job.debug: @@ -716,45 +716,58 @@ def load_cables(self): self.job.logger.debug(f"Cable Data: {device_data['cables']}") # last case check to make sure cable data is returned and returned in the correct format (list of dict) - if device_data.get("cables") is None or not isinstance(device_data.get("cables"), list): + + try: + neighbors = device_data["cables"] + except KeyError as error: + error.args = ( + error.args + + "Cable data/cable key is missing from the returned device data or returned data is not a list." + ) self._handle_general_load_exception( - error="Cable data is missing from the returned device data or returned data is not a list.", + error=error, hostname=hostname, - data=device_data.get("cables"), + data=device_data, model_type="cable", ) - return [] for neighbor_data in device_data["cables"]: - if neighbor_data.get("local_interface") == "" or neighbor_data.get("local_interface") is None: + try: + local_interface = canonical_interface_name(neighbor_data["local_interface"]) + except KeyError as error: + error.args = error.args + "Local interface is missing a name." self._handle_general_load_exception( - error="Local interface is missing a name. Interfaces must have a name to utilize cable onboarding.", + error=error, hostname=hostname, data=neighbor_data, model_type="cable", ) continue - local_interface = canonical_interface_name(neighbor_data["local_interface"]) - if neighbor_data.get("remote_interface") == "" or neighbor_data.get("remote_interface") is None: + try: + remote_interface = canonical_interface_name(neighbor_data["remote_interface"]) + except KeyError as error: + error.args = error.args + "Remote interface is missing a name." self._handle_general_load_exception( - error="Remote interface is missing a name. Interfaces must have a name to utilize cable onboarding.", + error=error, hostname=hostname, data=neighbor_data, model_type="cable", ) continue - remote_interface = canonical_interface_name(neighbor_data["remote_interface"]) - if neighbor_data.get("remote_device") == "" or neighbor_data.get("remote_device") is None: + try: + remote_device = neighbor_data["remote_device"] + except KeyError as error: + error.args = error.args + "Remote device is missing a name." self._handle_general_load_exception( - error="Remote device is missing a name. Devices must have a name to utilize cable onboarding.", + error=error, hostname=hostname, data=neighbor_data, model_type="cable", ) continue - remote_device = neighbor_data["remote_device"] + if self.job.debug: self.job.logger.debug(f"Neighbor Data: {neighbor_data}") From 29de249d2dafddcfa20108a18f0bb601606bd67a Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 22 Jul 2024 11:02:43 -0400 Subject: [PATCH 57/81] add jinja filter to remove fqdns --- nautobot_device_onboarding/command_mappers/cisco_nxos.yml | 1 + nautobot_device_onboarding/jinja_filters.py | 6 ++++++ nautobot_device_onboarding/tests/test_jinja_filters.py | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml index 10dbb482..e0f672a4 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_nxos.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_nxos.yml @@ -121,3 +121,4 @@ sync_network_data: - command: "show cdp neighbors detail" parser: "textfsm" jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" + post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" diff --git a/nautobot_device_onboarding/jinja_filters.py b/nautobot_device_onboarding/jinja_filters.py index b5f548e8..0ffa37ac 100755 --- a/nautobot_device_onboarding/jinja_filters.py +++ b/nautobot_device_onboarding/jinja_filters.py @@ -180,3 +180,9 @@ def parse_junos_ip_address(item): if not item[0]["prefix_length"] and item[0]["ip_address"]: return [{"prefix_length": 32, "ip_address": item[0]["ip_address"][0]}] return [] + + +@library.filter +def remove_fqdn(hostname): + """Remove the FQDN from the hostname.""" + return hostname.split(".")[0] diff --git a/nautobot_device_onboarding/tests/test_jinja_filters.py b/nautobot_device_onboarding/tests/test_jinja_filters.py index ec047070..42fb0a0b 100755 --- a/nautobot_device_onboarding/tests/test_jinja_filters.py +++ b/nautobot_device_onboarding/tests/test_jinja_filters.py @@ -14,6 +14,7 @@ map_interface_type, parse_junos_ip_address, port_mode_to_nautobot, + remove_fqdn, ) @@ -255,3 +256,7 @@ def test_parse_junos_ip_address_values_as_none(self): """Parse Junos IP and destination prefix.""" data = [{"prefix_length": None, "ip_address": None}] self.assertEqual(parse_junos_ip_address(data), []) + + def test_remove_fqdn(self): + """Remove the FQDN from the hostname.""" + self.assertEqual(remove_fqdn("foo.example.com"), "foo") From 178663768aabb865fd23c362dcf4af46ce7896d4 Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 22 Jul 2024 11:45:15 -0400 Subject: [PATCH 58/81] adjust try/except block --- .../adapters/sync_network_data_adapters.py | 144 +++++++++--------- 1 file changed, 71 insertions(+), 73 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 69f904ad..17e19075 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -718,7 +718,77 @@ def load_cables(self): # pylint: disable=inconsistent-return-statements # last case check to make sure cable data is returned and returned in the correct format (list of dict) try: - neighbors = device_data["cables"] + for neighbor_data in device_data["cables"]: + try: + local_interface = canonical_interface_name(neighbor_data["local_interface"]) + except KeyError as error: + error.args = error.args + "Local interface is missing a name." + self._handle_general_load_exception( + error=error, + hostname=hostname, + data=neighbor_data, + model_type="cable", + ) + continue + + try: + remote_interface = canonical_interface_name(neighbor_data["remote_interface"]) + except KeyError as error: + error.args = error.args + "Remote interface is missing a name." + self._handle_general_load_exception( + error=error, + hostname=hostname, + data=neighbor_data, + model_type="cable", + ) + continue + + try: + remote_device = neighbor_data["remote_device"] + except KeyError as error: + error.args = error.args + "Remote device is missing a name." + self._handle_general_load_exception( + error=error, + hostname=hostname, + data=neighbor_data, + model_type="cable", + ) + continue + + if self.job.debug: + self.job.logger.debug(f"Neighbor Data: {neighbor_data}") + + # always put the alphabetically first device as termination a + if hostname < remote_device: + termination_a_device = hostname + termination_a_interface = local_interface + termination_b_device = remote_device + termination_b_interface = remote_interface + else: + termination_a_device = remote_device + termination_a_interface = remote_interface + termination_b_device = hostname + termination_b_interface = local_interface + + network_cable = self.cable( + diffsync=self, + status__name="Connected", # ask for default status in the job form + termination_a__app_label="dcim", + termination_a__model="interface", + termination_a__device__name=termination_a_device, + termination_a__name=termination_a_interface, + termination_b__app_label="dcim", + termination_b__model="interface", + termination_b__device__name=termination_b_device, + termination_b__name=termination_b_interface, + ) + try: + self.add(network_cable) + if self.job.debug: + self.job.logger.debug(f"Loaded Cable: {network_cable}") + except diffsync.exceptions.ObjectAlreadyExists: + # object already in the diffsync store. + pass except KeyError as error: error.args = ( error.args @@ -731,78 +801,6 @@ def load_cables(self): # pylint: disable=inconsistent-return-statements model_type="cable", ) - for neighbor_data in device_data["cables"]: - try: - local_interface = canonical_interface_name(neighbor_data["local_interface"]) - except KeyError as error: - error.args = error.args + "Local interface is missing a name." - self._handle_general_load_exception( - error=error, - hostname=hostname, - data=neighbor_data, - model_type="cable", - ) - continue - - try: - remote_interface = canonical_interface_name(neighbor_data["remote_interface"]) - except KeyError as error: - error.args = error.args + "Remote interface is missing a name." - self._handle_general_load_exception( - error=error, - hostname=hostname, - data=neighbor_data, - model_type="cable", - ) - continue - - try: - remote_device = neighbor_data["remote_device"] - except KeyError as error: - error.args = error.args + "Remote device is missing a name." - self._handle_general_load_exception( - error=error, - hostname=hostname, - data=neighbor_data, - model_type="cable", - ) - continue - - if self.job.debug: - self.job.logger.debug(f"Neighbor Data: {neighbor_data}") - - # always put the alphabetically first device as termination a - if hostname < remote_device: - termination_a_device = hostname - termination_a_interface = local_interface - termination_b_device = remote_device - termination_b_interface = remote_interface - else: - termination_a_device = remote_device - termination_a_interface = remote_interface - termination_b_device = hostname - termination_b_interface = local_interface - - network_cable = self.cable( - diffsync=self, - status__name="Connected", # ask for default status in the job form - termination_a__app_label="dcim", - termination_a__model="interface", - termination_a__device__name=termination_a_device, - termination_a__name=termination_a_interface, - termination_b__app_label="dcim", - termination_b__model="interface", - termination_b__device__name=termination_b_device, - termination_b__name=termination_b_interface, - ) - try: - self.add(network_cable) - if self.job.debug: - self.job.logger.debug(f"Loaded Cable: {network_cable}") - except diffsync.exceptions.ObjectAlreadyExists: - # object already in the diffsync store. - pass - def load(self): """Load network data.""" self.execute_command_getter() From a2708da52a9e28351c8b76619db6060842ab5839 Mon Sep 17 00:00:00 2001 From: scetron Date: Mon, 22 Jul 2024 11:52:36 -0400 Subject: [PATCH 59/81] update ntc-templates --- poetry.lock | 244 ++++++++++++++++++++++++++++++++++++++++++++++--- pyproject.toml | 2 +- 2 files changed, 230 insertions(+), 16 deletions(-) diff --git a/poetry.lock b/poetry.lock index f1830ae6..96fd3f75 100755 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry and should not be changed by hand. [[package]] name = "amqp" version = "5.2.0" description = "Low-level AMQP client for Python (fork of amqplib)." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -14,14 +15,11 @@ files = [ [package.dependencies] vine = ">=5.0.0,<6.0.0" - - - - [[package]] name = "aniso8601" version = "7.0.0" description = "A library for parsing ISO 8601 strings." +category = "main" optional = false python-versions = "*" files = [ @@ -33,6 +31,7 @@ files = [ name = "anyio" version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -55,6 +54,7 @@ trio = ["trio (>=0.23)"] name = "appnope" version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -66,6 +66,7 @@ files = [ name = "asgiref" version = "3.8.1" description = "ASGI specs, helper code, and adapters" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -83,6 +84,7 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "astroid" version = "3.2.2" description = "An abstract syntax tree for Python with inference support." +category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -97,6 +99,7 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} name = "asttokens" version = "2.4.1" description = "Annotate AST trees with source code positions" +category = "dev" optional = false python-versions = "*" files = [ @@ -115,6 +118,7 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] name = "astunparse" version = "1.6.3" description = "An AST unparser for Python" +category = "dev" optional = false python-versions = "*" files = [ @@ -130,6 +134,7 @@ wheel = ">=0.23.0,<1.0" name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -141,6 +146,7 @@ files = [ name = "attrs" version = "23.2.0" description = "Classes Without Boilerplate" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -160,6 +166,7 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p name = "autopep8" version = "2.0.0" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +category = "main" optional = false python-versions = "*" files = [ @@ -175,6 +182,7 @@ tomli = "*" name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" +category = "dev" optional = false python-versions = "*" files = [ @@ -186,6 +194,7 @@ files = [ name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -217,6 +226,7 @@ tzdata = ["tzdata"] name = "bandit" version = "1.7.8" description = "Security oriented static analyser for python code." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -241,6 +251,7 @@ yaml = ["PyYAML"] name = "bcrypt" version = "4.1.3" description = "Modern password hashing for your software and your servers" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -281,6 +292,7 @@ typecheck = ["mypy"] name = "billiard" version = "4.2.0" description = "Python multiprocessing fork with improvements and bugfixes" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -292,6 +304,7 @@ files = [ name = "black" version = "24.4.2" description = "The uncompromising code formatter." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -338,6 +351,7 @@ uvloop = ["uvloop (>=0.15.2)"] name = "celery" version = "5.3.6" description = "Distributed Task Queue." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -394,6 +408,7 @@ zstd = ["zstandard (==0.22.0)"] name = "certifi" version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -405,6 +420,7 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -469,6 +485,7 @@ pycparser = "*" name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -568,6 +585,7 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -582,6 +600,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-default-group" version = "1.2.4" description = "click_default_group" +category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -599,6 +618,7 @@ test = ["pytest"] name = "click-didyoumean" version = "0.3.1" description = "Enables git-like *did-you-mean* feature in click" +category = "main" optional = false python-versions = ">=3.6.2" files = [ @@ -613,6 +633,7 @@ click = ">=7" name = "click-plugins" version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +category = "main" optional = false python-versions = "*" files = [ @@ -630,6 +651,7 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] name = "click-repl" version = "0.3.0" description = "REPL plugin for Click" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -648,6 +670,7 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -659,6 +682,7 @@ files = [ name = "coverage" version = "7.5.3" description = "Code coverage measurement for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -723,6 +747,7 @@ toml = ["tomli"] name = "cron-descriptor" version = "1.4.3" description = "A Python library that converts cron expressions into human readable strings." +category = "main" optional = false python-versions = "*" files = [ @@ -737,6 +762,7 @@ dev = ["polib"] name = "cryptography" version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -791,6 +817,7 @@ test-randomorder = ["pytest-randomly"] name = "decorator" version = "5.1.1" description = "Decorators for Humans" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -802,6 +829,7 @@ files = [ name = "deepdiff" version = "6.7.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -820,6 +848,7 @@ optimize = ["orjson"] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -831,6 +860,7 @@ files = [ name = "diffsync" version = "1.10.0" description = "Library to easily sync/diff/update 2 different data sources" +category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -852,6 +882,7 @@ redis = ["redis (>=4.3,<5.0)"] name = "dill" version = "0.3.8" description = "serialize all of Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -867,6 +898,7 @@ profile = ["gprof2dot (>=2022.7.29)"] name = "django" version = "3.2.25" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -887,6 +919,7 @@ bcrypt = ["bcrypt"] name = "django-ajax-tables" version = "1.1.1" description = "Django tag for ajax-enabled tables" +category = "main" optional = false python-versions = "*" files = [ @@ -898,6 +931,7 @@ files = [ name = "django-celery-beat" version = "2.6.0" description = "Database-backed Periodic Tasks." +category = "main" optional = false python-versions = "*" files = [ @@ -917,6 +951,7 @@ tzdata = "*" name = "django-celery-results" version = "2.5.1" description = "Celery result backends for Django." +category = "main" optional = false python-versions = "*" files = [ @@ -932,6 +967,7 @@ Django = ">=3.2.18" name = "django-constance" version = "2.9.1" description = "Django live settings with pluggable backends, including Redis." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -950,6 +986,7 @@ redis = ["redis"] name = "django-cors-headers" version = "4.3.1" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -965,6 +1002,7 @@ Django = ">=3.2" name = "django-db-file-storage" version = "0.5.6.1" description = "Custom FILE_STORAGE for Django. Saves files in your database instead of your file system." +category = "main" optional = false python-versions = "*" files = [ @@ -979,6 +1017,7 @@ Django = "*" name = "django-debug-toolbar" version = "4.3.0" description = "A configurable set of panels that display various debug information about the current request/response." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -994,6 +1033,7 @@ sqlparse = ">=0.2" name = "django-extensions" version = "3.2.3" description = "Extensions for Django" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1008,6 +1048,7 @@ Django = ">=3.2" name = "django-filter" version = "23.5" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1022,6 +1063,7 @@ Django = ">=3.2" name = "django-health-check" version = "3.18.2" description = "Run checks on services like databases, queue servers, celery processes, etc." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1040,6 +1082,7 @@ test = ["boto3", "celery", "django-storages", "pytest", "pytest-cov", "pytest-dj name = "django-jinja" version = "2.11.0" description = "Jinja2 templating language integrated in Django." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1055,6 +1098,7 @@ jinja2 = ">=3" name = "django-picklefield" version = "3.2" description = "Pickled object field for Django" +category = "main" optional = false python-versions = ">=3" files = [ @@ -1072,6 +1116,7 @@ tests = ["tox"] name = "django-prometheus" version = "2.3.1" description = "Django middlewares to monitor your application with Prometheus.io." +category = "main" optional = false python-versions = "*" files = [ @@ -1086,6 +1131,7 @@ prometheus-client = ">=0.7" name = "django-redis" version = "5.4.0" description = "Full featured redis cache backend for Django." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1104,6 +1150,7 @@ hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"] name = "django-silk" version = "5.1.0" description = "Silky smooth profiling for the Django Framework" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1121,6 +1168,7 @@ sqlparse = "*" name = "django-tables2" version = "2.7.0" description = "Table/data-grid framework for Django" +category = "main" optional = false python-versions = "*" files = [ @@ -1138,6 +1186,7 @@ tablib = ["tablib"] name = "django-taggit" version = "4.0.0" description = "django-taggit is a reusable Django application for simple tagging." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1152,6 +1201,7 @@ Django = ">=3.2" name = "django-timezone-field" version = "5.1" description = "A Django app providing DB, form, and REST framework fields for zoneinfo and pytz timezone objects." +category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1161,13 +1211,14 @@ files = [ [package.dependencies] "backports.zoneinfo" = {version = ">=0.2.1,<0.3.0", markers = "python_version < \"3.9\""} -Django = ">=2.2,<3.0.dev0 || >=3.2.dev0,<5.0" +Django = ">=2.2,<3.0.0 || >=3.2.0,<5.0" pytz = "*" [[package]] name = "django-tree-queries" version = "0.17.0" description = "Tree queries with explicit opt-in, without configurability" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1182,6 +1233,7 @@ tests = ["coverage"] name = "django-webserver" version = "1.2.0" description = "Django management commands for production webservers" +category = "main" optional = false python-versions = "*" files = [ @@ -1203,6 +1255,7 @@ waitress = ["waitress"] name = "djangorestframework" version = "3.15.1" description = "Web APIs for Django, made easy." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1218,6 +1271,7 @@ django = ">=3.0" name = "drf-react-template-framework" version = "0.0.17" description = "Django REST Framework plugin that creates form schemas for react-jsonschema-form" +category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1232,6 +1286,7 @@ djangorestframework = ">=3.12.0,<4.0.0" name = "drf-spectacular" version = "0.26.5" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1256,6 +1311,7 @@ sidecar = ["drf-spectacular-sidecar"] name = "drf-spectacular-sidecar" version = "2024.5.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1270,6 +1326,7 @@ Django = ">=2.2" name = "emoji" version = "2.11.1" description = "Emoji for Python" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ @@ -1284,6 +1341,7 @@ dev = ["coverage", "coveralls", "pytest"] name = "exceptiongroup" version = "1.2.1" description = "Backport of PEP 654 (exception groups)" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1298,6 +1356,7 @@ test = ["pytest (>=6)"] name = "executing" version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1312,6 +1371,7 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth name = "flake8" version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -1328,6 +1388,7 @@ pyflakes = ">=2.5.0,<2.6.0" name = "future" version = "1.0.0" description = "Clean single-source support for Python 3 and 2" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1339,6 +1400,7 @@ files = [ name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." +category = "dev" optional = false python-versions = "*" files = [ @@ -1356,6 +1418,7 @@ dev = ["flake8", "markdown", "twine", "wheel"] name = "gitdb" version = "4.0.11" description = "Git Object Database" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1370,6 +1433,7 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1388,6 +1452,7 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", name = "gprof2dot" version = "2022.7.29" description = "Generate a dot graph from the output of several profilers." +category = "main" optional = false python-versions = ">=2.7" files = [ @@ -1399,6 +1464,7 @@ files = [ name = "graphene" version = "2.1.9" description = "GraphQL Framework for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -1421,6 +1487,7 @@ test = ["coveralls", "fastdiff (==0.2.0)", "iso8601", "mock", "promise", "pytest name = "graphene-django" version = "2.16.0" description = "Graphene Django integration" +category = "main" optional = false python-versions = "*" files = [ @@ -1445,6 +1512,7 @@ test = ["coveralls", "django-filter (>=2)", "djangorestframework (>=3.6.3)", "mo name = "graphene-django-optimizer" version = "0.8.0" description = "Optimize database access inside graphene queries." +category = "main" optional = false python-versions = "*" files = [ @@ -1455,6 +1523,7 @@ files = [ name = "graphql-core" version = "2.3.2" description = "GraphQL implementation for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -1475,6 +1544,7 @@ test = ["coveralls (==1.11.1)", "cython (==0.29.17)", "gevent (==1.5.0)", "pyann name = "graphql-relay" version = "2.0.1" description = "Relay implementation for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -1491,6 +1561,7 @@ six = ">=1.12" name = "griffe" version = "0.45.2" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1506,6 +1577,7 @@ colorama = ">=0.4" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1517,6 +1589,7 @@ files = [ name = "httpcore" version = "1.0.5" description = "A minimal low-level HTTP client." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1531,13 +1604,14 @@ h11 = ">=0.13,<0.15" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" version = "0.27.0" description = "The next generation HTTP client." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1548,20 +1622,21 @@ files = [ [package.dependencies] anyio = "*" certifi = "*" -httpcore = "==1.*" +httpcore = ">=1.0.0,<2.0.0" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1573,6 +1648,7 @@ files = [ name = "importlib-metadata" version = "4.13.0" description = "Read metadata from Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1592,6 +1668,7 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag name = "importlib-resources" version = "6.4.0" description = "Read resources from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1610,6 +1687,7 @@ testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "p name = "incremental" version = "22.10.0" description = "\"A small library that versions your Python projects.\"" +category = "dev" optional = false python-versions = "*" files = [ @@ -1625,6 +1703,7 @@ scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] name = "inflection" version = "0.5.1" description = "A port of Ruby on Rails inflector to Python" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1636,6 +1715,7 @@ files = [ name = "invoke" version = "2.2.0" description = "Pythonic task execution" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1647,6 +1727,7 @@ files = [ name = "ipython" version = "8.12.3" description = "IPython: Productive Interactive Computing" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1686,6 +1767,7 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "isort" version = "5.13.2" description = "A Python utility / library to sort Python imports." +category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1700,6 +1782,7 @@ colors = ["colorama (>=0.4.6)"] name = "jdiff" version = "0.0.6" description = "A light-weight library to compare structured output from network devices show commands." +category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -1715,6 +1798,7 @@ jmespath = ">=1.0.1,<2.0.0" name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1734,6 +1818,7 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1751,6 +1836,7 @@ i18n = ["Babel (>=2.7)"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1762,6 +1848,7 @@ files = [ name = "jsonschema" version = "4.22.0" description = "An implementation of JSON Schema validation for Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1785,6 +1872,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1800,6 +1888,7 @@ referencing = ">=0.31.0" name = "junos-eznc" version = "2.7.1" description = "Junos 'EZ' automation for non-programmers" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1823,6 +1912,7 @@ yamlordereddictloader = "*" name = "kombu" version = "5.3.7" description = "Messaging library for Python." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1857,6 +1947,7 @@ zookeeper = ["kazoo (>=2.8.0)"] name = "lxml" version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1934,9 +2025,13 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -2011,6 +2106,7 @@ source = ["Cython (>=3.0.10)"] name = "markdown" version = "3.5.2" description = "Python implementation of John Gruber's Markdown." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2029,6 +2125,7 @@ testing = ["coverage", "pyyaml"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2053,6 +2150,7 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2122,6 +2220,7 @@ files = [ name = "matplotlib-inline" version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2136,6 +2235,7 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2147,6 +2247,7 @@ files = [ name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2158,6 +2259,7 @@ files = [ name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2169,6 +2271,7 @@ files = [ name = "mkdocs" version = "1.5.2" description = "Project documentation with Markdown." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2200,6 +2303,7 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp name = "mkdocs-autorefs" version = "1.0.1" description = "Automatically link across pages in MkDocs." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2216,6 +2320,7 @@ mkdocs = ">=1.1" name = "mkdocs-material" version = "9.1.15" description = "Documentation that simply works" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2238,6 +2343,7 @@ requests = ">=2.26" name = "mkdocs-material-extensions" version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2249,6 +2355,7 @@ files = [ name = "mkdocs-version-annotations" version = "1.0.0" description = "MkDocs plugin to add custom admonitions for documenting version differences" +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -2260,6 +2367,7 @@ files = [ name = "mkdocstrings" version = "0.22.0" description = "Automatic documentation from sources, for MkDocs." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2286,6 +2394,7 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] name = "mkdocstrings-python" version = "1.5.2" description = "A Python handler for mkdocstrings." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2301,6 +2410,7 @@ mkdocstrings = ">=0.20" name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2312,6 +2422,7 @@ files = [ name = "napalm" version = "4.1.0" description = "Network Automation and Programmability Abstraction Layer with Multivendor support" +category = "main" optional = false python-versions = "*" files = [ @@ -2344,6 +2455,7 @@ typing-extensions = ">=4.3.0" name = "nautobot" version = "2.2.5" description = "Source of truth and network automation platform." +category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -2408,6 +2520,7 @@ sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] name = "nautobot-plugin-nornir" version = "2.0.1" description = "Nautobot Nornir plugin." +category = "main" optional = false python-versions = ">=3.8,<3.12" files = [ @@ -2424,6 +2537,7 @@ nornir-nautobot = ">=3.0.0,<4.0.0" name = "nautobot-secrets-providers" version = "2.0.1" description = "Nautobot Secrets Providers App" +category = "main" optional = false python-versions = ">=3.8,<3.12" files = [ @@ -2442,6 +2556,7 @@ thycotic = ["python-tss-sdk (>=1.2.0,<1.3.0)"] name = "nautobot-ssot" version = "2.6.1" description = "Nautobot Single Source of Truth" +category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -2471,6 +2586,7 @@ servicenow = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "ijson (>=2.5.1)", "oauthlib name = "ncclient" version = "0.6.15" description = "Python library for NETCONF clients" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2487,6 +2603,7 @@ six = "*" name = "netaddr" version = "0.10.1" description = "A network address manipulation library for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -2498,6 +2615,7 @@ files = [ name = "netmiko" version = "4.3.0" description = "Multi-vendor library to simplify legacy CLI connections to network devices" +category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -2517,6 +2635,7 @@ textfsm = ">=1.1.3" name = "netutils" version = "1.8.1" description = "Common helper functions useful in network automation." +category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ @@ -2531,6 +2650,7 @@ optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] name = "nh3" version = "0.2.17" description = "Python bindings to the ammonia HTML sanitization library." +category = "main" optional = false python-versions = "*" files = [ @@ -2556,6 +2676,7 @@ files = [ name = "nornir" version = "3.4.1" description = "Pluggable multi-threaded framework with inventory management to help operate collections of devices" +category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -2572,6 +2693,7 @@ mypy_extensions = ">=1.0.0,<2.0.0" name = "nornir-jinja2" version = "0.2.0" description = "Jinja2 plugins for nornir" +category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -2587,6 +2709,7 @@ nornir = ">=3,<4" name = "nornir-napalm" version = "0.4.0" description = "NAPALM's plugins for nornir" +category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -2602,6 +2725,7 @@ nornir = ">=3,<4" name = "nornir-nautobot" version = "3.2.0" description = "Nornir Nautobot" +category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ @@ -2627,6 +2751,7 @@ mikrotik-driver = ["routeros-api (>=0.17.0,<0.18.0)"] name = "nornir-netmiko" version = "1.0.1" description = "Netmiko's plugins for Nornir" +category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -2641,6 +2766,7 @@ netmiko = ">=4.0.0,<5.0.0" name = "nornir-utils" version = "0.2.0" description = "Collection of plugins and functions for nornir that don't require external dependencies" +category = "main" optional = false python-versions = ">=3.6.2,<4.0.0" files = [ @@ -2654,13 +2780,14 @@ nornir = ">=3,<4" [[package]] name = "ntc-templates" -version = "5.1.0" +version = "6.0.0" description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable." +category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "ntc_templates-5.1.0-py3-none-any.whl", hash = "sha256:8784bbf790a814789910c04148ee84726183228f173a118b80e0c7420290b4dd"}, - {file = "ntc_templates-5.1.0.tar.gz", hash = "sha256:820583f35a8d7411c86b70635a6acd65ce357b8bc19e1f408ce836eac30a6371"}, + {file = "ntc_templates-6.0.0-py3-none-any.whl", hash = "sha256:fbfbf7ebe6e1be1ad7123dfc907f353eda68a539d4f54555f8a081e8174659df"}, + {file = "ntc_templates-6.0.0.tar.gz", hash = "sha256:b1f235f017a20408057b8d43856c072b76a169ca420715217b048eff871a3a95"}, ] [package.dependencies] @@ -2670,6 +2797,7 @@ textfsm = ">=1.1.0,<2.0.0" name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2686,6 +2814,7 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "ordered-set" version = "4.1.0" description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2700,6 +2829,7 @@ dev = ["black", "mypy", "pytest"] name = "packaging" version = "23.2" description = "Core utilities for Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2711,6 +2841,7 @@ files = [ name = "paramiko" version = "3.4.0" description = "SSH2 protocol library" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2732,6 +2863,7 @@ invoke = ["invoke (>=2.0)"] name = "parso" version = "0.8.4" description = "A Python Parser" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2747,6 +2879,7 @@ testing = ["docopt", "pytest"] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2758,6 +2891,7 @@ files = [ name = "pbr" version = "6.0.0" description = "Python Build Reasonableness" +category = "dev" optional = false python-versions = ">=2.6" files = [ @@ -2769,6 +2903,7 @@ files = [ name = "pexpect" version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." +category = "dev" optional = false python-versions = "*" files = [ @@ -2783,6 +2918,7 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" optional = false python-versions = "*" files = [ @@ -2794,6 +2930,7 @@ files = [ name = "pillow" version = "10.3.0" description = "Python Imaging Library (Fork)" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2880,6 +3017,7 @@ xmp = ["defusedxml"] name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2891,6 +3029,7 @@ files = [ name = "platformdirs" version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2907,6 +3046,7 @@ type = ["mypy (>=1.8)"] name = "prometheus-client" version = "0.20.0" description = "Python client for the Prometheus monitoring system." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2921,6 +3061,7 @@ twisted = ["twisted"] name = "promise" version = "2.3" description = "Promises/A+ implementation for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -2937,6 +3078,7 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", name = "prompt-toolkit" version = "3.0.45" description = "Library for building powerful interactive command lines in Python" +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -2951,6 +3093,7 @@ wcwidth = "*" name = "psycopg2-binary" version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3032,6 +3175,7 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" +category = "dev" optional = false python-versions = "*" files = [ @@ -3043,6 +3187,7 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" +category = "dev" optional = false python-versions = "*" files = [ @@ -3057,6 +3202,7 @@ tests = ["pytest"] name = "pycodestyle" version = "2.9.1" description = "Python style guide checker" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3068,6 +3214,7 @@ files = [ name = "pycparser" version = "2.22" description = "C parser in Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3079,6 +3226,7 @@ files = [ name = "pydantic" version = "1.10.15" description = "Data validation and settings management using python type hints" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3131,6 +3279,7 @@ email = ["email-validator (>=1.0.3)"] name = "pyeapi" version = "1.0.2" description = "Python Client for eAPI" +category = "main" optional = false python-versions = "*" files = [ @@ -3148,6 +3297,7 @@ test = ["coverage", "mock"] name = "pyflakes" version = "2.5.0" description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3159,6 +3309,7 @@ files = [ name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3173,6 +3324,7 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3190,6 +3342,7 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pylint" version = "3.2.2" description = "python code static checker" +category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -3219,6 +3372,7 @@ testutils = ["gitpython (>3)"] name = "pylint-django" version = "2.5.5" description = "A Pylint plugin to help Pylint understand the Django web framework" +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3237,6 +3391,7 @@ with-django = ["Django (>=2.2)"] name = "pylint-nautobot" version = "0.3.0" description = "Custom Pylint Rules for Nautobot" +category = "dev" optional = false python-versions = ">=3.8,<3.12" files = [ @@ -3254,6 +3409,7 @@ toml = ">=0.10.2" name = "pylint-plugin-utils" version = "0.8.2" description = "Utilities and helpers for writing Pylint plugins" +category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3268,6 +3424,7 @@ pylint = ">=1.7" name = "pymdown-extensions" version = "10.7.1" description = "Extension pack for Python Markdown." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3286,6 +3443,7 @@ extra = ["pygments (>=2.12)"] name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3312,6 +3470,7 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] name = "pynautobot" version = "2.1.1" description = "Nautobot API client library" +category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ @@ -3328,6 +3487,7 @@ urllib3 = ">=1.21.1,<1.27" name = "pyparsing" version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" optional = false python-versions = ">=3.6.8" files = [ @@ -3342,6 +3502,7 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyserial" version = "3.5" description = "Python Serial Port Extension" +category = "main" optional = false python-versions = "*" files = [ @@ -3356,6 +3517,7 @@ cp2110 = ["hidapi"] name = "python-crontab" version = "3.1.0" description = "Python Crontab API" +category = "main" optional = false python-versions = "*" files = [ @@ -3373,6 +3535,7 @@ cron-schedule = ["croniter"] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3387,6 +3550,7 @@ six = ">=1.5" name = "python-slugify" version = "8.0.4" description = "A Python slugify application that also handles Unicode" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3404,6 +3568,7 @@ unidecode = ["Unidecode (>=1.1.1)"] name = "python-tss-sdk" version = "1.2.2" description = "The Delinea Secret Server Python SDK" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3418,6 +3583,7 @@ requests = ">=2.12.5" name = "python3-openid" version = "3.2.0" description = "OpenID support for modern servers and consumers." +category = "main" optional = false python-versions = "*" files = [ @@ -3436,6 +3602,7 @@ postgresql = ["psycopg2"] name = "pytz" version = "2024.1" description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" files = [ @@ -3447,6 +3614,7 @@ files = [ name = "pyuwsgi" version = "2.0.23.post0" description = "The uWSGI server" +category = "main" optional = false python-versions = "*" files = [ @@ -3499,6 +3667,7 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3520,7 +3689,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3559,6 +3727,7 @@ files = [ name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3573,6 +3742,7 @@ pyyaml = "*" name = "redis" version = "5.0.4" description = "Python client for Redis database and key-value store" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3591,6 +3761,7 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "referencing" version = "0.35.1" description = "JSON Referencing + Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3606,6 +3777,7 @@ rpds-py = ">=0.7.0" name = "regex" version = "2024.5.15" description = "Alternative regular expression module, to replace re." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3694,6 +3866,7 @@ files = [ name = "requests" version = "2.32.3" description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3715,6 +3888,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-oauthlib" version = "2.0.0" description = "OAuthlib authentication support for Requests." +category = "main" optional = false python-versions = ">=3.4" files = [ @@ -3733,6 +3907,7 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "rich" version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -3752,6 +3927,7 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3860,6 +4036,7 @@ files = [ name = "ruamel-yaml" version = "0.18.6" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3878,6 +4055,7 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] name = "ruamel-yaml-clib" version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3937,6 +4115,7 @@ files = [ name = "ruff" version = "0.4.6" description = "An extremely fast Python linter and code formatter, written in Rust." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3963,6 +4142,7 @@ files = [ name = "rx" version = "1.6.3" description = "Reactive Extensions (Rx) for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -3973,6 +4153,7 @@ files = [ name = "scp" version = "0.15.0" description = "scp module for paramiko" +category = "main" optional = false python-versions = "*" files = [ @@ -3987,6 +4168,7 @@ paramiko = "*" name = "setuptools" version = "70.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4002,6 +4184,7 @@ testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metad name = "singledispatch" version = "4.1.0" description = "Backport functools.singledispatch to older Pythons." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4017,6 +4200,7 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4028,6 +4212,7 @@ files = [ name = "smmap" version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4039,6 +4224,7 @@ files = [ name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4050,6 +4236,7 @@ files = [ name = "social-auth-app-django" version = "5.4.1" description = "Python Social Authentication, Django integration." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4065,6 +4252,7 @@ social-auth-core = ">=4.4.1" name = "social-auth-core" version = "4.5.4" description = "Python social authentication made simple." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4091,6 +4279,7 @@ saml = ["python3-saml (>=1.5.0)"] name = "sqlparse" version = "0.5.0" description = "A non-validating SQL parser." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4106,6 +4295,7 @@ doc = ["sphinx"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" optional = false python-versions = "*" files = [ @@ -4125,6 +4315,7 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "stevedore" version = "5.2.0" description = "Manage dynamic plugins for Python applications" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4139,6 +4330,7 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" name = "structlog" version = "22.3.0" description = "Structured Logging for Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4156,6 +4348,7 @@ typing = ["mypy", "rich", "twisted"] name = "svgwrite" version = "1.4.3" description = "A Python library to create SVG drawings." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4167,6 +4360,7 @@ files = [ name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" +category = "main" optional = false python-versions = "*" files = [ @@ -4178,6 +4372,7 @@ files = [ name = "textfsm" version = "1.1.3" description = "Python module for parsing semi-structured text into python tables." +category = "main" optional = false python-versions = "*" files = [ @@ -4193,6 +4388,7 @@ six = "*" name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4204,6 +4400,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4215,6 +4412,7 @@ files = [ name = "tomlkit" version = "0.12.5" description = "Style preserving TOML library" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4226,6 +4424,7 @@ files = [ name = "towncrier" version = "23.6.0" description = "Building newsfiles for your project." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4248,6 +4447,7 @@ dev = ["furo", "packaging", "sphinx (>=5)", "twisted"] name = "traitlets" version = "5.14.3" description = "Traitlets Python configuration system" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4263,6 +4463,7 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, name = "transitions" version = "0.9.1" description = "A lightweight, object-oriented Python state machine implementation with many extensions." +category = "main" optional = false python-versions = "*" files = [ @@ -4281,6 +4482,7 @@ test = ["pytest"] name = "ttp" version = "0.9.5" description = "Template Text Parser" +category = "main" optional = false python-versions = ">=2.7,<4.0" files = [ @@ -4296,6 +4498,7 @@ full = ["cerberus (>=1.3.0,<1.4.0)", "deepdiff (>=5.8.0,<5.9.0)", "jinja2 (>=3.0 name = "ttp-templates" version = "0.3.6" description = "Template Text Parser Templates collections" +category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -4313,6 +4516,7 @@ docs = ["mkdocs (==1.2.4)", "mkdocs-material (==7.2.2)", "mkdocs-material-extens name = "typing-extensions" version = "4.12.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4324,6 +4528,7 @@ files = [ name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" +category = "main" optional = false python-versions = ">=2" files = [ @@ -4335,6 +4540,7 @@ files = [ name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4346,6 +4552,7 @@ files = [ name = "urllib3" version = "1.26.18" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -4362,6 +4569,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "vine" version = "5.1.0" description = "Python promises." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4373,6 +4581,7 @@ files = [ name = "watchdog" version = "4.0.1" description = "Filesystem events monitoring" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4417,6 +4626,7 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" +category = "main" optional = false python-versions = "*" files = [ @@ -4428,6 +4638,7 @@ files = [ name = "wheel" version = "0.43.0" description = "A built-package format for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4442,6 +4653,7 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] name = "yamllint" version = "1.35.1" description = "A linter for YAML files." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4460,6 +4672,7 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] name = "yamlordereddictloader" version = "0.4.2" description = "YAML loader and dumper for PyYAML allowing to keep keys order." +category = "main" optional = false python-versions = "*" files = [ @@ -4474,6 +4687,7 @@ pyyaml = "*" name = "zipp" version = "3.19.0" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4491,4 +4705,4 @@ all = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "1f7f6cc8e9da5151921c1c1374c16084b12b731aead2a6cc40744028e4689d49" +content-hash = "0b8119fe40f9f5cbd29c6b5775c121b9240702214f3a58ac02eb86859c4a95ce" diff --git a/pyproject.toml b/pyproject.toml index d0aa4510..afafeae9 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ nautobot = "^2.2.3" nautobot-ssot = "^2.6.0" nautobot-plugin-nornir = "^2.0.0" jdiff = "^0.0.6" -ntc-templates = "^5.1.0" +ntc-templates = "^6.0.0" nautobot-secrets-providers = "^2.0.1" python-tss-sdk = "*" From 72b086d5afd2979385f15a2854e1ed708af14a26 Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 23 Jul 2024 10:10:36 -0400 Subject: [PATCH 60/81] add post processor to ios and xe --- nautobot_device_onboarding/command_mappers/cisco_ios.yml | 1 + nautobot_device_onboarding/command_mappers/cisco_xe.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/nautobot_device_onboarding/command_mappers/cisco_ios.yml b/nautobot_device_onboarding/command_mappers/cisco_ios.yml index a3a09ae5..7a0ab70b 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_ios.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_ios.yml @@ -126,3 +126,4 @@ sync_network_data: - command: "show cdp neighbors detail" parser: "textfsm" jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" + post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" diff --git a/nautobot_device_onboarding/command_mappers/cisco_xe.yml b/nautobot_device_onboarding/command_mappers/cisco_xe.yml index 2a009dd8..aa1e5c8a 100755 --- a/nautobot_device_onboarding/command_mappers/cisco_xe.yml +++ b/nautobot_device_onboarding/command_mappers/cisco_xe.yml @@ -125,3 +125,4 @@ sync_network_data: - command: "show cdp neighbors detail" parser: "textfsm" jpath: "[*].{local_interface:local_interface, remote_interface:neighbor_interface, remote_device:neighbor_name}" + post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" From 81c3731290f7283b87e9ad60f96f0dadd67998aa Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 23 Jul 2024 10:10:48 -0400 Subject: [PATCH 61/81] adjust error handling --- .../diffsync/adapters/sync_network_data_adapters.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index 17e19075..b1119d2c 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -241,11 +241,9 @@ def load_cables(self): for device in self.job.devices_to_load: for cable in device.get_cables(): if cable.termination_b.device.name == "" or cable.termination_a.device.name == "": - self._handle_general_load_exception( - error="Device attached to a cable is missing a name. Devices must have a name to utilize cable onboarding.", - hostname=device.name, - data=cable, - model_type="cable", + self.job.logger.warning( + f"Device attached to a cable is missing a name. Devices must have a name to utilize cable onboarding. " + f"Skipping Cable: {cable}" ) continue if cable.termination_a.device.name < cable.termination_b.device.name: From 747342eb8ad50e243f3bf8b63fb81c294bc4efe6 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Tue, 23 Jul 2024 16:16:19 +0000 Subject: [PATCH 62/81] added cable support for juniper --- .../command_mappers/juniper_junos.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml index f770c1ce..fce9f802 100755 --- a/nautobot_device_onboarding/command_mappers/juniper_junos.yml +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -110,3 +110,10 @@ sync_network_data: parser: "textfsm" jpath: "[?contains(interfaces, `{{ current_key }}`*)].{admin_mode: admin_mode, mode: mode, access_vlan: access_vlan, trunking_vlans: trunking_vlans, native_vlan: native_vlan}" post_processor: "{{ obj | get_vlan_data(vlan_map, 'untagged') | tojson }}" + cables: + commands: + - command: "show lldp neighbors | display json" + parser: "none" + jpath: '"lldp-neighbors-information"[]."lldp-neighbor-information"[].{local_interface: "lldp-local-port-id"[0].data, remote_interface: "lldp-remote-port-id"[0].data, remote_device: "lldp-remote-system-name"[0].data}' # yamllint disable-line rule:quoted-strings + post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" + iterable_type: "dict" \ No newline at end of file From 33da75b049ba4f242f42e65e636fa626d0e89423 Mon Sep 17 00:00:00 2001 From: Susan Hooks Date: Thu, 25 Jul 2024 14:37:57 +0000 Subject: [PATCH 63/81] yamlint --- nautobot_device_onboarding/command_mappers/juniper_junos.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml index fce9f802..74fb729e 100755 --- a/nautobot_device_onboarding/command_mappers/juniper_junos.yml +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -116,4 +116,5 @@ sync_network_data: parser: "none" jpath: '"lldp-neighbors-information"[]."lldp-neighbor-information"[].{local_interface: "lldp-local-port-id"[0].data, remote_interface: "lldp-remote-port-id"[0].data, remote_device: "lldp-remote-system-name"[0].data}' # yamllint disable-line rule:quoted-strings post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" - iterable_type: "dict" \ No newline at end of file + iterable_type: "dict" + \ No newline at end of file From 893cabeb89eaf6b5bf53c62f45246934a93f7a1e Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 26 Jul 2024 15:09:51 -0400 Subject: [PATCH 64/81] force interface description to a string if empty --- nautobot_device_onboarding/command_mappers/arista_eos.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/nautobot_device_onboarding/command_mappers/arista_eos.yml b/nautobot_device_onboarding/command_mappers/arista_eos.yml index cf60f39e..ef72954e 100755 --- a/nautobot_device_onboarding/command_mappers/arista_eos.yml +++ b/nautobot_device_onboarding/command_mappers/arista_eos.yml @@ -76,6 +76,7 @@ sync_network_data: - command: "show interfaces | json" parser: "none" jpath: 'interfaces."{{ current_key }}".description' # yamllint disable-line rule:quoted-strings + iterable_type: "str" interfaces__link_status: commands: - command: "show interfaces | json" From adf699360c5110d91d77c43e684c92b7a2e28f1f Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 26 Jul 2024 15:10:03 -0400 Subject: [PATCH 65/81] typo --- .../diffsync/adapters/sync_devices_adapters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py index 08c446d8..83e93ddd 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_devices_adapters.py @@ -295,7 +295,7 @@ def _fields_missing_data(self, device_data, ip_address, platform): """Verify that all of the fields returned from a device actually contain data.""" fields_missing_data = [] required_fields_from_device = ["device_type", "hostname", "mgmt_interface", "mask_length", "serial"] - if platform: # platform is only retruned with device data if not provided on the job form/csv + if platform: # platform is only returned with device data if not provided on the job form/csv required_fields_from_device.append("platform") for field in required_fields_from_device: data = device_data[ip_address] From c82536c1fe28f5d0104877ffe7c196c1360c5e78 Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 26 Jul 2024 17:13:07 -0400 Subject: [PATCH 66/81] skip cables when cables aren't in the command getter --- .../diffsync/adapters/sync_network_data_adapters.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py index b1119d2c..3fd236a8 100644 --- a/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py +++ b/nautobot_device_onboarding/diffsync/adapters/sync_network_data_adapters.py @@ -709,6 +709,9 @@ def load_vrf_to_interface(self): def load_cables(self): # pylint: disable=inconsistent-return-statements """Load cables into the Diffsync store.""" for hostname, device_data in self.job.command_getter_result.items(): + if "cables" not in device_data: + self.job.logger.warning(f"No cable data found for {hostname}. Skipping cable load.") + return if self.job.debug: self.job.logger.debug(f"Loading Cables from {hostname}") self.job.logger.debug(f"Cable Data: {device_data['cables']}") From 036081195c11ab6b47069a862405bb40d93d4566 Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 26 Jul 2024 17:13:43 -0400 Subject: [PATCH 67/81] skip vlan pre_processor when not syncing vlans --- .../nornir_plays/command_getter.py | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 86161273..9ae880bd 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -53,7 +53,9 @@ def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables): all_commands = [] for key, value in yaml_parsed_info.items(): if key == "pre_processor": - for _, v in value.items(): + for pre_processor, v in value.items(): + if not sync_vlans and pre_processor == "vlan_map": + continue current_root_key = v.get("commands") if isinstance(current_root_key, list): # Means their is any "nested" structures. e.g multiple commands @@ -94,7 +96,9 @@ def _get_commands_to_run(yaml_parsed_info, sync_vlans, sync_vrfs, sync_cables): return deduplicate_command_list(all_commands) -def netmiko_send_commands(task: Task, command_getter_yaml_data: Dict, command_getter_job: str, **orig_job_kwargs): +def netmiko_send_commands( + task: Task, command_getter_yaml_data: Dict, command_getter_job: str, logger, **orig_job_kwargs +): """Run commands specified in PLATFORM_COMMAND_MAP.""" if not task.host.platform: return Result(host=task.host, result=f"{task.host.name} has no platform set.", failed=True) @@ -111,6 +115,17 @@ def netmiko_send_commands(task: Task, command_getter_yaml_data: Dict, command_ge orig_job_kwargs.get("sync_vrfs", False), orig_job_kwargs.get("sync_cables", False), ) + # if ( + # orig_job_kwargs.get("sync_cables", False) + # and "cables" not in command_getter_yaml_data[task.host.platform][command_getter_job].keys() + # ): + # return Result( + # host=task.host, + # result=f"{task.host.name} has missing definitions for cables in command_mapper YAML file.", + # failed=True, + # ) + + logger.debug(f"Commands to run: {commands}") # All commands in this for loop are running within 1 device connection. for result_idx, command in enumerate(commands): send_command_kwargs = {} @@ -151,7 +166,7 @@ def netmiko_send_commands(task: Task, command_getter_yaml_data: Dict, command_ge except Exception: task.result.failed = False except NornirSubTaskError: - # We don't want to fail the entire subtask if SubTaskError is hit, set result to empty list and failt to False + # We don't want to fail the entire subtask if SubTaskError is hit, set result to empty list and failed to False # Handle this type or result latter in the ETL process. task.results[result_idx].result = [] task.results[result_idx].failed = False @@ -294,6 +309,7 @@ def sync_network_data_command_getter(job_result, log_level, kwargs): task=netmiko_send_commands, command_getter_yaml_data=nr_with_processors.inventory.defaults.data["platform_parsing_info"], command_getter_job="sync_network_data", + logger=logger, **kwargs, ) except Exception as err: # pylint: disable=broad-exception-caught From a592559d5681e91b6e08655b509d28bea494d410 Mon Sep 17 00:00:00 2001 From: scetron Date: Fri, 26 Jul 2024 17:14:05 -0400 Subject: [PATCH 68/81] skip vlan preprocessor when not syncing vlans --- nautobot_device_onboarding/nornir_plays/formatter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nautobot_device_onboarding/nornir_plays/formatter.py b/nautobot_device_onboarding/nornir_plays/formatter.py index 41b0d832..c33a6590 100755 --- a/nautobot_device_onboarding/nornir_plays/formatter.py +++ b/nautobot_device_onboarding/nornir_plays/formatter.py @@ -124,6 +124,8 @@ def perform_data_extraction(host, command_info_dict, command_outputs_dict, job_d get_context_from_pre_processor = {} if command_info_dict.get("pre_processor"): for pre_processor_name, field_data in command_info_dict["pre_processor"].items(): + if pre_processor_name == "vlan_map" and not sync_vlans: + continue if isinstance(field_data["commands"], dict): # only one command is specified as a dict force it to a list. loop_commands = [field_data["commands"]] From 0b840f5fcf37db2190a8b9ae3a1616515fd19820 Mon Sep 17 00:00:00 2001 From: Joe Wesch Date: Mon, 29 Jul 2024 19:12:43 -0500 Subject: [PATCH 69/81] Updates install doc to include PLUGINS dependencies --- docs/admin/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/install.md b/docs/admin/install.md index 100ef010..59c0191a 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -39,7 +39,7 @@ Once installed, the app needs to be enabled in your Nautobot configuration. The ```python # In your nautobot_config.py -PLUGINS = ["nautobot_device_onboarding"] +PLUGINS = ["nautobot_plugin_nornir", "nautobot_ssot", "nautobot_device_onboarding"] # PLUGINS_CONFIG = { # "nautobot_device_onboarding": { From 20e9449ac244b3495986b3d874c5eb70022b6cd0 Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 30 Jul 2024 21:35:01 -0400 Subject: [PATCH 70/81] adjust mock results for new schema/formatter --- .../expected_result_1.json | 10 +- .../expected_result_1.json | 10 +- .../expected_result_1.json | 10 +- .../expected_result_1-old.json | 2405 +++++++++++++++++ 4 files changed, 2420 insertions(+), 15 deletions(-) create mode 100644 nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1-old.json diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json index a5af7864..4d8fa91b 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_no_options/expected_result_1.json @@ -2,7 +2,7 @@ "interfaces": { "Ethernet1": { "802.1Q_mode": "", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "1.1.1.1", @@ -17,7 +17,7 @@ }, "Ethernet2": { "802.1Q_mode": "access", - "description": [], + "description": "", "ip_addresses": [], "lag": [], "link_status": "True", @@ -27,7 +27,7 @@ }, "Ethernet3": { "802.1Q_mode": "access", - "description": [], + "description": "", "ip_addresses": [], "lag": [], "link_status": "True", @@ -37,7 +37,7 @@ }, "Ethernet4": { "802.1Q_mode": "tagged", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "0.0.0.0", @@ -52,7 +52,7 @@ }, "Management1": { "802.1Q_mode": "", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "198.51.100.1", diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json index c6cbabe7..fbfd64b4 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vlans/expected_result_1.json @@ -2,7 +2,7 @@ "interfaces": { "Ethernet1": { "802.1Q_mode": "", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "1.1.1.1", @@ -19,7 +19,7 @@ }, "Ethernet2": { "802.1Q_mode": "access", - "description": [], + "description": "", "ip_addresses": [], "lag": [], "link_status": "True", @@ -34,7 +34,7 @@ }, "Ethernet3": { "802.1Q_mode": "access", - "description": [], + "description": "", "ip_addresses": [], "lag": [], "link_status": "True", @@ -49,7 +49,7 @@ }, "Ethernet4": { "802.1Q_mode": "tagged", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "0.0.0.0", @@ -74,7 +74,7 @@ }, "Management1": { "802.1Q_mode": "", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "198.51.100.1", diff --git a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json index 669319fb..91bf9083 100755 --- a/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json +++ b/nautobot_device_onboarding/tests/mock/arista_eos/sync_network_data_with_vrfs/expected_result_1.json @@ -2,7 +2,7 @@ "interfaces": { "Ethernet1": { "802.1Q_mode": "", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "1.1.1.1", @@ -20,7 +20,7 @@ }, "Ethernet2": { "802.1Q_mode": "access", - "description": [], + "description": "", "ip_addresses": [], "lag": [], "link_status": "True", @@ -31,7 +31,7 @@ }, "Ethernet3": { "802.1Q_mode": "access", - "description": [], + "description": "", "ip_addresses": [], "lag": [], "link_status": "True", @@ -42,7 +42,7 @@ }, "Ethernet4": { "802.1Q_mode": "tagged", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "0.0.0.0", @@ -60,7 +60,7 @@ }, "Management1": { "802.1Q_mode": "", - "description": [], + "description": "", "ip_addresses": [ { "ip_address": "198.51.100.1", diff --git a/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1-old.json b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1-old.json new file mode 100644 index 00000000..f41a842c --- /dev/null +++ b/nautobot_device_onboarding/tests/mock/cisco_nxos/sync_network_data_no_options/expected_result_1-old.json @@ -0,0 +1,2405 @@ +{ + "interfaces": { + "Ethernet1/1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "type": "1000base-t" + }, + "Ethernet1/1.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.246", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/10": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f5", + "mtu": "9216", + "tagged_vlans": [] + }, + "Ethernet1/11": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f6", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/12": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f7", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/13": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f8", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/14": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f9", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/15": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fa", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/16": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/17": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fc", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/18": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fd", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/19": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99fe", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/2.1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.22.250", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/20": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ff", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/21": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a00", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/22": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a01", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "136", + "name": "vlan136" + } + }, + "Ethernet1/23": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a02", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "64", + "name": "vlan64" + }, + { + "id": "110", + "name": "vid110" + }, + { + "id": "115", + "name": "v115" + }, + { + "id": "128", + "name": "vlan128" + }, + { + "id": "160", + "name": "id160" + }, + { + "id": "176", + "name": "vlan176" + }, + { + "id": "192", + "name": "vlan192" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/24": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a03", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "67", + "name": "vlan67" + } + }, + "Ethernet1/25": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a04", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/26": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a05", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/27": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a06", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/28": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/28.2": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.16.0.2", + "prefix_length": "31" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a08", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ee", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "65", + "name": "vlan65" + }, + { + "id": "66", + "name": "vlan66" + }, + { + "id": "67", + "name": "vlan67" + }, + { + "id": "68", + "name": "vlan68" + }, + { + "id": "70", + "name": "vlan70" + }, + { + "id": "71", + "name": "vlan71" + }, + { + "id": "72", + "name": "vlan72" + }, + { + "id": "135", + "name": "VLAN135" + }, + { + "id": "218", + "name": "dns" + }, + { + "id": "219", + "name": "v219" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/30": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a09", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/31": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/32": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0b", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/34": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0d", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0f", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/38": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a11", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/39": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a12", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/4": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99ef", + "mtu": "9216", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/40": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a13", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/42": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": {} + }, + "Ethernet1/43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/44": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a17", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/46": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a19", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/47": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/48": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a1b", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/49": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1c", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/5": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99f0", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "200", + "name": "data" + } + }, + "Ethernet1/50": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1d", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/51": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1e", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/52": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a1f", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a20", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + } + ], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/54": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.9a21", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "tagged_vlans": [], + "type": "1000base-t", + "untagged_vlan": { + "id": "201", + "name": "fw" + } + }, + "Ethernet1/7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f2", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/8": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Ethernet1/9": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f4", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "1000base-t", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "Vlan1": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan110": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.67", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan115": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.1.83", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan128": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.133", + "prefix_length": "27" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan135": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.135.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan136": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "144.5.136.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan160": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan176": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.190", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan192": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.198", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan200": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.19", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan201": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.73.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan202": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.42", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan210": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.98", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan214": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.3", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan215": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.131", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan216": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.57.195", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan218": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.218.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan219": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.219.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan220": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.59.243", + "prefix_length": "29" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3112": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.32.1", + "prefix_length": "21" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3130": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "172.22.8.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan3146": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.197.131", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan345": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.5.174", + "prefix_length": "28" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan350": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "139.65.137.3", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan63": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.63.3", + "prefix_length": "25" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "9216", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan64": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.34.6.126", + "prefix_length": "26" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan66": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.66.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan67": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.67.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan68": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.68.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "False", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan70": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.70.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan71": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.71.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "Vlan72": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.72.3", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "virtual", + "untagged_vlan": {} + }, + "loopback0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.27.111.247", + "prefix_length": "32" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "mgmt0": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "198.51.100.1", + "prefix_length": "24" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99e4", + "mtu": "1500", + "tagged_vlans": [], + "type": "other", + "untagged_vlan": {} + }, + "port-channel29": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0a", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "851", + "name": "VLAN0851" + }, + { + "id": "852", + "name": "VLAN0852" + }, + { + "id": "853", + "name": "VLAN0853" + }, + { + "id": "854", + "name": "VLAN0854" + }, + { + "id": "855", + "name": "VLAN0855" + }, + { + "id": "856", + "name": "VLAN0856" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel3": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "65", + "name": "vlan65" + }, + { + "id": "66", + "name": "vlan66" + }, + { + "id": "67", + "name": "vlan67" + }, + { + "id": "68", + "name": "vlan68" + }, + { + "id": "70", + "name": "vlan70" + }, + { + "id": "71", + "name": "vlan71" + }, + { + "id": "72", + "name": "vlan72" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel33": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0c", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "3085", + "name": "Servers" + }, + { + "id": "3210", + "name": "svc" + }, + { + "id": "3214", + "name": "mgm" + }, + { + "id": "3215", + "name": "mgmt" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel35": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a0e", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel36": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "210", + "name": "Mgmt.FW" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel37": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a10", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "2", + "name": "VLAN0002" + }, + { + "id": "3", + "name": "VLAN0003" + }, + { + "id": "4", + "name": "VLAN0004" + }, + { + "id": "5", + "name": "VLAN0005" + }, + { + "id": "6", + "name": "VLAN0006" + }, + { + "id": "7", + "name": "VLAN0007" + }, + { + "id": "8", + "name": "VLAN0008" + }, + { + "id": "9", + "name": "VLAN0009" + }, + { + "id": "211", + "name": "VLAN0211" + }, + { + "id": "212", + "name": "VLAN0212" + }, + { + "id": "213", + "name": "VLAN0213" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel41": { + "802.1Q_mode": "", + "description": "a description", + "ip_addresses": [ + { + "ip_address": "10.1.0.2", + "prefix_length": "30" + } + ], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99eb", + "mtu": "1500", + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": {} + }, + "port-channel43": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a16", + "mtu": "1500", + "tagged_vlans": [ + { + "id": "10", + "name": "vlan10" + }, + { + "id": "136", + "name": "vlan136" + }, + { + "id": "202", + "name": "VLAN0202" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "214", + "name": "inter" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel45": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.9a18", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "1", + "name": "default" + }, + { + "id": "209", + "name": "abc" + }, + { + "id": "210", + "name": "Mgmt.FW" + }, + { + "id": "211", + "name": "VLAN0211" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel53": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "False", + "mac_address": "0000.0000.0000", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + }, + "port-channel6": { + "802.1Q_mode": "access", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f1", + "mtu": "1500", + "tagged_vlans": [], + "type": "lag", + "untagged_vlan": { + "id": "201", + "name": "fw" + } + }, + "port-channel7": { + "802.1Q_mode": "tagged", + "description": "a description", + "ip_addresses": [], + "lag": "", + "link_status": "True", + "mac_address": "286f.7f7e.99f3", + "mtu": "9216", + "tagged_vlans": [ + { + "id": "68", + "name": "vlan68" + }, + { + "id": "215", + "name": "vmware" + }, + { + "id": "216", + "name": "VLAN0216" + }, + { + "id": "219", + "name": "v219" + }, + { + "id": "3030", + "name": "storage" + } + ], + "type": "lag", + "untagged_vlan": { + "id": "1", + "name": "default" + } + } + }, + "serial": "FDO20432435" +} \ No newline at end of file From d909ed059fccd7e38eb950c5b2244dd7513eec2c Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 30 Jul 2024 21:35:17 -0400 Subject: [PATCH 71/81] fix typo --- docs/admin/install.md | 2 +- nautobot_device_onboarding/tests/test_nautobot_keeper.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/admin/install.md b/docs/admin/install.md index 100ef010..dd607352 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -71,7 +71,7 @@ Although the app can run without providing any settings, the app behavior can be - `create_platform_if_missing` boolean (default True). If True, a new platform object will be created if the platform discovered by netmiko do not already exist and is in the list of supported platforms (`cisco_ios`, `cisco_nxos`, `arista_eos`, `juniper_junos`, `cisco_xr`) - `create_device_type_if_missing` boolean (default True), If True, a new device type object will be created if the model discovered by Napalm do not match an existing device type. - `create_manufacturer_if_missing` boolean (default True), If True, a new manufacturer object will be created if the manufacturer discovered by Napalm is do not match an existing manufacturer, this option is only valid if `create_device_type_if_missing` is True as well. -- `create_device_role_if_missing` boolean (default True), If True, a new device role object will be created if the device role provided was not provided as part of the onboarding and if the `default_device_role` do not already exist. +- `create_device_role_if_missing` boolean (default True), If True, a new device role object will be created if the device role provided was not provided as part of the onboarding and if the `default_device_role` does not already exist. - `create_management_interface_if_missing` boolean (default True), If True, add management interface and IP address to the device. If False no management interfaces will be created, nor will the IP address be added to Nautobot, while the device will still get added. - `default_device_status` string (default "Active"), status assigned to a new device by default. - `default_ip_status` string (default "Active"), status assigned to a new device management IP. diff --git a/nautobot_device_onboarding/tests/test_nautobot_keeper.py b/nautobot_device_onboarding/tests/test_nautobot_keeper.py index 5cfe8cd3..35c542b0 100644 --- a/nautobot_device_onboarding/tests/test_nautobot_keeper.py +++ b/nautobot_device_onboarding/tests/test_nautobot_keeper.py @@ -437,7 +437,7 @@ def test_ensure_interface_exist(self): self.assertEqual(nbk.nb_mgmt_ifname, intf) def test_ensure_primary_ip_not_exist(self): - """Verify ensure_primary_ip function when the IP address do not already exist.""" + """Verify ensure_primary_ip function when the IP address does not already exist.""" onboarding_kwargs = { "netdev_hostname": "device1", "netdev_nb_role_name": PLUGIN_SETTINGS["default_device_role"], From 5a4cdca2742d0d48ca176040acfe7966ca43a1d6 Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 30 Jul 2024 21:35:30 -0400 Subject: [PATCH 72/81] lint --- nautobot_device_onboarding/command_mappers/juniper_junos.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/nautobot_device_onboarding/command_mappers/juniper_junos.yml b/nautobot_device_onboarding/command_mappers/juniper_junos.yml index 74fb729e..74e79ef9 100755 --- a/nautobot_device_onboarding/command_mappers/juniper_junos.yml +++ b/nautobot_device_onboarding/command_mappers/juniper_junos.yml @@ -117,4 +117,3 @@ sync_network_data: jpath: '"lldp-neighbors-information"[]."lldp-neighbor-information"[].{local_interface: "lldp-local-port-id"[0].data, remote_interface: "lldp-remote-port-id"[0].data, remote_device: "lldp-remote-system-name"[0].data}' # yamllint disable-line rule:quoted-strings post_processor: "{% set result = [] %}{% for cable in obj %}{% set _=result.append({'local_interface': cable['local_interface'], 'remote_interface': cable['remote_interface'], 'remote_device': cable['remote_device'] | remove_fqdn }) %}{% endfor %}{{ result | tojson }}" iterable_type: "dict" - \ No newline at end of file From 60dc6571256a230943e44e8f8c2b6bc9f16a1bb6 Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 30 Jul 2024 21:35:52 -0400 Subject: [PATCH 73/81] throw error when cables not supported --- .../nornir_plays/command_getter.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 9ae880bd..77b87e6d 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -115,15 +115,13 @@ def netmiko_send_commands( orig_job_kwargs.get("sync_vrfs", False), orig_job_kwargs.get("sync_cables", False), ) - # if ( - # orig_job_kwargs.get("sync_cables", False) - # and "cables" not in command_getter_yaml_data[task.host.platform][command_getter_job].keys() - # ): - # return Result( - # host=task.host, - # result=f"{task.host.name} has missing definitions for cables in command_mapper YAML file.", - # failed=True, - # ) + if ( + orig_job_kwargs.get("sync_cables", False) + and "cables" not in command_getter_yaml_data[task.host.platform][command_getter_job].keys() + ): + logger.error( + f"{task.host.platform} has missing definitions for cables in command_mapper YAML file. Cables will not be loaded." + ) logger.debug(f"Commands to run: {commands}") # All commands in this for loop are running within 1 device connection. From 6df2cf132b4e4cbc4f1fd9518be0273add02fe72 Mon Sep 17 00:00:00 2001 From: scetron Date: Tue, 30 Jul 2024 21:36:12 -0400 Subject: [PATCH 74/81] remove unexpected commands --- nautobot_device_onboarding/tests/test_command_getter.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nautobot_device_onboarding/tests/test_command_getter.py b/nautobot_device_onboarding/tests/test_command_getter.py index 07947767..92a05d9f 100755 --- a/nautobot_device_onboarding/tests/test_command_getter.py +++ b/nautobot_device_onboarding/tests/test_command_getter.py @@ -45,7 +45,6 @@ def test_deduplicate_command_list_sync_data_no_vrfs_no_vlans(self): sync_cables=False, ) expected_commands_to_run = [ - {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, { "command": "show interfaces", @@ -79,7 +78,6 @@ def test_deduplicate_command_list_sync_data_with_vrfs_no_vlans(self): sync_cables=False, ) expected_commands_to_run = [ - {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, { "command": "show interfaces", @@ -109,6 +107,7 @@ def test_deduplicate_command_list_sync_data_with_vrfs_no_vlans(self): "iterable_type": "dict", }, ] + self.maxDiff = None self.assertEqual(get_commands_to_run, expected_commands_to_run) def test_deduplicate_command_list_sync_data_no_vrfs_with_vlans(self): @@ -191,7 +190,6 @@ def test_deduplicate_command_list_sync_data_cables(self): self.expected_data["sync_network_data"], sync_vlans=False, sync_vrfs=False, sync_cables=True ) expected_commands_to_run = [ - {"command": "show vlan", "parser": "textfsm", "jpath": "[*].{id: vlan_id, name: vlan_name}"}, {"command": "show version", "parser": "textfsm", "jpath": "[*].serial[]"}, { "command": "show interfaces", From 35d33cf10795859b68e183e478840f8c09143494 Mon Sep 17 00:00:00 2001 From: scetron Date: Wed, 31 Jul 2024 13:46:53 -0400 Subject: [PATCH 75/81] remove maxdiff used for troubleshooting. --- nautobot_device_onboarding/tests/test_command_getter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nautobot_device_onboarding/tests/test_command_getter.py b/nautobot_device_onboarding/tests/test_command_getter.py index 92a05d9f..88f0f332 100755 --- a/nautobot_device_onboarding/tests/test_command_getter.py +++ b/nautobot_device_onboarding/tests/test_command_getter.py @@ -107,7 +107,6 @@ def test_deduplicate_command_list_sync_data_with_vrfs_no_vlans(self): "iterable_type": "dict", }, ] - self.maxDiff = None self.assertEqual(get_commands_to_run, expected_commands_to_run) def test_deduplicate_command_list_sync_data_no_vrfs_with_vlans(self): From 0afb3d0aa0dfee8d69479fd027fd5650a14987d1 Mon Sep 17 00:00:00 2001 From: scetron Date: Thu, 1 Aug 2024 07:33:58 -0400 Subject: [PATCH 76/81] update description schema --- nautobot_device_onboarding/nornir_plays/schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautobot_device_onboarding/nornir_plays/schemas.py b/nautobot_device_onboarding/nornir_plays/schemas.py index 33a31189..52d42026 100755 --- a/nautobot_device_onboarding/nornir_plays/schemas.py +++ b/nautobot_device_onboarding/nornir_plays/schemas.py @@ -130,7 +130,7 @@ def sync_network_data_schema(json_schema=True): "required": ["serial", "interfaces"], "properties": { "serial": { - "type": "string", + "type": ["string", "integer"], "description": "Serial number of the network device", "minItems": 1, }, From ecf04b7896599354ef7aa1f5a1b68a2b91bdd2e5 Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Mon, 5 Aug 2024 09:27:19 -0500 Subject: [PATCH 77/81] update compat matrix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1594d946..cf95926c 100644 --- a/README.md +++ b/README.md @@ -51,8 +51,8 @@ Regardless, the Onboarding App greatly simplifies the onboarding process by allo | Cabling | Cisco IOS | Cisco XE | Cisco NXOS | Cisco WLC | Juniper Junos | Arista EOS | F5 | | ----------------------- | :----------------: | :--------------: | :--------------: | :--------------: | :--------------: | :--------------: | :-: | -| Terminations A | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | -| Terminations B | :test_tube: | :test_tube: | :test_tube: | :x: | :x: | :x: | :x: | +| Terminations A | :test_tube: | :test_tube: | :test_tube: | :x: | :test_tube: | :x: | :x: | +| Terminations B | :test_tube: | :test_tube: | :test_tube: | :x: | :test_tube: | :x: | :x: | | Legend | | :---- | From 1371e119dc5f984f2bca67488a4f4d3b4c505e7d Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Mon, 5 Aug 2024 14:26:41 -0500 Subject: [PATCH 78/81] pin netutils for cisco_xe to ntc-templates mapping --- poetry.lock | 240 +++---------------------------------------------- pyproject.toml | 4 +- 2 files changed, 14 insertions(+), 230 deletions(-) diff --git a/poetry.lock b/poetry.lock index 96fd3f75..321e2a51 100755 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "amqp" version = "5.2.0" description = "Low-level AMQP client for Python (fork of amqplib)." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -19,7 +18,6 @@ vine = ">=5.0.0,<6.0.0" name = "aniso8601" version = "7.0.0" description = "A library for parsing ISO 8601 strings." -category = "main" optional = false python-versions = "*" files = [ @@ -31,7 +29,6 @@ files = [ name = "anyio" version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -54,7 +51,6 @@ trio = ["trio (>=0.23)"] name = "appnope" version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -66,7 +62,6 @@ files = [ name = "asgiref" version = "3.8.1" description = "ASGI specs, helper code, and adapters" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -84,7 +79,6 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "astroid" version = "3.2.2" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -99,7 +93,6 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} name = "asttokens" version = "2.4.1" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -118,7 +111,6 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] name = "astunparse" version = "1.6.3" description = "An AST unparser for Python" -category = "dev" optional = false python-versions = "*" files = [ @@ -134,7 +126,6 @@ wheel = ">=0.23.0,<1.0" name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -146,7 +137,6 @@ files = [ name = "attrs" version = "23.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -166,7 +156,6 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p name = "autopep8" version = "2.0.0" description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" -category = "main" optional = false python-versions = "*" files = [ @@ -182,7 +171,6 @@ tomli = "*" name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -194,7 +182,6 @@ files = [ name = "backports-zoneinfo" version = "0.2.1" description = "Backport of the standard library zoneinfo module" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -226,7 +213,6 @@ tzdata = ["tzdata"] name = "bandit" version = "1.7.8" description = "Security oriented static analyser for python code." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -251,7 +237,6 @@ yaml = ["PyYAML"] name = "bcrypt" version = "4.1.3" description = "Modern password hashing for your software and your servers" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -292,7 +277,6 @@ typecheck = ["mypy"] name = "billiard" version = "4.2.0" description = "Python multiprocessing fork with improvements and bugfixes" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -304,7 +288,6 @@ files = [ name = "black" version = "24.4.2" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -351,7 +334,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "celery" version = "5.3.6" description = "Distributed Task Queue." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -408,7 +390,6 @@ zstd = ["zstandard (==0.22.0)"] name = "certifi" version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -420,7 +401,6 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -485,7 +465,6 @@ pycparser = "*" name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -585,7 +564,6 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -600,7 +578,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-default-group" version = "1.2.4" description = "click_default_group" -category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -618,7 +595,6 @@ test = ["pytest"] name = "click-didyoumean" version = "0.3.1" description = "Enables git-like *did-you-mean* feature in click" -category = "main" optional = false python-versions = ">=3.6.2" files = [ @@ -633,7 +609,6 @@ click = ">=7" name = "click-plugins" version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" optional = false python-versions = "*" files = [ @@ -651,7 +626,6 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] name = "click-repl" version = "0.3.0" description = "REPL plugin for Click" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -670,7 +644,6 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -682,7 +655,6 @@ files = [ name = "coverage" version = "7.5.3" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -747,7 +719,6 @@ toml = ["tomli"] name = "cron-descriptor" version = "1.4.3" description = "A Python library that converts cron expressions into human readable strings." -category = "main" optional = false python-versions = "*" files = [ @@ -762,7 +733,6 @@ dev = ["polib"] name = "cryptography" version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -817,7 +787,6 @@ test-randomorder = ["pytest-randomly"] name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -829,7 +798,6 @@ files = [ name = "deepdiff" version = "6.7.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -848,7 +816,6 @@ optimize = ["orjson"] name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -860,7 +827,6 @@ files = [ name = "diffsync" version = "1.10.0" description = "Library to easily sync/diff/update 2 different data sources" -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -882,7 +848,6 @@ redis = ["redis (>=4.3,<5.0)"] name = "dill" version = "0.3.8" description = "serialize all of Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -898,7 +863,6 @@ profile = ["gprof2dot (>=2022.7.29)"] name = "django" version = "3.2.25" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -919,7 +883,6 @@ bcrypt = ["bcrypt"] name = "django-ajax-tables" version = "1.1.1" description = "Django tag for ajax-enabled tables" -category = "main" optional = false python-versions = "*" files = [ @@ -931,7 +894,6 @@ files = [ name = "django-celery-beat" version = "2.6.0" description = "Database-backed Periodic Tasks." -category = "main" optional = false python-versions = "*" files = [ @@ -951,7 +913,6 @@ tzdata = "*" name = "django-celery-results" version = "2.5.1" description = "Celery result backends for Django." -category = "main" optional = false python-versions = "*" files = [ @@ -967,7 +928,6 @@ Django = ">=3.2.18" name = "django-constance" version = "2.9.1" description = "Django live settings with pluggable backends, including Redis." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -986,7 +946,6 @@ redis = ["redis"] name = "django-cors-headers" version = "4.3.1" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1002,7 +961,6 @@ Django = ">=3.2" name = "django-db-file-storage" version = "0.5.6.1" description = "Custom FILE_STORAGE for Django. Saves files in your database instead of your file system." -category = "main" optional = false python-versions = "*" files = [ @@ -1017,7 +975,6 @@ Django = "*" name = "django-debug-toolbar" version = "4.3.0" description = "A configurable set of panels that display various debug information about the current request/response." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1033,7 +990,6 @@ sqlparse = ">=0.2" name = "django-extensions" version = "3.2.3" description = "Extensions for Django" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1048,7 +1004,6 @@ Django = ">=3.2" name = "django-filter" version = "23.5" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1063,7 +1018,6 @@ Django = ">=3.2" name = "django-health-check" version = "3.18.2" description = "Run checks on services like databases, queue servers, celery processes, etc." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1082,7 +1036,6 @@ test = ["boto3", "celery", "django-storages", "pytest", "pytest-cov", "pytest-dj name = "django-jinja" version = "2.11.0" description = "Jinja2 templating language integrated in Django." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1098,7 +1051,6 @@ jinja2 = ">=3" name = "django-picklefield" version = "3.2" description = "Pickled object field for Django" -category = "main" optional = false python-versions = ">=3" files = [ @@ -1116,7 +1068,6 @@ tests = ["tox"] name = "django-prometheus" version = "2.3.1" description = "Django middlewares to monitor your application with Prometheus.io." -category = "main" optional = false python-versions = "*" files = [ @@ -1131,7 +1082,6 @@ prometheus-client = ">=0.7" name = "django-redis" version = "5.4.0" description = "Full featured redis cache backend for Django." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1150,7 +1100,6 @@ hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"] name = "django-silk" version = "5.1.0" description = "Silky smooth profiling for the Django Framework" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1168,7 +1117,6 @@ sqlparse = "*" name = "django-tables2" version = "2.7.0" description = "Table/data-grid framework for Django" -category = "main" optional = false python-versions = "*" files = [ @@ -1186,7 +1134,6 @@ tablib = ["tablib"] name = "django-taggit" version = "4.0.0" description = "django-taggit is a reusable Django application for simple tagging." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1201,7 +1148,6 @@ Django = ">=3.2" name = "django-timezone-field" version = "5.1" description = "A Django app providing DB, form, and REST framework fields for zoneinfo and pytz timezone objects." -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1211,14 +1157,13 @@ files = [ [package.dependencies] "backports.zoneinfo" = {version = ">=0.2.1,<0.3.0", markers = "python_version < \"3.9\""} -Django = ">=2.2,<3.0.0 || >=3.2.0,<5.0" +Django = ">=2.2,<3.0.dev0 || >=3.2.dev0,<5.0" pytz = "*" [[package]] name = "django-tree-queries" version = "0.17.0" description = "Tree queries with explicit opt-in, without configurability" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1233,7 +1178,6 @@ tests = ["coverage"] name = "django-webserver" version = "1.2.0" description = "Django management commands for production webservers" -category = "main" optional = false python-versions = "*" files = [ @@ -1255,7 +1199,6 @@ waitress = ["waitress"] name = "djangorestframework" version = "3.15.1" description = "Web APIs for Django, made easy." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1271,7 +1214,6 @@ django = ">=3.0" name = "drf-react-template-framework" version = "0.0.17" description = "Django REST Framework plugin that creates form schemas for react-jsonschema-form" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -1286,7 +1228,6 @@ djangorestframework = ">=3.12.0,<4.0.0" name = "drf-spectacular" version = "0.26.5" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1311,7 +1252,6 @@ sidecar = ["drf-spectacular-sidecar"] name = "drf-spectacular-sidecar" version = "2024.5.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1326,7 +1266,6 @@ Django = ">=2.2" name = "emoji" version = "2.11.1" description = "Emoji for Python" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ @@ -1341,7 +1280,6 @@ dev = ["coverage", "coveralls", "pytest"] name = "exceptiongroup" version = "1.2.1" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1356,7 +1294,6 @@ test = ["pytest (>=6)"] name = "executing" version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1371,7 +1308,6 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth name = "flake8" version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -1388,7 +1324,6 @@ pyflakes = ">=2.5.0,<2.6.0" name = "future" version = "1.0.0" description = "Clean single-source support for Python 3 and 2" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1400,7 +1335,6 @@ files = [ name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "dev" optional = false python-versions = "*" files = [ @@ -1418,7 +1352,6 @@ dev = ["flake8", "markdown", "twine", "wheel"] name = "gitdb" version = "4.0.11" description = "Git Object Database" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1433,7 +1366,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1452,7 +1384,6 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", name = "gprof2dot" version = "2022.7.29" description = "Generate a dot graph from the output of several profilers." -category = "main" optional = false python-versions = ">=2.7" files = [ @@ -1464,7 +1395,6 @@ files = [ name = "graphene" version = "2.1.9" description = "GraphQL Framework for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1487,7 +1417,6 @@ test = ["coveralls", "fastdiff (==0.2.0)", "iso8601", "mock", "promise", "pytest name = "graphene-django" version = "2.16.0" description = "Graphene Django integration" -category = "main" optional = false python-versions = "*" files = [ @@ -1512,7 +1441,6 @@ test = ["coveralls", "django-filter (>=2)", "djangorestframework (>=3.6.3)", "mo name = "graphene-django-optimizer" version = "0.8.0" description = "Optimize database access inside graphene queries." -category = "main" optional = false python-versions = "*" files = [ @@ -1523,7 +1451,6 @@ files = [ name = "graphql-core" version = "2.3.2" description = "GraphQL implementation for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1544,7 +1471,6 @@ test = ["coveralls (==1.11.1)", "cython (==0.29.17)", "gevent (==1.5.0)", "pyann name = "graphql-relay" version = "2.0.1" description = "Relay implementation for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1561,7 +1487,6 @@ six = ">=1.12" name = "griffe" version = "0.45.2" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1577,7 +1502,6 @@ colorama = ">=0.4" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1589,7 +1513,6 @@ files = [ name = "httpcore" version = "1.0.5" description = "A minimal low-level HTTP client." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1604,14 +1527,13 @@ h11 = ">=0.13,<0.15" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" version = "0.27.0" description = "The next generation HTTP client." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1622,21 +1544,20 @@ files = [ [package.dependencies] anyio = "*" certifi = "*" -httpcore = ">=1.0.0,<2.0.0" +httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] [[package]] name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1648,7 +1569,6 @@ files = [ name = "importlib-metadata" version = "4.13.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1668,7 +1588,6 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag name = "importlib-resources" version = "6.4.0" description = "Read resources from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1687,7 +1606,6 @@ testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "p name = "incremental" version = "22.10.0" description = "\"A small library that versions your Python projects.\"" -category = "dev" optional = false python-versions = "*" files = [ @@ -1703,7 +1621,6 @@ scripts = ["click (>=6.0)", "twisted (>=16.4.0)"] name = "inflection" version = "0.5.1" description = "A port of Ruby on Rails inflector to Python" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1715,7 +1632,6 @@ files = [ name = "invoke" version = "2.2.0" description = "Pythonic task execution" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1727,7 +1643,6 @@ files = [ name = "ipython" version = "8.12.3" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1767,7 +1682,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "isort" version = "5.13.2" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1782,7 +1696,6 @@ colors = ["colorama (>=0.4.6)"] name = "jdiff" version = "0.0.6" description = "A light-weight library to compare structured output from network devices show commands." -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -1798,7 +1711,6 @@ jmespath = ">=1.0.1,<2.0.0" name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1818,7 +1730,6 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1836,7 +1747,6 @@ i18n = ["Babel (>=2.7)"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1848,7 +1758,6 @@ files = [ name = "jsonschema" version = "4.22.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1872,7 +1781,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1888,7 +1796,6 @@ referencing = ">=0.31.0" name = "junos-eznc" version = "2.7.1" description = "Junos 'EZ' automation for non-programmers" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1912,7 +1819,6 @@ yamlordereddictloader = "*" name = "kombu" version = "5.3.7" description = "Messaging library for Python." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1947,7 +1853,6 @@ zookeeper = ["kazoo (>=2.8.0)"] name = "lxml" version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2025,13 +1930,9 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -2106,7 +2007,6 @@ source = ["Cython (>=3.0.10)"] name = "markdown" version = "3.5.2" description = "Python implementation of John Gruber's Markdown." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2125,7 +2025,6 @@ testing = ["coverage", "pyyaml"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2150,7 +2049,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2220,7 +2118,6 @@ files = [ name = "matplotlib-inline" version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2235,7 +2132,6 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2247,7 +2143,6 @@ files = [ name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2259,7 +2154,6 @@ files = [ name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2271,7 +2165,6 @@ files = [ name = "mkdocs" version = "1.5.2" description = "Project documentation with Markdown." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2303,7 +2196,6 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp name = "mkdocs-autorefs" version = "1.0.1" description = "Automatically link across pages in MkDocs." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2320,7 +2212,6 @@ mkdocs = ">=1.1" name = "mkdocs-material" version = "9.1.15" description = "Documentation that simply works" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2343,7 +2234,6 @@ requests = ">=2.26" name = "mkdocs-material-extensions" version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2355,7 +2245,6 @@ files = [ name = "mkdocs-version-annotations" version = "1.0.0" description = "MkDocs plugin to add custom admonitions for documenting version differences" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -2367,7 +2256,6 @@ files = [ name = "mkdocstrings" version = "0.22.0" description = "Automatic documentation from sources, for MkDocs." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2394,7 +2282,6 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] name = "mkdocstrings-python" version = "1.5.2" description = "A Python handler for mkdocstrings." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2410,7 +2297,6 @@ mkdocstrings = ">=0.20" name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2422,7 +2308,6 @@ files = [ name = "napalm" version = "4.1.0" description = "Network Automation and Programmability Abstraction Layer with Multivendor support" -category = "main" optional = false python-versions = "*" files = [ @@ -2455,7 +2340,6 @@ typing-extensions = ">=4.3.0" name = "nautobot" version = "2.2.5" description = "Source of truth and network automation platform." -category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -2520,7 +2404,6 @@ sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] name = "nautobot-plugin-nornir" version = "2.0.1" description = "Nautobot Nornir plugin." -category = "main" optional = false python-versions = ">=3.8,<3.12" files = [ @@ -2537,7 +2420,6 @@ nornir-nautobot = ">=3.0.0,<4.0.0" name = "nautobot-secrets-providers" version = "2.0.1" description = "Nautobot Secrets Providers App" -category = "main" optional = false python-versions = ">=3.8,<3.12" files = [ @@ -2556,7 +2438,6 @@ thycotic = ["python-tss-sdk (>=1.2.0,<1.3.0)"] name = "nautobot-ssot" version = "2.6.1" description = "Nautobot Single Source of Truth" -category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -2586,7 +2467,6 @@ servicenow = ["Jinja2 (>=2.11.3)", "PyYAML (>=6)", "ijson (>=2.5.1)", "oauthlib name = "ncclient" version = "0.6.15" description = "Python library for NETCONF clients" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2603,7 +2483,6 @@ six = "*" name = "netaddr" version = "0.10.1" description = "A network address manipulation library for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -2615,7 +2494,6 @@ files = [ name = "netmiko" version = "4.3.0" description = "Multi-vendor library to simplify legacy CLI connections to network devices" -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -2633,14 +2511,13 @@ textfsm = ">=1.1.3" [[package]] name = "netutils" -version = "1.8.1" +version = "1.9.1" description = "Common helper functions useful in network automation." -category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "netutils-1.8.1-py3-none-any.whl", hash = "sha256:b1d6864a7512c3def0e12a2a879f12ccca9b5077d482f591c56d0171542aa040"}, - {file = "netutils-1.8.1.tar.gz", hash = "sha256:20d0cd9bf3a11588e77266c4aca93b460c732e12c4449e48213f22ab32d78921"}, + {file = "netutils-1.9.1-py3-none-any.whl", hash = "sha256:0d6e9026cc529f365a63377159aed07769baee0bf7a7138fa86fce37b64dd9d4"}, + {file = "netutils-1.9.1.tar.gz", hash = "sha256:8ad8b5e02eb9d6692d0aaaf9c0f36da1a81f520f426a79d0e08e56cf7dbb3476"}, ] [package.extras] @@ -2650,7 +2527,6 @@ optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] name = "nh3" version = "0.2.17" description = "Python bindings to the ammonia HTML sanitization library." -category = "main" optional = false python-versions = "*" files = [ @@ -2676,7 +2552,6 @@ files = [ name = "nornir" version = "3.4.1" description = "Pluggable multi-threaded framework with inventory management to help operate collections of devices" -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -2693,7 +2568,6 @@ mypy_extensions = ">=1.0.0,<2.0.0" name = "nornir-jinja2" version = "0.2.0" description = "Jinja2 plugins for nornir" -category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -2709,7 +2583,6 @@ nornir = ">=3,<4" name = "nornir-napalm" version = "0.4.0" description = "NAPALM's plugins for nornir" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -2725,7 +2598,6 @@ nornir = ">=3,<4" name = "nornir-nautobot" version = "3.2.0" description = "Nornir Nautobot" -category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ @@ -2751,7 +2623,6 @@ mikrotik-driver = ["routeros-api (>=0.17.0,<0.18.0)"] name = "nornir-netmiko" version = "1.0.1" description = "Netmiko's plugins for Nornir" -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -2766,7 +2637,6 @@ netmiko = ">=4.0.0,<5.0.0" name = "nornir-utils" version = "0.2.0" description = "Collection of plugins and functions for nornir that don't require external dependencies" -category = "main" optional = false python-versions = ">=3.6.2,<4.0.0" files = [ @@ -2782,7 +2652,6 @@ nornir = ">=3,<4" name = "ntc-templates" version = "6.0.0" description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable." -category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ @@ -2797,7 +2666,6 @@ textfsm = ">=1.1.0,<2.0.0" name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2814,7 +2682,6 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "ordered-set" version = "4.1.0" description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2829,7 +2696,6 @@ dev = ["black", "mypy", "pytest"] name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2841,7 +2707,6 @@ files = [ name = "paramiko" version = "3.4.0" description = "SSH2 protocol library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2863,7 +2728,6 @@ invoke = ["invoke (>=2.0)"] name = "parso" version = "0.8.4" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2879,7 +2743,6 @@ testing = ["docopt", "pytest"] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2891,7 +2754,6 @@ files = [ name = "pbr" version = "6.0.0" description = "Python Build Reasonableness" -category = "dev" optional = false python-versions = ">=2.6" files = [ @@ -2903,7 +2765,6 @@ files = [ name = "pexpect" version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -2918,7 +2779,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -2930,7 +2790,6 @@ files = [ name = "pillow" version = "10.3.0" description = "Python Imaging Library (Fork)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3017,7 +2876,6 @@ xmp = ["defusedxml"] name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3029,7 +2887,6 @@ files = [ name = "platformdirs" version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3046,7 +2903,6 @@ type = ["mypy (>=1.8)"] name = "prometheus-client" version = "0.20.0" description = "Python client for the Prometheus monitoring system." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3061,7 +2917,6 @@ twisted = ["twisted"] name = "promise" version = "2.3" description = "Promises/A+ implementation for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -3078,7 +2933,6 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", name = "prompt-toolkit" version = "3.0.45" description = "Library for building powerful interactive command lines in Python" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -3093,7 +2947,6 @@ wcwidth = "*" name = "psycopg2-binary" version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3175,7 +3028,6 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -3187,7 +3039,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -3202,7 +3053,6 @@ tests = ["pytest"] name = "pycodestyle" version = "2.9.1" description = "Python style guide checker" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3214,7 +3064,6 @@ files = [ name = "pycparser" version = "2.22" description = "C parser in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3226,7 +3075,6 @@ files = [ name = "pydantic" version = "1.10.15" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3279,7 +3127,6 @@ email = ["email-validator (>=1.0.3)"] name = "pyeapi" version = "1.0.2" description = "Python Client for eAPI" -category = "main" optional = false python-versions = "*" files = [ @@ -3297,7 +3144,6 @@ test = ["coverage", "mock"] name = "pyflakes" version = "2.5.0" description = "passive checker of Python programs" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3309,7 +3155,6 @@ files = [ name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3324,7 +3169,6 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3342,7 +3186,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pylint" version = "3.2.2" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -3372,7 +3215,6 @@ testutils = ["gitpython (>3)"] name = "pylint-django" version = "2.5.5" description = "A Pylint plugin to help Pylint understand the Django web framework" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3391,7 +3233,6 @@ with-django = ["Django (>=2.2)"] name = "pylint-nautobot" version = "0.3.0" description = "Custom Pylint Rules for Nautobot" -category = "dev" optional = false python-versions = ">=3.8,<3.12" files = [ @@ -3409,7 +3250,6 @@ toml = ">=0.10.2" name = "pylint-plugin-utils" version = "0.8.2" description = "Utilities and helpers for writing Pylint plugins" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -3424,7 +3264,6 @@ pylint = ">=1.7" name = "pymdown-extensions" version = "10.7.1" description = "Extension pack for Python Markdown." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3443,7 +3282,6 @@ extra = ["pygments (>=2.12)"] name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3470,7 +3308,6 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] name = "pynautobot" version = "2.1.1" description = "Nautobot API client library" -category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ @@ -3487,7 +3324,6 @@ urllib3 = ">=1.21.1,<1.27" name = "pyparsing" version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" files = [ @@ -3502,7 +3338,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyserial" version = "3.5" description = "Python Serial Port Extension" -category = "main" optional = false python-versions = "*" files = [ @@ -3517,7 +3352,6 @@ cp2110 = ["hidapi"] name = "python-crontab" version = "3.1.0" description = "Python Crontab API" -category = "main" optional = false python-versions = "*" files = [ @@ -3535,7 +3369,6 @@ cron-schedule = ["croniter"] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3550,7 +3383,6 @@ six = ">=1.5" name = "python-slugify" version = "8.0.4" description = "A Python slugify application that also handles Unicode" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3568,7 +3400,6 @@ unidecode = ["Unidecode (>=1.1.1)"] name = "python-tss-sdk" version = "1.2.2" description = "The Delinea Secret Server Python SDK" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3583,7 +3414,6 @@ requests = ">=2.12.5" name = "python3-openid" version = "3.2.0" description = "OpenID support for modern servers and consumers." -category = "main" optional = false python-versions = "*" files = [ @@ -3602,7 +3432,6 @@ postgresql = ["psycopg2"] name = "pytz" version = "2024.1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -3614,7 +3443,6 @@ files = [ name = "pyuwsgi" version = "2.0.23.post0" description = "The uWSGI server" -category = "main" optional = false python-versions = "*" files = [ @@ -3667,7 +3495,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3689,6 +3516,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3727,7 +3555,6 @@ files = [ name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3742,7 +3569,6 @@ pyyaml = "*" name = "redis" version = "5.0.4" description = "Python client for Redis database and key-value store" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3761,7 +3587,6 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "referencing" version = "0.35.1" description = "JSON Referencing + Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3777,7 +3602,6 @@ rpds-py = ">=0.7.0" name = "regex" version = "2024.5.15" description = "Alternative regular expression module, to replace re." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3866,7 +3690,6 @@ files = [ name = "requests" version = "2.32.3" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3888,7 +3711,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-oauthlib" version = "2.0.0" description = "OAuthlib authentication support for Requests." -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -3907,7 +3729,6 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "rich" version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -3927,7 +3748,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rpds-py" version = "0.18.1" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4036,7 +3856,6 @@ files = [ name = "ruamel-yaml" version = "0.18.6" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4055,7 +3874,6 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] name = "ruamel-yaml-clib" version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4115,7 +3933,6 @@ files = [ name = "ruff" version = "0.4.6" description = "An extremely fast Python linter and code formatter, written in Rust." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4142,7 +3959,6 @@ files = [ name = "rx" version = "1.6.3" description = "Reactive Extensions (Rx) for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -4153,7 +3969,6 @@ files = [ name = "scp" version = "0.15.0" description = "scp module for paramiko" -category = "main" optional = false python-versions = "*" files = [ @@ -4168,7 +3983,6 @@ paramiko = "*" name = "setuptools" version = "70.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4184,7 +3998,6 @@ testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metad name = "singledispatch" version = "4.1.0" description = "Backport functools.singledispatch to older Pythons." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4200,7 +4013,6 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4212,7 +4024,6 @@ files = [ name = "smmap" version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4224,7 +4035,6 @@ files = [ name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4236,7 +4046,6 @@ files = [ name = "social-auth-app-django" version = "5.4.1" description = "Python Social Authentication, Django integration." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4252,7 +4061,6 @@ social-auth-core = ">=4.4.1" name = "social-auth-core" version = "4.5.4" description = "Python social authentication made simple." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4279,7 +4087,6 @@ saml = ["python3-saml (>=1.5.0)"] name = "sqlparse" version = "0.5.0" description = "A non-validating SQL parser." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4295,7 +4102,6 @@ doc = ["sphinx"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -4315,7 +4121,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "stevedore" version = "5.2.0" description = "Manage dynamic plugins for Python applications" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4330,7 +4135,6 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" name = "structlog" version = "22.3.0" description = "Structured Logging for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4348,7 +4152,6 @@ typing = ["mypy", "rich", "twisted"] name = "svgwrite" version = "1.4.3" description = "A Python library to create SVG drawings." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4360,7 +4163,6 @@ files = [ name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" -category = "main" optional = false python-versions = "*" files = [ @@ -4372,7 +4174,6 @@ files = [ name = "textfsm" version = "1.1.3" description = "Python module for parsing semi-structured text into python tables." -category = "main" optional = false python-versions = "*" files = [ @@ -4388,7 +4189,6 @@ six = "*" name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4400,7 +4200,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4412,7 +4211,6 @@ files = [ name = "tomlkit" version = "0.12.5" description = "Style preserving TOML library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4424,7 +4222,6 @@ files = [ name = "towncrier" version = "23.6.0" description = "Building newsfiles for your project." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4447,7 +4244,6 @@ dev = ["furo", "packaging", "sphinx (>=5)", "twisted"] name = "traitlets" version = "5.14.3" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4463,7 +4259,6 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, name = "transitions" version = "0.9.1" description = "A lightweight, object-oriented Python state machine implementation with many extensions." -category = "main" optional = false python-versions = "*" files = [ @@ -4482,7 +4277,6 @@ test = ["pytest"] name = "ttp" version = "0.9.5" description = "Template Text Parser" -category = "main" optional = false python-versions = ">=2.7,<4.0" files = [ @@ -4498,7 +4292,6 @@ full = ["cerberus (>=1.3.0,<1.4.0)", "deepdiff (>=5.8.0,<5.9.0)", "jinja2 (>=3.0 name = "ttp-templates" version = "0.3.6" description = "Template Text Parser Templates collections" -category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -4516,7 +4309,6 @@ docs = ["mkdocs (==1.2.4)", "mkdocs-material (==7.2.2)", "mkdocs-material-extens name = "typing-extensions" version = "4.12.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4528,7 +4320,6 @@ files = [ name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -4540,7 +4331,6 @@ files = [ name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4552,7 +4342,6 @@ files = [ name = "urllib3" version = "1.26.18" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -4569,7 +4358,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "vine" version = "5.1.0" description = "Python promises." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4581,7 +4369,6 @@ files = [ name = "watchdog" version = "4.0.1" description = "Filesystem events monitoring" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4626,7 +4413,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -4638,7 +4424,6 @@ files = [ name = "wheel" version = "0.43.0" description = "A built-package format for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4653,7 +4438,6 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] name = "yamllint" version = "1.35.1" description = "A linter for YAML files." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -4672,7 +4456,6 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] name = "yamlordereddictloader" version = "0.4.2" description = "YAML loader and dumper for PyYAML allowing to keep keys order." -category = "main" optional = false python-versions = "*" files = [ @@ -4687,7 +4470,6 @@ pyyaml = "*" name = "zipp" version = "3.19.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -4705,4 +4487,4 @@ all = [] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "0b8119fe40f9f5cbd29c6b5775c121b9240702214f3a58ac02eb86859c4a95ce" +content-hash = "34f02489b251692fdf52e61cd635a6d417cd443bf078ea752d0be7049c3a0224" diff --git a/pyproject.toml b/pyproject.toml index afafeae9..fe122739 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-device-onboarding" -version = "4.0.0rc2" +version = "4.0.0" description = "A app for Nautobot to easily onboard new devices." authors = ["Network to Code, LLC "] license = "Apache-2.0" @@ -36,6 +36,8 @@ jdiff = "^0.0.6" ntc-templates = "^6.0.0" nautobot-secrets-providers = "^2.0.1" python-tss-sdk = "*" +# Netutils pin is needed for https://github.com/networktocode/netutils/pull/553 +netutils = "^1.9.1" [tool.poetry.group.dev.dependencies] bandit = "*" From 97bc9501fdb1fd3ecf91403697955fe8b84df7ac Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Mon, 5 Aug 2024 15:20:23 -0500 Subject: [PATCH 79/81] add change frags and update docs --- changes/201.added | 1 + changes/203.housekeeping | 1 + docs/admin/install.md | 23 +++++++++++++++++++++++ docs/dev/arch_decision.md | 6 ++++++ docs/user/app_getting_started.md | 28 ++++++++++++++++++++++++++++ docs/user/app_overview.md | 2 +- docs/user/app_use_cases.md | 2 +- 7 files changed, 61 insertions(+), 2 deletions(-) create mode 100755 changes/201.added create mode 100755 changes/203.housekeeping diff --git a/changes/201.added b/changes/201.added new file mode 100755 index 00000000..b4a645a8 --- /dev/null +++ b/changes/201.added @@ -0,0 +1 @@ +- Add ability to sync in cables for cisco ios,nxos and Juniper via neighbor discovery protocol commands. diff --git a/changes/203.housekeeping b/changes/203.housekeeping new file mode 100755 index 00000000..e612722e --- /dev/null +++ b/changes/203.housekeeping @@ -0,0 +1 @@ +- Add compatibility matrix for what platforms support which data fields to sync. diff --git a/docs/admin/install.md b/docs/admin/install.md index b4ed1017..15eb813a 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -10,6 +10,13 @@ Here you will find detailed instructions on how to **install** and **configure** !!! note Please check the [dedicated page](compatibility_matrix.md) for a full compatibility matrix and the deprecation policy. +### Application Dependencies + +Device onboarding 4.0 added two additional application dependencies. + +- [nautobot_ssot](https://docs.nautobot.com/projects/ssot/en/latest/) +- [nautobot_plugin_nornir](https://docs.nautobot.com/projects/plugin-nornir/en/latest/) + ### Access Requirements - The original OnboardingTask Job used NAPALM Credentials. @@ -48,6 +55,22 @@ PLUGINS = ["nautobot_plugin_nornir", "nautobot_ssot", "nautobot_device_onboardin # } ``` +For the `Sync Data from Network` job to work the below must be added to the `PLUGINS_CONFIG`. + +```python + "nautobot_plugin_nornir": { + "nornir_settings": { + "credentials": "nautobot_plugin_nornir.plugins.credentials.nautobot_secrets.CredentialsNautobotSecrets", + "runner": { + "plugin": "threaded", + "options": { + "num_workers": 20, + }, + }, + }, + }, +``` + Once the Nautobot configuration is updated, run the Post Upgrade command (`nautobot-server post_upgrade`) to run migrations and clear any cache: ```shell diff --git a/docs/dev/arch_decision.md b/docs/dev/arch_decision.md index fa61377f..b21ab3b3 100755 --- a/docs/dev/arch_decision.md +++ b/docs/dev/arch_decision.md @@ -1,3 +1,9 @@ # Architecture Decision Records The intention is to document deviations from a standard Model View Controller (MVC) design. And other general Application decisions. + +## Handling the Nornir Inventory + +In order for Nornir to function an inventory is created. There are multiple supported inventory sources that fit many needs; however there is a unique requirement that this plugin is trying to solve. The problem is specifically around the first SSoT job (Sync Devices from Network); how can we create an inventory when there is no source "yet"? Our solution to this problem is to generate a empty inventory, and then process the ip addresses from the job form to create a inventory in an on demand fashion and inject the credentials into the inventory based on the secrets group selected. + +For the general application constraint for this ADR see the [Credentials Section](../user/app_getting_started.md#device-credentials-functionality). diff --git a/docs/user/app_getting_started.md b/docs/user/app_getting_started.md index ae2f4d33..d7282411 100644 --- a/docs/user/app_getting_started.md +++ b/docs/user/app_getting_started.md @@ -26,6 +26,34 @@ Locations are the only other Nautobot prerequisite for the plugin to onboard a d !!! info There are a few other requirements for the new SSoT based jobs, but can also support some defaults. +### Device Credentials Functionality + +For a full explanation see the [ADR](../dev/arch_decision.md#handling-the-nornir-inventory) + +The new SSoT based jobs each use their own Nornir inventories. + +- `Sync Devices from Network` - A empty inventory for Nornir is instantiated and the Nautobot secrets group selected at the job execution is injected into the on-demand inventory creation. +- `Sync Data from Network` - Uses `nautobot-plugin-nornir` Nornir inventory plugin (the same one that Golden Config uses). This means you must have the following set in your nautobot_config PLUGIN_CONFIG section. + +!!! warn + Only the Nautobot Secrets credential provider (`CredentialsNautobotSecrets`) was implemented for the initial release of the plugin. `CredentialsEnvVars` and `CredentialsSettingsVars` are not supported currently. + +```python + "nautobot_plugin_nornir": { + "nornir_settings": { + "credentials": "nautobot_plugin_nornir.plugins.credentials.nautobot_secrets.CredentialsNautobotSecrets", + "runner": { + "plugin": "threaded", + "options": { + "num_workers": 20, + }, + }, + }, + }, +``` +!!! info + The main reason for mentioning this is that this has the possiblity of conflicting with Golden Config plugin settings if `CredentialsEnvVars` or `CredentialsSettingsVars` are in use. At this time the recommentation is to migrate to using Nautobot Secrets Groups, which is the general pattern Nautobot is moving towards into the future. + ### Onboarding a Device Navigate to the Device Onboarding Job: Jobs > Perform Device Onboarding (original). diff --git a/docs/user/app_overview.md b/docs/user/app_overview.md index f054aa42..0926208f 100644 --- a/docs/user/app_overview.md +++ b/docs/user/app_overview.md @@ -47,7 +47,7 @@ Expose two new SSoT based Nautobot jobs to perform the syncing of data. - VRFs - VRF Names - Route Distinguishers (RD) - - Cabling (Coming soon...) + - Cabling !!! info For more information look at the provided jsonschema definitions for each of the jobs. diff --git a/docs/user/app_use_cases.md b/docs/user/app_use_cases.md index 4f57e998..c83cab1e 100755 --- a/docs/user/app_use_cases.md +++ b/docs/user/app_use_cases.md @@ -7,7 +7,7 @@ This document describes common use-cases and scenarios for this App utilizing th This App can be used in three general ways. 1. Onboard a device with basic information. (Name, Serial, Device Type, Management IP + Interface) -2. Take existing devices and enhace the data for each device by syncing in more metadata. (Interface, VLANs, VRFs etc.) +2. Take existing devices and enhace the data for each device by syncing in more metadata. (Interface, VLANs, VRFs, Cabling, etc.) 3. Both 1 and 2 in conjunction with each other. ### Preparation From d0b2ac5ccc52a8abfb43d885fe3e1c92cab1491c Mon Sep 17 00:00:00 2001 From: Jeff Kala Date: Mon, 5 Aug 2024 15:45:07 -0500 Subject: [PATCH 80/81] change frags and release notes --- changes/151.changed | 1 - changes/167.housekeeping | 1 - changes/181.added | 5 ----- changes/181.changed | 1 - changes/194.housekeeping | 2 -- changes/201.added | 1 - changes/203.housekeeping | 1 - docs/admin/release_notes/version_4.0.md | 23 +++++++++++++++++++++++ 8 files changed, 23 insertions(+), 12 deletions(-) delete mode 100644 changes/151.changed delete mode 100644 changes/167.housekeeping delete mode 100755 changes/181.added delete mode 100755 changes/181.changed delete mode 100644 changes/194.housekeeping delete mode 100755 changes/201.added delete mode 100755 changes/203.housekeeping diff --git a/changes/151.changed b/changes/151.changed deleted file mode 100644 index 7a7cdde0..00000000 --- a/changes/151.changed +++ /dev/null @@ -1 +0,0 @@ -Replaced pydocstyle with ruff. diff --git a/changes/167.housekeeping b/changes/167.housekeeping deleted file mode 100644 index ba5537c4..00000000 --- a/changes/167.housekeeping +++ /dev/null @@ -1 +0,0 @@ -Re-baked from the template `nautobot-app-v2.2.1`. diff --git a/changes/181.added b/changes/181.added deleted file mode 100755 index 677ed211..00000000 --- a/changes/181.added +++ /dev/null @@ -1,5 +0,0 @@ -Sync Devices from Network job was added which utilizes the SSoT framework to onboard devices. -Sync Data from Network job was added which utilizes the SSoT framework to onboard devices. -Git Datasource object to be able to use a Git Repo to overload new SSoT job YAML file definitions. -Create a Nornir inventory `EmptyInventory` to support ondemand inventory population for `Sync Devices` job. -Add `nautobot-app-nornir` dependency to reuse `NautobotORMInventory` to support inventory creation for `Sync Data` job. diff --git a/changes/181.changed b/changes/181.changed deleted file mode 100755 index 0c57e433..00000000 --- a/changes/181.changed +++ /dev/null @@ -1 +0,0 @@ -The `OnboardingTask` job is changed to `hidden` by default. diff --git a/changes/194.housekeeping b/changes/194.housekeeping deleted file mode 100644 index dd7f3bc0..00000000 --- a/changes/194.housekeeping +++ /dev/null @@ -1,2 +0,0 @@ -- Add @housebpass to Codeowners -- Add ntc-templates to new issue template \ No newline at end of file diff --git a/changes/201.added b/changes/201.added deleted file mode 100755 index b4a645a8..00000000 --- a/changes/201.added +++ /dev/null @@ -1 +0,0 @@ -- Add ability to sync in cables for cisco ios,nxos and Juniper via neighbor discovery protocol commands. diff --git a/changes/203.housekeeping b/changes/203.housekeeping deleted file mode 100755 index e612722e..00000000 --- a/changes/203.housekeeping +++ /dev/null @@ -1 +0,0 @@ -- Add compatibility matrix for what platforms support which data fields to sync. diff --git a/docs/admin/release_notes/version_4.0.md b/docs/admin/release_notes/version_4.0.md index f8610e60..719e5c1b 100755 --- a/docs/admin/release_notes/version_4.0.md +++ b/docs/admin/release_notes/version_4.0.md @@ -2,3 +2,26 @@ !!! warning Nautobot Device Onboarding v4.0.0 completely revamps the applications design and framework. The original `OnboardingTask` job is still packaged with the app to provide a backwards compatible way for users that have used its extensions framework in the past to solve complex problems. However, that job is now hidden by default to avoid confusion with the two new SSoT based onboarding jobs that v4.0.0 exposes. + +## [v4.0.0 (2024-08-05)](https://github.com/nautobot/nautobot-app-device-onboarding/releases/tag/v4.0.0) + +### Added + +- [#181](https://github.com/nautobot/nautobot-app-device-onboarding/issues/181) - Sync Devices from Network job was added which utilizes the SSoT framework to onboard devices. +- [#181](https://github.com/nautobot/nautobot-app-device-onboarding/issues/181) - Sync Data from Network job was added which utilizes the SSoT framework to onboard devices. +- [#181](https://github.com/nautobot/nautobot-app-device-onboarding/issues/181) - Git Datasource object to be able to use a Git Repo to overload new SSoT job YAML file definitions. +- [#181](https://github.com/nautobot/nautobot-app-device-onboarding/issues/181) - Create a Nornir inventory `EmptyInventory` to support ondemand inventory population for `Sync Devices` job. +- [#181](https://github.com/nautobot/nautobot-app-device-onboarding/issues/181) - Add `nautobot-app-nornir` dependency to reuse `NautobotORMInventory` to support inventory creation for `Sync Data` job. +- [#201](https://github.com/nautobot/nautobot-app-device-onboarding/issues/201) - - Add ability to sync in cables for cisco ios,nxos and Juniper via neighbor discovery protocol commands. + +### Changed + +- [#151](https://github.com/nautobot/nautobot-app-device-onboarding/issues/151) - Replaced pydocstyle with ruff. +- [#181](https://github.com/nautobot/nautobot-app-device-onboarding/issues/181) - The `OnboardingTask` job is changed to `hidden` by default. + +### Housekeeping + +- [#167](https://github.com/nautobot/nautobot-app-device-onboarding/issues/167) - Re-baked from the template `nautobot-app-v2.2.1`. +- [#194](https://github.com/nautobot/nautobot-app-device-onboarding/issues/194) - - Add @housebpass to Codeowners +- [#194](https://github.com/nautobot/nautobot-app-device-onboarding/issues/194) - - Add ntc-templates to new issue template +- [#203](https://github.com/nautobot/nautobot-app-device-onboarding/issues/203) - - Add compatibility matrix for what platforms support which data fields to sync. From 96a0418e0d5cfc6e70ec80640edcd1a6ef16bac6 Mon Sep 17 00:00:00 2001 From: Stephen Corry Date: Mon, 5 Aug 2024 17:13:13 -0400 Subject: [PATCH 81/81] Add logger to other jobs (#210) * add logger to other jobs --- nautobot_device_onboarding/jobs.py | 7 +++++++ nautobot_device_onboarding/nornir_plays/command_getter.py | 1 + 2 files changed, 8 insertions(+) diff --git a/nautobot_device_onboarding/jobs.py b/nautobot_device_onboarding/jobs.py index 3a4bb16c..8521d104 100755 --- a/nautobot_device_onboarding/jobs.py +++ b/nautobot_device_onboarding/jobs.py @@ -35,6 +35,7 @@ from nautobot_device_onboarding.nornir_plays.command_getter import _parse_credentials, netmiko_send_commands from nautobot_device_onboarding.nornir_plays.empty_inventory import EmptyInventory from nautobot_device_onboarding.nornir_plays.inventory_creator import _set_inventory +from nautobot_device_onboarding.nornir_plays.logger import NornirLogger from nautobot_device_onboarding.nornir_plays.processor import TroubleshootingProcessor from nautobot_device_onboarding.utils.helper import onboarding_task_fqdn_to_ip @@ -720,6 +721,7 @@ def run(self, *args, **kwargs): # pragma: no cover # Initiate Nornir instance with empty inventory compiled_results = {} try: + logger = NornirLogger(self.job_result, self.logger.getEffectiveLevel()) with InitNornir( runner=NORNIR_SETTINGS.get("runner"), logging={"enabled": False}, @@ -736,26 +738,31 @@ def run(self, *args, **kwargs): # pragma: no cover if kwargs["ssot_job_type"] == "both": kwargs.update({"sync_vrfs": True}) kwargs.update({"sync_vlans": True}) + kwargs.update({"sync_cables": True}) nr_with_processors.run( task=netmiko_send_commands, command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], command_getter_job="sync_devices", + logger=logger, **kwargs, ) nr_with_processors.run( task=netmiko_send_commands, command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], command_getter_job="sync_network_data", + logger=logger, **kwargs, ) else: if kwargs["ssot_job_type"] == "sync_network_data": kwargs.update({"sync_vrfs": True}) kwargs.update({"sync_vlans": True}) + kwargs.update({"sync_cables": True}) nr_with_processors.run( task=netmiko_send_commands, command_getter_yaml_data=nornir_obj.inventory.defaults.data["platform_parsing_info"], command_getter_job=kwargs["ssot_job_type"], + logger=logger, **kwargs, ) except Exception as err: # pylint: disable=broad-exception-caught diff --git a/nautobot_device_onboarding/nornir_plays/command_getter.py b/nautobot_device_onboarding/nornir_plays/command_getter.py index 77b87e6d..71cefca9 100755 --- a/nautobot_device_onboarding/nornir_plays/command_getter.py +++ b/nautobot_device_onboarding/nornir_plays/command_getter.py @@ -268,6 +268,7 @@ def sync_devices_command_getter(job_result, log_level, kwargs): task=netmiko_send_commands, command_getter_yaml_data=nr_with_processors.inventory.defaults.data["platform_parsing_info"], command_getter_job="sync_devices", + logger=logger, **kwargs, ) except Exception as err: # pylint: disable=broad-exception-caught