diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml new file mode 100644 index 00000000..59160d07 --- /dev/null +++ b/.github/workflows/integration_tests.yml @@ -0,0 +1,47 @@ +--- +name: "Integration Tests" +on: # yamllint disable + workflow_call: + inputs: + runs-on: + description: "The OS to run the job on" + required: false + default: "ubuntu-22.04" + type: string + python-version: + description: "The Python version to use" + required: true + type: string + nautobot-version: + description: "The Nautobot version to use" + required: true + type: string + ansible-version: + description: "The Ansible version to use" + required: true + type: string + +jobs: + integration: + runs-on: "${{ inputs.runs-on }}" + env: + INVOKE_NAUTOBOT_ANSIBLE_PYTHON_VER: "${{ inputs.python-version }}" + INVOKE_NAUTOBOT_ANSIBLE_NAUTOBOT_VER: "${{ inputs.nautobot-version }}" + steps: + - name: "Check out repository code" + uses: "actions/checkout@v3" + - name: "Set up Python" + uses: "actions/setup-python@v3" + with: + python-version: "${{ inputs.python-version }}" + - name: "Install invoke" + run: "pip install -U pip && pip install invoke" + - name: "Install poetry" + run: "curl -sSL https://install.python-poetry.org | python3 -" + - name: "Install ansible-core" + # This ensures that even if the poetry.lock file updates we still test the right version + run: "poetry add ansible-core@~${{ inputs.ansible-version }}" + - name: "Start containers" + run: "invoke start" + - name: "Tests" + run: "invoke integration" diff --git a/.github/workflows/jobs.yml b/.github/workflows/jobs.yml deleted file mode 100644 index f2352cfa..00000000 --- a/.github/workflows/jobs.yml +++ /dev/null @@ -1,145 +0,0 @@ ---- -name: "Jobs" -on: # yamllint disable - workflow_call: - -jobs: - lint: - runs-on: "ubuntu-20.04" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v3" - - name: "Install invoke" - run: "pip install -U pip && pip install invoke" - - name: "Linting" - run: "invoke lint" - unit: - runs-on: "ubuntu-20.04" - strategy: - fail-fast: true - matrix: - python-version: ["3.7", "3.8", "3.9"] - env: - INVOKE_NAUTOBOT_ANSIBLE_PYTHON_VER: "${{ matrix.python-version }}" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v3" - - name: "Install invoke" - run: "pip install -U pip && pip install invoke" - - name: "Tests" - run: "invoke unit" - needs: - - "lint" - integration: - runs-on: "ubuntu-20.04" - strategy: - fail-fast: false - matrix: - # Need to check what is needed for the integration step - # python-version: ["3.6", "3.7", "3.8", "3.9"] - # nautobot-version: ["1.0.3", "1.1.1"] - # ansible-release: ["base", "core"] - include: - - python-version: "3.8" - nautobot-version: "1.3" - ansible-release: "base" # Ansible 2.10 - - python-version: "3.8" - nautobot-version: "1.3" - ansible-release: "2.11" - - python-version: "3.8" - nautobot-version: "1.3" - ansible-release: "2.9" - - python-version: "3.8" - nautobot-version: "1.4" - ansible-release: "2.10" - - python-version: "3.8" - nautobot-version: "1.4" - ansible-release: "2.12" - - python-version: "3.8" - nautobot-version: "1.5" - ansible-release: "2.12" - env: - INVOKE_NAUTOBOT_ANSIBLE_PYTHON_VER: "${{ matrix.python-version }}" - INVOKE_NAUTOBOT_ANSIBLE_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v3" - - name: "Install invoke" - run: "pip install -U pip && pip install invoke" - - name: "Install poetry" - if: "${{ matrix.ansible-release == '2.11' }}" - run: "curl -sSL https://install.python-poetry.org | python3 -" - - name: "Remove ansible-base" - if: "${{ matrix.ansible-release == '2.11' }}" - run: "poetry remove ansible-base" - - name: "Add ansible-core" - if: "${{ matrix.ansible-release == '2.11' }}" - run: "poetry add ansible-core@~2.11" - - name: "Install poetry" - if: "${{ matrix.ansible-release == '2.9' }}" - run: "curl -sSL https://install.python-poetry.org | python3 -" - - name: "Remove ansible-base" - if: "${{ matrix.ansible-release == '2.9' }}" - run: "poetry remove ansible-base" - - name: "Add Ansible 2.9" - if: "${{ matrix.ansible-release == '2.9' }}" - run: "poetry add ansible@~2.9" - - name: "Install poetry" - if: "${{ matrix.ansible-release == '2.12' }}" - run: "curl -sSL https://install.python-poetry.org | python3 -" - - name: "Remove ansible-base" - if: "${{ matrix.ansible-release == '2.12' }}" - run: "poetry remove ansible-base" - - name: "Add Ansible 2.12" - if: "${{ matrix.ansible-release == '2.12' }}" - run: "poetry add ansible-core@~2.12 --python ^${{ matrix.python-version }}" - - name: "Start containers" - run: "invoke start" - - name: "Tests" - run: "invoke integration" - needs: - - "unit" - publish_github: - name: "Publish to GitHub" - runs-on: "ubuntu-20.04" - if: "startsWith(github.ref, 'refs/tags/v')" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v3" - - name: "Set up Python" - uses: "actions/setup-python@v2" - with: - python-version: "3.9" - - name: "Install Python Packages" - run: "pip install ansible-core" - - name: "Build the collection" - run: "ansible-galaxy collection build --output-path build" - - name: "Upload binaries to release" - uses: "svenstaro/upload-release-action@v2" - with: - repo_token: "${{ secrets.GH_NAUTOBOT_BOT_TOKEN }}" - file: "build/*" - tag: "${{ github.ref }}" - overwrite: true - file_glob: true - needs: - - "integration" - publish_galaxy: - name: "Publish to Ansible Galaxy" - runs-on: "ubuntu-20.04" - if: "startsWith(github.ref, 'refs/tags/v')" - steps: - - name: "Check out repository code" - uses: "actions/checkout@v3" - - name: "Set up Python" - uses: "actions/setup-python@v2" - with: - python-version: "3.9" - - name: "Install Python Packages" - run: "pip install ansible-core" - - name: "Build the collection" - run: "ansible-galaxy collection build --output-path build" - - name: "Publish the collection" - run: "ansible-galaxy collection publish build/* --api-key=${{ secrets.GALAXY_API_TOKEN }}" - needs: - - "integration" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..5ff20534 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,87 @@ +--- +name: "Tests" +on: # yamllint disable + workflow_call: + inputs: + runs-on: + description: "The OS to run the job on" + required: false + default: "ubuntu-22.04" + type: string + full-integration: + description: "Run full integration tests" + required: false + default: false + type: boolean + +jobs: + lint: + runs-on: "${{ inputs.runs-on }}" + steps: + - name: "Check out repository code" + uses: "actions/checkout@v3" + - name: "Install invoke" + run: "pip install -U pip && pip install invoke" + - name: "Linting" + run: "invoke lint" + unit: + runs-on: "${{ inputs.runs-on }}" + strategy: + fail-fast: false + matrix: + python-version: + - "3.9" + - "3.10" + - "3.11" + env: + INVOKE_NAUTOBOT_ANSIBLE_PYTHON_VER: "${{ matrix.python-version }}" + steps: + - name: "Check out repository code" + uses: "actions/checkout@v3" + - name: "Install invoke" + run: "pip install -U pip && pip install invoke" + - name: "Tests" + run: "invoke unit" + needs: + - "lint" + integration_partial: + # Only run a subset of integration tests on normal PRs + if: ${{ inputs.full-integration == false }} + uses: ./.github/workflows/integration_tests.yml + strategy: + fail-fast: false + matrix: + python-version: + - "3.9" + nautobot-version: + - "2.0.0" + ansible-version: + - "2.14" + - "2.15" + with: + python-version: "${{ matrix.python-version }}" + nautobot-version: "${{ matrix.nautobot-version }}" + ansible-version: "${{ matrix.ansible-version }}" + needs: + - "unit" + integration_full: + if: ${{ inputs.full-integration == true }} + uses: ./.github/workflows/integration_tests.yml + strategy: + fail-fast: false + matrix: + python-version: + - "3.9" + - "3.10" + - "3.11" + nautobot-version: + - "2.0.0" + ansible-version: + - "2.14" + - "2.15" + with: + python-version: "${{ matrix.python-version }}" + nautobot-version: "${{ matrix.nautobot-version }}" + ansible-version: "${{ matrix.ansible-version }}" + needs: + - "unit" diff --git a/.github/workflows/ci.yml b/.github/workflows/trigger_pr_main.yml similarity index 68% rename from .github/workflows/ci.yml rename to .github/workflows/trigger_pr_main.yml index 6c40b15f..3dab8d47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/trigger_pr_main.yml @@ -1,17 +1,15 @@ --- -name: "CI" +name: "Pull Requests (main)" concurrency: # Cancel any existing runs of this workflow for this same PR group: "${{ '{{ github.workflow }}' }}-${{ '{{ github.ref }}' }}" cancel-in-progress: true on: # yamllint disable - push: + pull_request: branches: - - "develop" - "main" - pull_request: - release: - types: [published] jobs: - ci: - uses: ./.github/workflows/jobs.yml \ No newline at end of file + tests: + uses: ./.github/workflows/tests.yml + with: + full-integration: true diff --git a/.github/workflows/trigger_pr_normal.yml b/.github/workflows/trigger_pr_normal.yml new file mode 100644 index 00000000..fb05fa8f --- /dev/null +++ b/.github/workflows/trigger_pr_normal.yml @@ -0,0 +1,15 @@ +--- +name: "Pull Requests (normal)" +concurrency: # Cancel any existing runs of this workflow for this same PR + group: "${{ '{{ github.workflow }}' }}-${{ '{{ github.ref }}' }}" + cancel-in-progress: true +on: # yamllint disable + pull_request: + branches-ignore: + - "main" + +jobs: + tests: + uses: ./.github/workflows/tests.yml + with: + full-integration: false diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml new file mode 100644 index 00000000..3085c010 --- /dev/null +++ b/.github/workflows/trigger_release.yml @@ -0,0 +1,55 @@ +--- +name: "Release" +on: # yamllint disable + release: + types: [published] + +jobs: + tests: + uses: ./.github/workflows/tests.yml + with: + full-integration: true + publish_github: + name: "Publish to GitHub" + runs-on: "${{ inputs.runs-on }}" + if: "startsWith(github.ref, 'refs/tags/v')" + steps: + - name: "Check out repository code" + uses: "actions/checkout@v3" + - name: "Set up Python" + uses: "actions/setup-python@v3" + with: + python-version: "3.9" + - name: "Install Python Packages" + run: "pip install ansible-core" + - name: "Build the collection" + run: "ansible-galaxy collection build --output-path build" + - name: "Upload binaries to release" + uses: "svenstaro/upload-release-action@v2" + with: + repo_token: "${{ secrets.GH_NAUTOBOT_BOT_TOKEN }}" + file: "build/*" + tag: "${{ github.ref }}" + overwrite: true + file_glob: true + needs: + - "tests" + publish_galaxy: + name: "Publish to Ansible Galaxy" + runs-on: "${{ inputs.runs-on }}" + if: "startsWith(github.ref, 'refs/tags/v')" + steps: + - name: "Check out repository code" + uses: "actions/checkout@v3" + - name: "Set up Python" + uses: "actions/setup-python@v3" + with: + python-version: "3.9" + - name: "Install Python Packages" + run: "pip install ansible-core" + - name: "Build the collection" + run: "ansible-galaxy collection build --output-path build" + - name: "Publish the collection" + run: "ansible-galaxy collection publish build/* --api-key=${{ secrets.GALAXY_API_TOKEN }}" + needs: + - "tests" diff --git a/.github/workflows/scheduled.yml b/.github/workflows/trigger_scheduled.yml similarity index 51% rename from .github/workflows/scheduled.yml rename to .github/workflows/trigger_scheduled.yml index eb5afe11..66e409d2 100644 --- a/.github/workflows/scheduled.yml +++ b/.github/workflows/trigger_scheduled.yml @@ -5,5 +5,7 @@ on: # yamllint disable - cron: "20 3 * * 1" jobs: - ci: - uses: ./.github/workflows/jobs.yml + tests: + uses: ./.github/workflows/tests.yml + with: + full-integration: true diff --git a/.readthedocs.yml b/.readthedocs.yml index d3305037..1e31f6f4 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,8 +1,13 @@ version: 2 + #sphinx: # configuration: docs/conf.py +build: + os: ubuntu-20.04 + tools: + python: "3.6" + python: - version: 3.6 install: - requirements: docs/requirements.txt diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5b07e800..6670c27e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,35 @@ networktocode.nautobot Release Notes .. contents:: Topics +v5.0.0 +====== + +Release Summary +--------------- + +This release updates collection code for compatibility code with Nautobot 2.0, where API has breaking changes. + +Breaking Changes / Porting Guide +-------------------------------- + +- (#234) Updates for Nautobot 2.0 Compatibility + +New Modules +----------- + +- networktocode.nautobot.ip_address_to_interface - Creates or removes associations between IP and interface. +- networktocode.nautobot.role - Creates or removes a role. + +Removed Modules +----------- + +- networktocode.nautobot.site - Removed as locations replace sites and regions. +- networktocode.nautobot.region - Removed as locations replace sites and regions. +- networktocode.nautobot.device_role - Removed as roles changes into generic type with content_types. +- networktocode.nautobot.ipam_role - Removed as roles changes into generic type with content_types. +- networktocode.nautobot.rack_role - Removed as roles changes into generic type with content_types. +- networktocode.nautobot.aggregate - Model removed in 2.0. + v4.4.0 ====== diff --git a/Dockerfile b/Dockerfile index 006c3f65..633f25f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,11 +3,11 @@ # # This base stage just installs the dependencies required for production # without any development deps. -ARG PYTHON_VER=3.8 +ARG PYTHON_VER=3.9 FROM python:${PYTHON_VER} AS base # Allow for flexible Python versions, for broader testing -ARG PYTHON_VER=3.8 +ARG PYTHON_VER=3.9 ENV PYTHON_VERSION=${PYTHON_VER} ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq shellcheck && apt-get clean @@ -54,16 +54,13 @@ RUN echo 'Running Black' && \ # into an image with docker-compose for running the full test suite. FROM lint AS unittests -# Remove black from dev dependencies to prevent conflicts with Ansible -RUN poetry remove black --group dev - # Set a custom collection path for all ansible commands # Note: This only allows for one path, not colon-separated, because we use it # elsewhere ARG ANSIBLE_COLLECTIONS_PATH=/usr/share/ansible/collections ENV ANSIBLE_COLLECTIONS_PATH=${ANSIBLE_COLLECTIONS_PATH} -ARG PYTHON_VER=3.8 +ARG PYTHON_VER=3.9 ENV PYTHON_VERSION=${PYTHON_VER} # Allows for custom command line arguments to be passed to ansible-test (like -vvv) diff --git a/changelogs/changelog.yaml b/changelogs/changelog.yaml index ab25b2eb..ace1a600 100644 --- a/changelogs/changelog.yaml +++ b/changelogs/changelog.yaml @@ -385,3 +385,16 @@ releases: - (#220) Adds status option to device_interface module - (#217) Fixes and enables testing for Nautobot 1.5 release_summary: "Fixes error handling in inventory to not erase inventories, minor bug fixes, and introduces Plugin module" + 5.0.0: + changes: + breaking_changes: + - (#234) Updates for Nautobot 2.0 Compatibility + release_summary: "This release updates collection code for compatibility code with Nautobot 2.0, where API has breaking changes. +" + modules: + - description: Creates or removes associations between IP and interface. + name: ip_address_to_interface + namespace: "" + - description: Creates or removes a role. Collapsed from several role modules in DCIM and IPAM. + name: role + namespace: "" diff --git a/development/Dockerfile b/development/Dockerfile index b8595d63..0bc5d98e 100644 --- a/development/Dockerfile +++ b/development/Dockerfile @@ -3,11 +3,8 @@ ARG PYTHON_VER FROM ghcr.io/nautobot/nautobot:${NAUTOBOT_VER}-py${PYTHON_VER} as nautobot -# Capture the argument again -ARG NAUTOBOT_VER - # Copy in the requirements file -COPY ./development/requirements${NAUTOBOT_VER}.txt /opt/nautobot/requirements.txt +COPY ./development/requirements.txt /opt/nautobot/requirements.txt # Install the requirements RUN pip install -r /opt/nautobot/requirements.txt diff --git a/development/requirements.txt b/development/requirements.txt index fcc901b1..d2be6f8d 100644 --- a/development/requirements.txt +++ b/development/requirements.txt @@ -1 +1 @@ -nautobot-bgp-models==0.7.0b1 \ No newline at end of file +nautobot-bgp-models==0.20.0 \ No newline at end of file diff --git a/development/requirements1.3.txt b/development/requirements1.3.txt deleted file mode 100644 index fcc901b1..00000000 --- a/development/requirements1.3.txt +++ /dev/null @@ -1 +0,0 @@ -nautobot-bgp-models==0.7.0b1 \ No newline at end of file diff --git a/development/requirements1.4.txt b/development/requirements1.4.txt deleted file mode 100644 index fcc901b1..00000000 --- a/development/requirements1.4.txt +++ /dev/null @@ -1 +0,0 @@ -nautobot-bgp-models==0.7.0b1 \ No newline at end of file diff --git a/development/requirements1.5.txt b/development/requirements1.5.txt deleted file mode 100644 index f023c216..00000000 --- a/development/requirements1.5.txt +++ /dev/null @@ -1 +0,0 @@ -nautobot-bgp-models==0.7.1 \ No newline at end of file diff --git a/docs/getting_started/contributing/modules/architecture.rst b/docs/getting_started/contributing/modules/architecture.rst index 611ae570..c896dbf4 100644 --- a/docs/getting_started/contributing/modules/architecture.rst +++ b/docs/getting_started/contributing/modules/architecture.rst @@ -57,7 +57,6 @@ Let's take a look at some of the code within ``dcim.py``. from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import ( NautobotModule, ENDPOINT_NAME_MAPPING, - SLUG_REQUIRED, ) NB_CABLES = "cables" @@ -65,7 +64,7 @@ Let's take a look at some of the code within ``dcim.py``. NB_CONSOLE_PORT_TEMPLATES = "console_port_templates" ... -The top of the code is importing the ``NautobotModule`` class, ``ENDPOINT_NAME_MAPPING``, and ``SLUG_REQUIRED`` from ``utils.py``. +The top of the code is importing the ``NautobotModule`` class, ``ENDPOINT_NAME_MAPPING``, and from ``utils.py``. After the imports, we define constants to define the endpoints that are supported as well as these being passed into the initialization of ``NautobotModule``. We'll see these within the actual modules themselves when we take a look later. @@ -159,12 +158,10 @@ Let's take a look at the next block of code. # Used for msg output if data.get("name"): name = data["name"] - elif data.get("model") and not data.get("slug"): + elif data.get("model"): name = data["model"] elif data.get("master"): name = self.module.params["data"]["master"] - elif data.get("slug"): - name = data["slug"] ... We then assign the data instance to ``data`` that will be used throughout the end of the ``run`` method. Next wee need to assign the name variable for future use when attempting @@ -176,16 +173,11 @@ Now we move onto some more data manipulation to prepare the payload for Nautobot def run(self): ... - if self.endpoint in SLUG_REQUIRED: - if not data.get("slug"): - data["slug"] = self._to_slug(name) - # Make color params lowercase if data.get("color"): data["color"] = data["color"].lower() -We're using the ``SLUG_REQUIRED`` constant that we imported above from ``utils`` to determine if the endpoint requires a slug when creating it. If the endpoint requires a **slug** and the user has not provided -a slug then we set it for the user by using the ``_to_slug`` method on ``NautobotModule`` that uses the same logic Nautobot does. We also make sure that **color** is lowercase if provided. +We make sure that **color** is lowercase if provided. Here is some more endpoint specific logic that we aren't going to cover, but provides a good example of what some modules may implement when the normal flow does not work for the endpoint. diff --git a/docs/getting_started/contributing/modules/new_module.rst b/docs/getting_started/contributing/modules/new_module.rst index bc992123..7e92e557 100644 --- a/docs/getting_started/contributing/modules/new_module.rst +++ b/docs/getting_started/contributing/modules/new_module.rst @@ -67,8 +67,8 @@ Open ``plugins/module_utils/utils.py`` and update the following. # Used to normalize data for the respective query types used to find endpoints QUERY_TYPES = dict( ... - region="slug", - rir="slug", + device="name", + rir="name", route_targets="name", ... @@ -76,7 +76,7 @@ Open ``plugins/module_utils/utils.py`` and update the following. ENDPOINT_NAME_MAPPING = { ... - "regions": "region", + "locations": "location", "rirs": "rir", "roles": "role", "route_targets": "route_target", @@ -86,11 +86,11 @@ Open ``plugins/module_utils/utils.py`` and update the following. ALLOWED_QUERY_PARAMS = { ... - "region": set(["slug"]), + "location": set(["name, "id"]), "rear_port": set(["name", "device"]), "rear_port_template": set(["name", "device_type"]), - "rir": set(["slug"]), - "role": set(["slug"]), + "rir": set(["name"]), + "role": set(["name"]), "route_target": set(["name"]), ... @@ -377,7 +377,6 @@ They're stored in ``tests/integration/targets`` and each target corresponds with ├── latest │ └── tasks │ ├── main.yml - │ ├── aggregate.yml │ ├── cable.yml ├── regression-latest │ └── tasks @@ -388,7 +387,6 @@ They're stored in ``tests/integration/targets`` and each target corresponds with └── v2.9 └── tasks ├── main.yml - ├── aggregate.yml ├── cable.yml This isn't all the directories or files, but since we only support the two latest Nautobot releases, we have a folder for the **latest** and the second latest version of Nautobot, in this case v2.9. diff --git a/docs/getting_started/contributing/modules/update_module.rst b/docs/getting_started/contributing/modules/update_module.rst index 05822765..ec86c22b 100644 --- a/docs/getting_started/contributing/modules/update_module.rst +++ b/docs/getting_started/contributing/modules/update_module.rst @@ -99,7 +99,7 @@ Now that we have that taken care of, let's move onto the ``utils``. QUERY_TYPES = dict( ... export_targets="name", - group="slug", + group="name", installed_device="name", import_targets="name", ... diff --git a/docs/getting_started/how-to-use/inventory.rst b/docs/getting_started/how-to-use/inventory.rst index 008999a3..49578cc2 100644 --- a/docs/getting_started/how-to-use/inventory.rst +++ b/docs/getting_started/how-to-use/inventory.rst @@ -6,7 +6,7 @@ This page will just have quick examples that people may have had questions about The inventory plugin documentation can be found :ref:`here`. -Using Compose to Set ansible_network_os to Platform Slug +Using Compose to Set ansible_network_os to Platform Network Driver ------------------------------------------------------------------ .. code-block:: yaml @@ -14,10 +14,10 @@ Using Compose to Set ansible_network_os to Platform Slug --- plugin: networktocode.nautobot.inventory compose: - ansible_network_os: platform.slug + ansible_network_os: platform.network_driver -Using Keyed Groups to set ansible_network_os to Platform Slug +Using Keyed Groups to set ansible_network_os to Platform Network Driver ---------------------------------------------------------------- .. code-block:: yaml diff --git a/docs/getting_started/how-to-use/modules.rst b/docs/getting_started/how-to-use/modules.rst index 69c6e0aa..3a75822b 100644 --- a/docs/getting_started/how-to-use/modules.rst +++ b/docs/getting_started/how-to-use/modules.rst @@ -69,7 +69,7 @@ This does mean that the modules may make the call to Nautobot to create an objec .. code-block:: bash - failed: [localhost] (item={'unit': 2, 'type': 'nexus-child'}) => {"ansible_loop_var": "item", "changed": false, "item": {"type": "nexus-child", "unit": 2}, "msg": "{\"device_role\":[\"This field is required.\"]}"} + failed: [localhost] (item={'unit': 2, 'type': 'nexus-child'}) => {"ansible_loop_var": "item", "changed": false, "item": {"type": "nexus-child", "unit": 2}, "msg": "{\"role\":[\"This field is required.\"]}"} To expand further, our ``present`` state can either **create** or **update** an object. If the object does not exist within Nautobot it will send a ``POST`` and create the object. @@ -91,8 +91,8 @@ Let's take a look at creating a device via the API. The required fields are marked by ``*`` and we can see the following are fields are required: - **device_type** - - **device_role** - - **site** + - **role** + - **location** These same fields are required when creating a device via the :ref:`device ` module, but with the important addition of **name**. @@ -108,64 +108,42 @@ These same fields are required when creating a device via the :ref:`device `_ (version 4.5.0). - - To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. - You need further requirements to be able to use this module, - see :ref:`Requirements ` for details. - - To use it in a playbook, specify: :code:`networktocode.nautobot.aggregate`. - -.. version_added - -.. rst-class:: ansible-version-added - -New in networktocode.nautobot 1.0.0 - -.. contents:: - :local: - :depth: 1 - -.. Deprecated - - -Synopsis --------- - -.. Description - -- Creates or removes aggregates from Nautobot - - -.. Aliases - - -.. Requirements - -.. _ansible_collections.networktocode.nautobot.aggregate_module_requirements: - -Requirements ------------- -The below requirements are needed on the host that executes this module. - -- pynautobot - - - - - - -.. Options - -Parameters ----------- - - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Parameter - - Comments - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-api_version: - - .. rst-class:: ansible-option-title - - **api_version** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 4.1.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - API Version Nautobot REST API - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-custom_fields: - - .. rst-class:: ansible-option-title - - **custom_fields** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`dictionary` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Must exist in Nautobot and in key/value format - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-date_added: - - .. rst-class:: ansible-option-title - - **date_added** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Date added, format: YYYY-MM-DD - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-description: - - .. rst-class:: ansible-option-title - - **description** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The description of the aggregate - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-prefix: - - .. rst-class:: ansible-option-title - - **prefix** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` / :ansible-option-required:`required` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The aggregate prefix - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-query_params: - - .. rst-class:: ansible-option-title - - **query_params** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-rir: - - .. rst-class:: ansible-option-title - - **rir** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The RIR the aggregate will be assigned to - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-state: - - .. rst-class:: ansible-option-title - - **state** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Use \ :literal:`present`\ or \ :literal:`absent`\ for adding or removing. - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`"absent"` - - :ansible-option-choices-entry-default:`"present"` :ansible-option-choices-default-mark:`← (default)` - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-tags: - - .. rst-class:: ansible-option-title - - **tags** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`list` / :ansible-option-elements:`elements=any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Any tags that this item may need to be associated with - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-token: - - .. rst-class:: ansible-option-title - - **token** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The token created within Nautobot to authorize API access - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-url: - - .. rst-class:: ansible-option-title - - **url** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__parameter-validate_certs: - - .. rst-class:: ansible-option-title - - **validate_certs** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - .. raw:: html - -
- - - .. raw:: html - -
- - If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. - - - .. rst-class:: ansible-option-line - - :ansible-option-default-bold:`Default:` :ansible-option-default:`true` - - .. raw:: html - -
- - -.. Attributes - - -.. Notes - -Notes ------ - -.. note:: - - Tags should be defined as a YAML list - - This should be ran with connection \ :literal:`local`\ and hosts \ :literal:`localhost`\ - -.. Seealso - - -.. Examples - -Examples --------- - -.. code-block:: yaml+jinja - - - - name: "Test Nautobot aggregate module" - connection: local - hosts: localhost - gather_facts: False - - tasks: - - name: Create aggregate within Nautobot with only required information - networktocode.nautobot.aggregate: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.0.0/16 - rir: Test RIR - state: present - - - name: Create aggregate with several specified options - networktocode.nautobot.aggregate: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.0.0/16 - rir: Test RIR - date_added: 1989-01-18 - description: Test description - tags: - - Schnozzberry - state: present - - - name: Delete aggregate within nautobot - networktocode.nautobot.aggregate: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.0.0/16 - state: absent - - - - -.. Facts - - -.. Return values - -Return Values -------------- -Common return values are documented :ref:`here `, the following are the fields unique to this module: - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Key - - Description - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__return-aggregate: - - .. rst-class:: ansible-option-title - - **aggregate** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`dictionary` - - .. raw:: html - -
- - - .. raw:: html - -
- - Serialized object as created or already existent within Nautobot - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` on creation - - - .. raw:: html - -
- - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.aggregate_module__return-msg: - - .. rst-class:: ansible-option-title - - **msg** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Message indicating failure or info about what has been achieved - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` always - - - .. raw:: html - -
- - - -.. Status (Presently only deprecated) - - -.. Authors - -Authors -~~~~~~~ - -- Mikhail Yohman (@FragmentedPacket) - - - -.. Extra links - -Collection links -~~~~~~~~~~~~~~~~ - -.. raw:: html - - - -.. Parsing errors - diff --git a/docs/plugins/cable_module.rst b/docs/plugins/cable_module.rst index b98c591a..7e46182e 100644 --- a/docs/plugins/cable_module.rst +++ b/docs/plugins/cable_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.cable module -- Create, update or delete cables within Na .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/circuit_module.rst b/docs/plugins/circuit_module.rst index e1b2a979..ed7c9a69 100644 --- a/docs/plugins/circuit_module.rst +++ b/docs/plugins/circuit_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.circuit module -- Create, update or delete circuits withi .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/circuit_termination_module.rst b/docs/plugins/circuit_termination_module.rst index cb93d309..831bd8c3 100644 --- a/docs/plugins/circuit_termination_module.rst +++ b/docs/plugins/circuit_termination_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.circuit_termination module -- Create, update or delete ci .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -219,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-port_speed: + .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-location: .. rst-class:: ansible-option-title - **port_speed** + **location** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`integer` + :ansible-option-type:`any` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -246,7 +245,7 @@ Parameters
- The speed of the port (Kbps) + The location the circuit termination will be assigned to .. raw:: html @@ -256,21 +255,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-pp_info: + .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-port_speed: .. rst-class:: ansible-option-title - **pp_info** + **port_speed** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`integer` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -283,7 +282,7 @@ Parameters
- Patch panel information + The speed of the port (Kbps) .. raw:: html @@ -293,23 +292,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-provider_network: + .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-pp_info: .. rst-class:: ansible-option-title - **provider_network** + **pp_info** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`string` - :ansible-option-versionadded:`added in networktocode.nautobot 4.2.0` + :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` .. raw:: html @@ -320,7 +319,7 @@ Parameters
- Connection to a provider\_network type + Patch panel information .. raw:: html @@ -330,23 +329,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-provider_network: .. rst-class:: ansible-option-title - **query_params** + **provider_network** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`any` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 4.2.0` .. raw:: html @@ -357,11 +356,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + Connection to a provider\_network type .. raw:: html @@ -371,21 +366,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.circuit_termination_module__parameter-query_params: .. rst-class:: ansible-option-title - **site** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -398,7 +393,11 @@ Parameters
- The site the circuit termination will be assigned to + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make + + an object unique in their environment. .. raw:: html @@ -708,7 +707,7 @@ Examples token: thisIsMyToken circuit: Test Circuit term_side: A - site: Test Site + location: "{{ location['key'] }}" port_speed: 10000 state: present diff --git a/docs/plugins/circuit_type_module.rst b/docs/plugins/circuit_type_module.rst index 64957ac9..d3f13dfb 100644 --- a/docs/plugins/circuit_type_module.rst +++ b/docs/plugins/circuit_type_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.circuit_type module -- Create, update or delete circuit t .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -145,21 +144,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_type_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.circuit_type_module__parameter-description: .. rst-class:: ansible-option-title - **name** + **description** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -172,7 +171,7 @@ Parameters
- The name of the circuit type + The decription of the the circuit type. .. raw:: html @@ -182,21 +181,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_type_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.circuit_type_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -209,11 +208,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the circuit type .. raw:: html @@ -223,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.circuit_type_module__parameter-slug: + .. _ansible_collections.networktocode.nautobot.circuit_type_module__parameter-query_params: .. rst-class:: ansible-option-title - **slug** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -250,9 +245,11 @@ Parameters
- The slugified version of the name or custom slug. + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make - This is auto-generated following Nautobot rules if not provided + an object unique in their environment. .. raw:: html diff --git a/docs/plugins/cluster_group_module.rst b/docs/plugins/cluster_group_module.rst index fbd7fec6..86851cce 100644 --- a/docs/plugins/cluster_group_module.rst +++ b/docs/plugins/cluster_group_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.cluster_group module -- Create, update or delete cluster .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -145,21 +144,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_group_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.cluster_group_module__parameter-description: .. rst-class:: ansible-option-title - **name** + **description** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -172,7 +171,7 @@ Parameters
- The name of the cluster group + The description of the cluster group .. raw:: html @@ -182,21 +181,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_group_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.cluster_group_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -209,11 +208,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the cluster group .. raw:: html @@ -223,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_group_module__parameter-slug: + .. _ansible_collections.networktocode.nautobot.cluster_group_module__parameter-query_params: .. rst-class:: ansible-option-title - **slug** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -250,9 +245,11 @@ Parameters
- The slugified version of the name or custom slug. + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make - This is auto-generated following Nautobot rules if not provided + an object unique in their environment. .. raw:: html diff --git a/docs/plugins/cluster_module.rst b/docs/plugins/cluster_module.rst index 89528620..1326f234 100644 --- a/docs/plugins/cluster_module.rst +++ b/docs/plugins/cluster_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.cluster module -- Create, update or delete clusters withi .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -209,7 +208,7 @@ Parameters
- type of the cluster + type of the cluster. Required if \ :emphasis:`state=present`\ and the cluster does not exist yet .. raw:: html @@ -293,21 +292,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.cluster_module__parameter-location: .. rst-class:: ansible-option-title - **name** + **location** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`any` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -320,7 +319,7 @@ Parameters
- The name of the cluster + Cluster location. .. raw:: html @@ -330,21 +329,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.cluster_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -357,11 +356,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the cluster .. raw:: html @@ -371,21 +366,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.cluster_module__parameter-query_params: .. rst-class:: ansible-option-title - **site** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -398,7 +393,11 @@ Parameters
- Required if \ :emphasis:`state=present`\ and the cluster does not exist yet + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make + + an object unique in their environment. .. raw:: html @@ -682,14 +681,14 @@ Examples - Schnozzberry state: present - - name: Update the group and site of an existing cluster + - name: Update the group and location of an existing cluster networktocode.nautobot.cluster: url: http://nautobot.local token: thisIsMyToken name: Test Cluster cluster_type: qemu cluster_group: GROUP - site: SITE + location: "{{ location['key'] }}" state: present diff --git a/docs/plugins/cluster_type_module.rst b/docs/plugins/cluster_type_module.rst index ded0db52..d4ca6674 100644 --- a/docs/plugins/cluster_type_module.rst +++ b/docs/plugins/cluster_type_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.cluster_type module -- Create, update or delete cluster t .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -145,21 +144,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_type_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.cluster_type_module__parameter-description: .. rst-class:: ansible-option-title - **name** + **description** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -172,7 +171,7 @@ Parameters
- The name of the cluster type + The description of the cluster type .. raw:: html @@ -182,21 +181,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_type_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.cluster_type_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -209,11 +208,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the cluster type .. raw:: html @@ -223,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.cluster_type_module__parameter-slug: + .. _ansible_collections.networktocode.nautobot.cluster_type_module__parameter-query_params: .. rst-class:: ansible-option-title - **slug** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -250,9 +245,11 @@ Parameters
- The slugified version of the name or custom slug. + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make - This is auto-generated following Nautobot rules if not provided + an object unique in their environment. .. raw:: html diff --git a/docs/plugins/console_port_module.rst b/docs/plugins/console_port_module.rst index 30a3a067..68e3c2f2 100644 --- a/docs/plugins/console_port_module.rst +++ b/docs/plugins/console_port_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.console_port module -- Create, update or delete console p .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/console_port_template_module.rst b/docs/plugins/console_port_template_module.rst index a4cfae02..0b857a85 100644 --- a/docs/plugins/console_port_template_module.rst +++ b/docs/plugins/console_port_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.console_port_template module -- Create, update or delete .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/console_server_port_module.rst b/docs/plugins/console_server_port_module.rst index 4d1eeeec..4f7d9514 100644 --- a/docs/plugins/console_server_port_module.rst +++ b/docs/plugins/console_server_port_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.console_server_port module -- Create, update or delete co .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/console_server_port_template_module.rst b/docs/plugins/console_server_port_template_module.rst index 0040b617..e45b7d43 100644 --- a/docs/plugins/console_server_port_template_module.rst +++ b/docs/plugins/console_server_port_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.console_server_port_template module -- Create, update or .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/device_bay_module.rst b/docs/plugins/device_bay_module.rst index fa301a98..c2a5051e 100644 --- a/docs/plugins/device_bay_module.rst +++ b/docs/plugins/device_bay_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.device_bay module -- Create, update or delete device bays .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/device_bay_template_module.rst b/docs/plugins/device_bay_template_module.rst index f4c8ef3f..49b25faf 100644 --- a/docs/plugins/device_bay_template_module.rst +++ b/docs/plugins/device_bay_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.device_bay_template module -- Create, update or delete de .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/device_interface_module.rst b/docs/plugins/device_interface_module.rst index 0e530645..876ba4ac 100644 --- a/docs/plugins/device_interface_module.rst +++ b/docs/plugins/device_interface_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.device_interface module -- Creates or removes interfaces .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -741,7 +740,7 @@ Parameters :ansible-option-type:`any` - :ansible-option-versionadded:`added in networktocode.nautobot 4.4.0` + :ansible-option-versionadded:`added in networktocode.nautobot 4.5.0` .. raw:: html @@ -1143,12 +1142,12 @@ Examples type: 1000Base-t (1GE) untagged_vlan: name: Wireless - site: Test Site + location: "{{ location['key'] }}" tagged_vlans: - name: Data - site: Test Site + location: "{{ location['key'] }}" - name: VoIP - site: Test Site + location: "{{ location['key'] }}" mtu: 1600 mgmt_only: true mode: Tagged diff --git a/docs/plugins/device_interface_template_module.rst b/docs/plugins/device_interface_template_module.rst index 18306d42..3bab2bae 100644 --- a/docs/plugins/device_interface_template_module.rst +++ b/docs/plugins/device_interface_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.device_interface_template module -- Creates or removes in .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/device_module.rst b/docs/plugins/device_module.rst index 8a216ee5..c89d8e54 100644 --- a/docs/plugins/device_module.rst +++ b/docs/plugins/device_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.device module -- Create, update or delete devices within .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -293,17 +292,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_module__parameter-device_role: + .. _ansible_collections.networktocode.nautobot.device_module__parameter-device_type: .. rst-class:: ansible-option-title - **device_role** + **device_type** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -330,21 +329,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_module__parameter-device_type: + .. _ansible_collections.networktocode.nautobot.device_module__parameter-face: .. rst-class:: ansible-option-title - **device_type** + **face** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -357,7 +356,17 @@ Parameters
- Required if \ :emphasis:`state=present`\ and the device does not exist yet + Required if \ :emphasis:`rack`\ is defined + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry:`"Front"` + - :ansible-option-choices-entry:`"front"` + - :ansible-option-choices-entry:`"Rear"` + - :ansible-option-choices-entry:`"rear"` .. raw:: html @@ -367,21 +376,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_module__parameter-face: + .. _ansible_collections.networktocode.nautobot.device_module__parameter-local_config_context_data: .. rst-class:: ansible-option-title - **face** + **local_config_context_data** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`dictionary` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -394,17 +403,7 @@ Parameters
- Required if \ :emphasis:`rack`\ is defined - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`"Front"` - - :ansible-option-choices-entry:`"front"` - - :ansible-option-choices-entry:`"Rear"` - - :ansible-option-choices-entry:`"rear"` + Arbitrary JSON data to define the devices configuration variables. .. raw:: html @@ -414,21 +413,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_module__parameter-local_context_data: + .. _ansible_collections.networktocode.nautobot.device_module__parameter-location: .. rst-class:: ansible-option-title - **local_context_data** + **location** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`dictionary` + :ansible-option-type:`string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -441,7 +440,7 @@ Parameters
- Arbitrary JSON data to define the devices configuration variables. + Required if \ :emphasis:`state=present`\ and the device does not exist yet .. raw:: html @@ -714,21 +713,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_module__parameter-serial: + .. _ansible_collections.networktocode.nautobot.device_module__parameter-role: .. rst-class:: ansible-option-title - **serial** + **role** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`any` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -741,7 +740,7 @@ Parameters
- Serial number of the device + Required if \ :emphasis:`state=present`\ and the device does not exist yet .. raw:: html @@ -751,21 +750,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.device_module__parameter-serial: .. rst-class:: ansible-option-title - **site** + **serial** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -778,7 +777,7 @@ Parameters
- Required if \ :emphasis:`state=present`\ and the device does not exist yet + Serial number of the device .. raw:: html @@ -1193,10 +1192,12 @@ Examples token: thisIsMyToken name: Test Device device_type: C9410R - device_role: Core Switch - site: Main + role: Core Switch + location: "{{ my_location['key'] }}" status: active state: present + vars: + my_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\"') }}" - name: Create device within Nautobot with empty string name to generate UUID networktocode.nautobot.device: @@ -1204,10 +1205,12 @@ Examples token: thisIsMyToken name: "" device_type: C9410R - device_role: Core Switch - site: Main + role: Core Switch + location: "{{ my_location['key'] }}" status: active state: present + vars: + my_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\"') }}" - name: Delete device within nautobot networktocode.nautobot.device: @@ -1222,14 +1225,16 @@ Examples token: thisIsMyToken name: Another Test Device device_type: C9410R - device_role: Core Switch - site: Main + role: Core Switch + location: "{{ my_location['key'] }}" status: active - local_context_data: + local_config_context_data: bgp: "65000" tags: - Schnozzberry state: present + vars: + my_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\"') }}" - name: Update the rack and position of an existing device networktocode.nautobot.device: diff --git a/docs/plugins/device_type_module.rst b/docs/plugins/device_type_module.rst index cc01924a..f8d51006 100644 --- a/docs/plugins/device_type_module.rst +++ b/docs/plugins/device_type_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.device_type module -- Create, update or delete device typ .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -409,47 +408,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.device_type_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slug of the device type. Must follow slug formatting (URL friendly) - - If not specified, it will slugify the model - - ex. test-device-type - - .. raw:: html
@@ -757,7 +715,6 @@ Examples networktocode.nautobot.device_type: url: http://nautobot.local token: thisIsMyToken - slug: test-device-type model: ws-test-3750 manufacturer: Test Manufacturer state: present @@ -766,7 +723,6 @@ Examples networktocode.nautobot.device_type: url: http://nautobot.local token: thisIsMyToken - slug: test-device-type model: ws-test-3750 manufacturer: Test Manufacturer part_number: ws-3750g-v2 @@ -779,7 +735,7 @@ Examples networktocode.nautobot.device_type: url: http://nautobot.local token: thisIsMyToken - slug: test-device-type + model: ws-test-3750 state: absent diff --git a/docs/plugins/front_port_module.rst b/docs/plugins/front_port_module.rst index f7786dd2..bd43837b 100644 --- a/docs/plugins/front_port_module.rst +++ b/docs/plugins/front_port_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.front_port module -- Create, update or delete front ports .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/front_port_template_module.rst b/docs/plugins/front_port_template_module.rst index 18f72ee6..37b625b9 100644 --- a/docs/plugins/front_port_template_module.rst +++ b/docs/plugins/front_port_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.front_port_template module -- Create, update or delete fr .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/gql_inventory_inventory.rst b/docs/plugins/gql_inventory_inventory.rst index 17c44712..dd61ff85 100644 --- a/docs/plugins/gql_inventory_inventory.rst +++ b/docs/plugins/gql_inventory_inventory.rst @@ -42,7 +42,7 @@ networktocode.nautobot.gql_inventory inventory -- Nautobot inventory source usin .. Collection note .. note:: - This inventory plugin is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This inventory plugin is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this inventory plugin, @@ -91,7 +91,6 @@ The below requirements are needed on the local controller node that executes thi Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -139,7 +138,7 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_URL + - Environment variable: :envvar:`NAUTOBOT\_URL` .. raw:: html @@ -226,13 +225,13 @@ Parameters
- List of dot-sparated paths to index graphql query results (e.g. \`platform.slug\`) + List of dot-sparated paths to index graphql query results (e.g. \`platform.display\`) The final value returned by each path is used to derive group names and then group the devices into these groups. - Valid group names must be string, so indexing the dotted path should return a string (i.e. \`platform.slug\` instead of \`platform\`) + Valid group names must be string, so indexing the dotted path should return a string (i.e. \`platform.display\` instead of \`platform\`) - If value returned by the defined path is a dictionary, an attempt will first be made to access the \`name\` field, and then the \`slug\` field. (i.e. \`platform\` would attempt to lookup \`platform.name\`, and if that data was not returned, it would then try \`platform.slug\`) + If value returned by the defined path is a dictionary, an attempt will first be made to access the \`name\` field, and then the \`display\` field. (i.e. \`platform\` would attempt to lookup \`platform.name\`, and if that data was not returned, it would then try \`platform.display\`) @@ -240,6 +239,54 @@ Parameters :ansible-option-default-bold:`Default:` :ansible-option-default:`[]` + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.gql_inventory_inventory__parameter-group_names_raw: + + .. rst-class:: ansible-option-title + + **group_names_raw** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`boolean` + + :ansible-option-versionadded:`added in networktocode.nautobot 4.6.0` + + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + Will not add the group\_by choice name to the group names + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry-default:`false` :ansible-option-choices-default-mark:`← (default)` + - :ansible-option-choices-entry:`true` + + .. raw:: html
@@ -484,7 +531,7 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_TOKEN + - Environment variable: :envvar:`NAUTOBOT\_TOKEN` .. raw:: html @@ -598,11 +645,11 @@ Examples tags: name serial: tenant: name - site: + location: name: contact_name: description: - region: name + parent: name virtual_machines: tags: name tenant: name @@ -617,19 +664,19 @@ Examples tags: name serial: tenant: name - status: slug - site: + status: display + location: name: contact_name: description: - region: name + parent: name virtual_machines: tags: name tenant: name - status: slug + status: display group_by: - tenant.name - - status.slug + - status.display # Filter output using any supported parameters. # To get supported parameters check the api/docs page for devices. diff --git a/docs/plugins/index.rst b/docs/plugins/index.rst index 1a9ff8be..672e3c0a 100644 --- a/docs/plugins/index.rst +++ b/docs/plugins/index.rst @@ -6,7 +6,7 @@ Networktocode.Nautobot ====================== -Collection version 4.5.0 +Collection version 5.0.0 .. contents:: :local: @@ -47,7 +47,6 @@ These are the plugins in the networktocode.nautobot collection: Modules ~~~~~~~ -* :ref:`aggregate module ` -- Creates or removes aggregates from Nautobot * :ref:`cable module ` -- Create, update or delete cables within Nautobot * :ref:`circuit module ` -- Create, update or delete circuits within Nautobot * :ref:`circuit_termination module ` -- Create, update or delete circuit terminations within Nautobot @@ -64,13 +63,12 @@ Modules * :ref:`device_bay_template module ` -- Create, update or delete device bay templates within Nautobot * :ref:`device_interface module ` -- Creates or removes interfaces on devices from Nautobot * :ref:`device_interface_template module ` -- Creates or removes interfaces on devices from Nautobot -* :ref:`device_role module ` -- Create, update or delete devices roles within Nautobot * :ref:`device_type module ` -- Create, update or delete device types within Nautobot * :ref:`front_port module ` -- Create, update or delete front ports within Nautobot * :ref:`front_port_template module ` -- Create, update or delete front port templates within Nautobot * :ref:`inventory_item module ` -- Creates or removes inventory items from Nautobot * :ref:`ip_address module ` -- Creates or removes IP addresses from Nautobot -* :ref:`ipam_role module ` -- Creates or removes ipam roles from Nautobot +* :ref:`ip_address_to_interface module ` -- Creates or removes IP address to interface association from Nautobot * :ref:`location module ` -- Creates or removes locations from Nautobot * :ref:`location_type module ` -- Creates or removes location types from Nautobot * :ref:`manufacturer module ` -- Create or delete manufacturers within Nautobot @@ -88,15 +86,13 @@ Modules * :ref:`query_graphql module ` -- Queries and returns elements from Nautobot GraphQL endpoint * :ref:`rack module ` -- Create, update or delete racks within Nautobot * :ref:`rack_group module ` -- Create, update or delete racks groups within Nautobot -* :ref:`rack_role module ` -- Create, update or delete racks roles within Nautobot * :ref:`rear_port module ` -- Create, update or delete rear ports within Nautobot * :ref:`rear_port_template module ` -- Create, update or delete rear port templates within Nautobot -* :ref:`region module ` -- Creates or removes regions from Nautobot * :ref:`relationship_association module ` -- Creates or removes a relationship association from Nautobot * :ref:`rir module ` -- Create, update or delete RIRs within Nautobot +* :ref:`role module ` -- Create, update or delete roles within Nautobot * :ref:`route_target module ` -- Creates or removes route targets from Nautobot * :ref:`service module ` -- Creates or removes service from Nautobot -* :ref:`site module ` -- Creates or removes sites from Nautobot * :ref:`status module ` -- Creates or removes status from Nautobot * :ref:`tag module ` -- Creates or removes tags from Nautobot * :ref:`tenant module ` -- Creates or removes tenants from Nautobot @@ -108,35 +104,10 @@ Modules * :ref:`vm_interface module ` -- Creates or removes interfaces from virtual machines in Nautobot * :ref:`vrf module ` -- Create, update or delete vrfs within Nautobot - -Inventory Plugins -~~~~~~~~~~~~~~~~~ - -* :ref:`gql_inventory inventory ` -- Nautobot inventory source using GraphQL capability -* :ref:`inventory inventory ` -- Nautobot inventory source - - -Lookup Plugins -~~~~~~~~~~~~~~ - -* :ref:`lookup lookup ` -- Queries and returns elements from Nautobot -* :ref:`lookup_graphql lookup ` -- Queries and returns elements from Nautobot GraphQL endpoint - - - -.. seealso:: - - List of :ref:`collections ` with docs hosted here. - .. toctree:: :maxdepth: 1 :hidden: - gql_inventory_inventory - inventory_inventory - lookup_lookup - lookup_graphql_lookup - aggregate_module cable_module circuit_module circuit_termination_module @@ -153,13 +124,12 @@ Lookup Plugins device_bay_template_module device_interface_module device_interface_template_module - device_role_module device_type_module front_port_module front_port_template_module inventory_item_module ip_address_module - ipam_role_module + ip_address_to_interface_module location_module location_type_module manufacturer_module @@ -177,15 +147,13 @@ Lookup Plugins query_graphql_module rack_module rack_group_module - rack_role_module rear_port_module rear_port_template_module - region_module relationship_association_module rir_module + role_module route_target_module service_module - site_module status_module tag_module tenant_module @@ -196,3 +164,45 @@ Lookup Plugins vlan_group_module vm_interface_module vrf_module + + +Filter Plugins +~~~~~~~~~~~~~~ + +* :ref:`graphql_string filter ` -- + +.. toctree:: + :maxdepth: 1 + :hidden: + + graphql_string_filter + + +Inventory Plugins +~~~~~~~~~~~~~~~~~ + +* :ref:`gql_inventory inventory ` -- Nautobot inventory source using GraphQL capability +* :ref:`inventory inventory ` -- Nautobot inventory source + +.. toctree:: + :maxdepth: 1 + :hidden: + + gql_inventory_inventory + inventory_inventory + + +Lookup Plugins +~~~~~~~~~~~~~~ + +* :ref:`lookup lookup ` -- Queries and returns elements from Nautobot +* :ref:`lookup_graphql lookup ` -- Queries and returns elements from Nautobot GraphQL endpoint + +.. toctree:: + :maxdepth: 1 + :hidden: + + lookup_lookup + lookup_graphql_lookup + + diff --git a/docs/plugins/inventory_inventory.rst b/docs/plugins/inventory_inventory.rst index ee51c202..46b1402e 100644 --- a/docs/plugins/inventory_inventory.rst +++ b/docs/plugins/inventory_inventory.rst @@ -42,7 +42,7 @@ networktocode.nautobot.inventory inventory -- Nautobot inventory source .. Collection note .. note:: - This inventory plugin is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This inventory plugin is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. @@ -81,7 +81,6 @@ Synopsis Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -174,7 +173,7 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_URL + - Environment variable: :envvar:`NAUTOBOT\_URL` .. raw:: html @@ -274,7 +273,7 @@ Parameters cache = false - - Environment variable: ANSIBLE\_INVENTORY\_CACHE + - Environment variable: :envvar:`ANSIBLE\_INVENTORY\_CACHE` .. raw:: html @@ -333,9 +332,9 @@ Parameters cache_connection = VALUE - - Environment variable: ANSIBLE\_CACHE\_PLUGIN\_CONNECTION + - Environment variable: :envvar:`ANSIBLE\_CACHE\_PLUGIN\_CONNECTION` - - Environment variable: ANSIBLE\_INVENTORY\_CACHE\_CONNECTION + - Environment variable: :envvar:`ANSIBLE\_INVENTORY\_CACHE\_CONNECTION` .. raw:: html @@ -398,9 +397,9 @@ Parameters cache_plugin = memory - - Environment variable: ANSIBLE\_CACHE\_PLUGIN + - Environment variable: :envvar:`ANSIBLE\_CACHE\_PLUGIN` - - Environment variable: ANSIBLE\_INVENTORY\_CACHE\_PLUGIN + - Environment variable: :envvar:`ANSIBLE\_INVENTORY\_CACHE\_PLUGIN` .. raw:: html @@ -456,6 +455,21 @@ Parameters fact_caching_prefix = ansible_inventory_ + Removed in: version 2.16 of ansible.builtin + + + Why: Fixes typing error in INI section name + + Alternative: Use the 'defaults' section instead + + + + .. code-block:: + + [defaults] + fact_caching_prefix = ansible_inventory_ + + .. code-block:: @@ -463,9 +477,9 @@ Parameters cache_prefix = ansible_inventory_ - - Environment variable: ANSIBLE\_CACHE\_PLUGIN\_PREFIX + - Environment variable: :envvar:`ANSIBLE\_CACHE\_PLUGIN\_PREFIX` - - Environment variable: ANSIBLE\_INVENTORY\_CACHE\_PLUGIN\_PREFIX + - Environment variable: :envvar:`ANSIBLE\_INVENTORY\_CACHE\_PLUGIN\_PREFIX` .. raw:: html @@ -528,9 +542,9 @@ Parameters cache_timeout = 3600 - - Environment variable: ANSIBLE\_CACHE\_PLUGIN\_TIMEOUT + - Environment variable: :envvar:`ANSIBLE\_CACHE\_PLUGIN\_TIMEOUT` - - Environment variable: ANSIBLE\_INVENTORY\_CACHE\_TIMEOUT + - Environment variable: :envvar:`ANSIBLE\_INVENTORY\_CACHE\_TIMEOUT` .. raw:: html @@ -610,7 +624,7 @@ Parameters If True, it adds config\_context in host vars. - Config-context enables the association of arbitrary data to devices and virtual machines grouped by region, site, role, platform, and/or tenant. Please check official nautobot docs for more info. + Config-context enables the association of arbitrary data to devices and virtual machines grouped by location, role, platform, and/or tenant. Please check official nautobot docs for more info. .. rst-class:: ansible-option-line @@ -1008,8 +1022,8 @@ Parameters :ansible-option-choices:`Choices:` - - :ansible-option-choices-entry:`"sites"` - - :ansible-option-choices-entry:`"site"` + - :ansible-option-choices-entry:`"locations"` + - :ansible-option-choices-entry:`"location"` - :ansible-option-choices-entry:`"tenants"` - :ansible-option-choices-entry:`"tenant"` - :ansible-option-choices-entry:`"tenant\_group"` @@ -1027,7 +1041,6 @@ Parameters - :ansible-option-choices-entry:`"manufacturer"` - :ansible-option-choices-entry:`"platforms"` - :ansible-option-choices-entry:`"platform"` - - :ansible-option-choices-entry:`"region"` - :ansible-option-choices-entry:`"cluster"` - :ansible-option-choices-entry:`"cluster\_type"` - :ansible-option-choices-entry:`"cluster\_group"` @@ -1198,7 +1211,7 @@ Parameters .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`list` / :ansible-option-elements:`elements=dictionary` @@ -1218,6 +1231,313 @@ Parameters :ansible-option-default-bold:`Default:` :ansible-option-default:`[]` + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-keyed_groups/default_value: + + .. rst-class:: ansible-option-title + + **default_value** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`string` + + :ansible-option-versionadded:`added in ansible-core 2.12` + + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + The default value when the host variable's value is an empty string. + + This option is mutually exclusive with \ :literal:`trailing\_separator`\ . + + + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-keyed_groups/key: + + .. rst-class:: ansible-option-title + + **key** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`string` + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + The key from input dictionary used to generate groups + + + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-keyed_groups/parent_group: + + .. rst-class:: ansible-option-title + + **parent_group** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`string` + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + parent group for keyed group + + + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-keyed_groups/prefix: + + .. rst-class:: ansible-option-title + + **prefix** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`string` + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + A keyed group name will start with this prefix + + + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`""` + + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-keyed_groups/separator: + + .. rst-class:: ansible-option-title + + **separator** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`string` + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + separator used to build the keyed group name + + + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`"\_"` + + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-keyed_groups/trailing_separator: + + .. rst-class:: ansible-option-title + + **trailing_separator** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`boolean` + + :ansible-option-versionadded:`added in ansible-core 2.12` + + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + Set this option to \ :emphasis:`False`\ to omit the \ :literal:`separator`\ after the host variable when the value is an empty string. + + This option is mutually exclusive with \ :literal:`default\_value`\ . + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry:`false` + - :ansible-option-choices-entry-default:`true` :ansible-option-choices-default-mark:`← (default)` + + + .. raw:: html + +
+ + + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-leading_separator: + + .. rst-class:: ansible-option-title + + **leading_separator** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`boolean` + + :ansible-option-versionadded:`added in ansible-core 2.11` + + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + Use in conjunction with keyed\_groups. + + By default, a keyed group that does not have a prefix or a separator provided will have a name that starts with an underscore. + + This is because the default prefix is "" and the default separator is "\_". + + Set this option to False to omit the leading underscore (or other separator) if no prefix is given. + + If the group name is derived from a mapping the separator is still used to concatenate the items. + + To not use a separator in the group name at all, set the separator for the keyed group to an empty string instead. + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry:`false` + - :ansible-option-choices-entry-default:`true` :ansible-option-choices-default-mark:`← (default)` + + .. raw:: html
@@ -1347,7 +1667,7 @@ Parameters If True, all host vars are contained inside single-element arrays for legacy compatibility with old versions of this plugin. - Group names will be plural (ie. "sites\_mysite" instead of "site\_mysite") + Group names will be plural (ie. "locations\_mylocation" instead of "location\_mylocation") The choices of \ :emphasis:`group\_by`\ will be changed by this option. @@ -1580,7 +1900,70 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_TOKEN + - Environment variable: :envvar:`NAUTOBOT\_TOKEN` + + + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.inventory_inventory__parameter-use_extra_vars: + + .. rst-class:: ansible-option-title + + **use_extra_vars** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`boolean` + + :ansible-option-versionadded:`added in ansible-core 2.11` + + + + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + Merge extra vars into the available variables for composition (highest precedence). + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry-default:`false` :ansible-option-choices-default-mark:`← (default)` + - :ansible-option-choices-entry:`true` + + + .. rst-class:: ansible-option-line + + :ansible-option-configuration:`Configuration:` + + - INI entry: + + .. code-block:: + + [inventory_plugins] + use_extra_vars = false + + + - Environment variable: :envvar:`ANSIBLE\_INVENTORY\_USE\_EXTRA\_VARS` .. raw:: html diff --git a/docs/plugins/inventory_item_module.rst b/docs/plugins/inventory_item_module.rst index c640f987..c2fac475 100644 --- a/docs/plugins/inventory_item_module.rst +++ b/docs/plugins/inventory_item_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.inventory_item module -- Creates or removes inventory ite .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/ip_address_module.rst b/docs/plugins/ip_address_module.rst index a2e7b0de..6bc6f6e1 100644 --- a/docs/plugins/ip_address_module.rst +++ b/docs/plugins/ip_address_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.ip_address module -- Creates or removes IP addresses from .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -182,17 +181,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-assigned_object: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-custom_fields: .. rst-class:: ansible-option-title - **assigned_object** + **custom_fields** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -209,134 +208,31 @@ Parameters
- Definition of the assigned object. - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-assigned_object/device: - - .. rst-class:: ansible-option-title - - **device** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - The device the interface is attached to. - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-assigned_object/name: - - .. rst-class:: ansible-option-title - - **name** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - The name of the interface - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-assigned_object/virtual_machine: - - .. rst-class:: ansible-option-title - - **virtual_machine** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - The virtual machine the interface is attached to. + Must exist in Nautobot and in key/value format .. raw:: html
- * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-custom_fields: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-description: .. rst-class:: ansible-option-title - **custom_fields** + **description** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`dictionary` + :ansible-option-type:`string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -349,7 +245,7 @@ Parameters
- Must exist in Nautobot and in key/value format + The description of the interface .. raw:: html @@ -359,17 +255,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-description: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-dns_name: .. rst-class:: ansible-option-title - **description** + **dns_name** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -386,7 +282,7 @@ Parameters
- The description of the interface + Hostname or FQDN .. raw:: html @@ -396,23 +292,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-dns_name: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-namespace: .. rst-class:: ansible-option-title - **dns_name** + **namespace** .. raw:: html - + .. rst-class:: ansible-option-type-line :ansible-option-type:`string` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -423,8 +319,13 @@ Parameters
- Hostname or FQDN + namespace that IP address is associated with. IPs are unique per namespaces. + + + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`"Global"` .. raw:: html @@ -470,17 +371,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-prefix: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-parent: .. rst-class:: ansible-option-title - **prefix** + **parent** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -497,13 +398,8 @@ Parameters
- With state \ :literal:`present`\ , if an interface is given, it will ensure - that an IP inside this prefix (and vrf, if given) is attached - to this interface. Otherwise, it will get the next available IP - of this prefix and attach it. - With state \ :literal:`new`\ , it will force to get the next available IP in - this prefix. If an interface is given, it will also force to attach - it. + With state \ :literal:`new`\ , it will force to get the next available IP in + this prefix. Required if state is \ :literal:`present`\ or \ :literal:`new`\ when no address is given. Unused if an address is specified. @@ -571,7 +467,7 @@ Parameters .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`any` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -587,20 +483,6 @@ Parameters The role of the IP address - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`"Loopback"` - - :ansible-option-choices-entry:`"Secondary"` - - :ansible-option-choices-entry:`"Anycast"` - - :ansible-option-choices-entry:`"VIP"` - - :ansible-option-choices-entry:`"VRRP"` - - :ansible-option-choices-entry:`"HSRP"` - - :ansible-option-choices-entry:`"GLBP"` - - :ansible-option-choices-entry:`"CARP"` - - .. raw:: html
@@ -802,21 +684,24 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-url: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-type: .. rst-class:: ansible-option-title - **url** + **type** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`string` + + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` + .. raw:: html @@ -826,7 +711,16 @@ Parameters
- The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) + The type of the IP address + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry:`"DHCP"` + - :ansible-option-choices-entry:`"Host"` + - :ansible-option-choices-entry:`"SLAAC"` .. raw:: html @@ -836,21 +730,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-validate_certs: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-url: .. rst-class:: ansible-option-title - **validate_certs** + **url** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`string` / :ansible-option-required:`required` .. raw:: html @@ -860,12 +754,8 @@ Parameters
- If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. - - - .. rst-class:: ansible-option-line + The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) - :ansible-option-default-bold:`Default:` :ansible-option-default:`true` .. raw:: html @@ -874,25 +764,22 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-vrf: + .. _ansible_collections.networktocode.nautobot.ip_address_module__parameter-validate_certs: .. rst-class:: ansible-option-title - **vrf** + **validate_certs** .. raw:: html - + .. rst-class:: ansible-option-type-line :ansible-option-type:`any` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - .. raw:: html
@@ -901,8 +788,12 @@ Parameters
- VRF that IP address is associated with + If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. + + + .. rst-class:: ansible-option-line + :ansible-option-default-bold:`Default:` :ansible-option-default:`true` .. raw:: html @@ -951,11 +842,18 @@ Examples token: thisIsMyToken address: 192.168.1.10 state: new + - name: Create the same IP under another namespace + networktocode.nautobot.ip_address: + url: http://nautobot.local + token: thisIsMyToken + address: 192.168.1.10 + namespace: MyNewNamespace + state: new - name: Get a new available IP inside 192.168.1.0/24 networktocode.nautobot.ip_address: url: http://nautobot.local token: thisIsMyToken - prefix: 192.168.1.0/24 + parent: 192.168.1.0/24 state: new - name: Delete IP address within nautobot networktocode.nautobot.ip_address: @@ -963,14 +861,14 @@ Examples token: thisIsMyToken address: 192.168.1.10 state: absent - - name: Create IP address with several specified options + - name: Create IP address with several specified options in namespace Private networktocode.nautobot.ip_address: url: http://nautobot.local token: thisIsMyToken address: 192.168.1.20 - vrf: Test tenant: Test Tenant status: Reserved + namespace: Private role: Loopback description: Test description tags: @@ -981,33 +879,8 @@ Examples url: http://nautobot.local token: thisIsMyToken address: 192.168.1.30 - vrf: Test nat_inside: address: 192.168.1.20 - vrf: Test - assigned_object: - name: GigabitEthernet1 - device: test100 - - name: Ensure that an IP inside 192.168.1.0/24 is attached to GigabitEthernet1 - networktocode.nautobot.ip_address: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.1.0/24 - vrf: Test - assigned_object: - name: GigabitEthernet1 - device: test100 - state: present - - name: Attach a new available IP of 192.168.1.0/24 to GigabitEthernet1 - networktocode.nautobot.ip_address: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.1.0/24 - vrf: Test - assigned_object: - name: GigabitEthernet1 - device: test100 - state: new diff --git a/docs/plugins/region_module.rst b/docs/plugins/ip_address_to_interface_module.rst similarity index 71% rename from docs/plugins/region_module.rst rename to docs/plugins/ip_address_to_interface_module.rst index c41480d7..fa141e00 100644 --- a/docs/plugins/region_module.rst +++ b/docs/plugins/ip_address_to_interface_module.rst @@ -26,7 +26,7 @@ .. Anchors -.. _ansible_collections.networktocode.nautobot.region_module: +.. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module: .. Anchors: short name for ansible.builtin @@ -36,25 +36,25 @@ .. Title -networktocode.nautobot.region module -- Creates or removes regions from Nautobot -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +networktocode.nautobot.ip_address_to_interface module -- Creates or removes IP address to interface association from Nautobot ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, - see :ref:`Requirements ` for details. + see :ref:`Requirements ` for details. - To use it in a playbook, specify: :code:`networktocode.nautobot.region`. + To use it in a playbook, specify: :code:`networktocode.nautobot.ip_address_to_interface`. .. version_added .. rst-class:: ansible-version-added -New in networktocode.nautobot 1.0.0 +New in networktocode.nautobot 5.0.0 .. contents:: :local: @@ -68,7 +68,7 @@ Synopsis .. Description -- Creates or removes regions from Nautobot +- Creates or removes IP address to interface association from Nautobot .. Aliases @@ -76,7 +76,7 @@ Synopsis .. Requirements -.. _ansible_collections.networktocode.nautobot.region_module_requirements: +.. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module_requirements: Requirements ------------ @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -110,7 +109,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-api_version: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-api_version: .. rst-class:: ansible-option-title @@ -145,23 +144,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-interface: .. rst-class:: ansible-option-title - **name** + **interface** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`any` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -172,7 +171,7 @@ Parameters
- Name of the region to be created + Device interface to associate with an IP. .. raw:: html @@ -182,23 +181,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-parent_region: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-ip_address: .. rst-class:: ansible-option-title - **parent_region** + **ip_address** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`any` / :ansible-option-required:`required` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -209,7 +208,7 @@ Parameters
- The parent region this region should be tied to + IP address to associate with an interface. .. raw:: html @@ -221,7 +220,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-query_params: .. rst-class:: ansible-option-title @@ -260,25 +259,22 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-slug: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-state: .. rst-class:: ansible-option-title - **slug** + **state** .. raw:: html - + .. rst-class:: ansible-option-type-line :ansible-option-type:`string` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - .. raw:: html
@@ -287,9 +283,15 @@ Parameters
- The slugified version of the name or custom slug. + Use \ :literal:`present`\ or \ :literal:`absent`\ for adding, or removing. + - This is auto-generated following Nautobot rules if not provided + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry:`"absent"` + - :ansible-option-choices-entry-default:`"present"` :ansible-option-choices-default-mark:`← (default)` .. raw:: html @@ -299,21 +301,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-state: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-token: .. rst-class:: ansible-option-title - **state** + **token** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`string` / :ansible-option-required:`required` .. raw:: html @@ -323,15 +325,7 @@ Parameters
- Use \ :literal:`present`\ or \ :literal:`absent`\ for adding or removing. - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`"absent"` - - :ansible-option-choices-entry-default:`"present"` :ansible-option-choices-default-mark:`← (default)` + The token created within Nautobot to authorize API access .. raw:: html @@ -341,17 +335,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-token: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-url: .. rst-class:: ansible-option-title - **token** + **url** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -365,7 +359,7 @@ Parameters
- The token created within Nautobot to authorize API access + The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) .. raw:: html @@ -375,21 +369,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-url: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-validate_certs: .. rst-class:: ansible-option-title - **url** + **validate_certs** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`any` .. raw:: html @@ -399,8 +393,12 @@ Parameters
- The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) + If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. + + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`true` .. raw:: html @@ -409,22 +407,25 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__parameter-validate_certs: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__parameter-vm_interface: .. rst-class:: ansible-option-title - **validate_certs** + **vm_interface** .. raw:: html - + .. rst-class:: ansible-option-type-line :ansible-option-type:`any` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` + + .. raw:: html
@@ -433,12 +434,8 @@ Parameters
- If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. - - - .. rst-class:: ansible-option-line + VM interface to associate with an IP. - :ansible-option-default-bold:`Default:` :ansible-option-default:`true` .. raw:: html @@ -468,24 +465,35 @@ Examples .. code-block:: yaml+jinja - - name: "Test Nautobot region module" + - name: "Test Nautobot IP address to interface module" connection: local hosts: localhost gather_facts: False + tasks: - - name: Create tenant within Nautobot with only required information - networktocode.nautobot.region: - url: http://nautobot.local - token: thisIsMyToken - name: "Test Region One" - state: present - - - name: Delete tenant within nautobot - networktocode.nautobot.region: - url: http://nautobot.local - token: thisIsMyToken - name: Tenant Group ABC + - name: "Add IP address on GigabitEthernet4 - test100" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address['key'] }}" + interface: + name: GigabitEthernet4 + device: test100 + vars: + ip_address: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=10.100.0.1/32') }}" + + - name: "Delete IP address on GigabitEthernet4 - test100" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address['key'] }}" + interface: + name: GigabitEthernet4 + device: test100 state: absent + vars: + ip_address: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=10.100.0.1/32') }}" + @@ -512,21 +520,21 @@ Common return values are documented :ref:`here `, the foll * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__return-msg: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__return-ip_address_to_interface: .. rst-class:: ansible-option-title - **msg** + **ip_address_to_interface** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`dictionary` .. raw:: html @@ -536,12 +544,12 @@ Common return values are documented :ref:`here `, the foll
- Message indicating failure or info about what has been achieved + Serialized object as created or already existent within Nautobot .. rst-class:: ansible-option-line - :ansible-option-returned-bold:`Returned:` always + :ansible-option-returned-bold:`Returned:` on creation .. raw:: html @@ -552,21 +560,21 @@ Common return values are documented :ref:`here `, the foll * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.region_module__return-region: + .. _ansible_collections.networktocode.nautobot.ip_address_to_interface_module__return-msg: .. rst-class:: ansible-option-title - **region** + **msg** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`dictionary` + :ansible-option-type:`string` .. raw:: html @@ -576,12 +584,12 @@ Common return values are documented :ref:`here `, the foll
- Serialized object as created or already existent within Nautobot + Message indicating failure or info about what has been achieved .. rst-class:: ansible-option-line - :ansible-option-returned-bold:`Returned:` on creation + :ansible-option-returned-bold:`Returned:` always .. raw:: html @@ -599,6 +607,7 @@ Authors ~~~~~~~ - Mikhail Yohman (@FragmentedPacket) +- Anthony Ruhier (@Anthony25) diff --git a/docs/plugins/ipam_role_module.rst b/docs/plugins/ipam_role_module.rst deleted file mode 100644 index 3bfc143d..00000000 --- a/docs/plugins/ipam_role_module.rst +++ /dev/null @@ -1,618 +0,0 @@ - -.. Document meta - -:orphan: - -.. |antsibull-internal-nbsp| unicode:: 0xA0 - :trim: - -.. role:: ansible-attribute-support-label -.. role:: ansible-attribute-support-property -.. role:: ansible-attribute-support-full -.. role:: ansible-attribute-support-partial -.. role:: ansible-attribute-support-none -.. role:: ansible-attribute-support-na -.. role:: ansible-option-type -.. role:: ansible-option-elements -.. role:: ansible-option-required -.. role:: ansible-option-versionadded -.. role:: ansible-option-aliases -.. role:: ansible-option-choices -.. role:: ansible-option-choices-default-mark -.. role:: ansible-option-default-bold -.. role:: ansible-option-configuration -.. role:: ansible-option-returned-bold -.. role:: ansible-option-sample-bold - -.. Anchors - -.. _ansible_collections.networktocode.nautobot.ipam_role_module: - -.. Anchors: short name for ansible.builtin - -.. Anchors: aliases - - - -.. Title - -networktocode.nautobot.ipam_role module -- Creates or removes ipam roles from Nautobot -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. Collection note - -.. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). - - To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. - You need further requirements to be able to use this module, - see :ref:`Requirements ` for details. - - To use it in a playbook, specify: :code:`networktocode.nautobot.ipam_role`. - -.. version_added - -.. rst-class:: ansible-version-added - -New in networktocode.nautobot 1.0.0 - -.. contents:: - :local: - :depth: 1 - -.. Deprecated - - -Synopsis --------- - -.. Description - -- Creates or removes ipam roles from Nautobot - - -.. Aliases - - -.. Requirements - -.. _ansible_collections.networktocode.nautobot.ipam_role_module_requirements: - -Requirements ------------- -The below requirements are needed on the host that executes this module. - -- pynautobot - - - - - - -.. Options - -Parameters ----------- - - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Parameter - - Comments - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-api_version: - - .. rst-class:: ansible-option-title - - **api_version** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 4.1.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - API Version Nautobot REST API - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-name: - - .. rst-class:: ansible-option-title - - **name** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Name of the ipam role to be created - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-query_params: - - .. rst-class:: ansible-option-title - - **query_params** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-state: - - .. rst-class:: ansible-option-title - - **state** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Use \ :literal:`present`\ or \ :literal:`absent`\ for adding or removing. - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`"absent"` - - :ansible-option-choices-entry-default:`"present"` :ansible-option-choices-default-mark:`← (default)` - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-token: - - .. rst-class:: ansible-option-title - - **token** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The token created within Nautobot to authorize API access - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-url: - - .. rst-class:: ansible-option-title - - **url** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-validate_certs: - - .. rst-class:: ansible-option-title - - **validate_certs** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - .. raw:: html - -
- - - .. raw:: html - -
- - If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. - - - .. rst-class:: ansible-option-line - - :ansible-option-default-bold:`Default:` :ansible-option-default:`true` - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__parameter-weight: - - .. rst-class:: ansible-option-title - - **weight** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`integer` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The weight of the ipam role to be created - - - .. raw:: html - -
- - -.. Attributes - - -.. Notes - -Notes ------ - -.. note:: - - Tags should be defined as a YAML list - - This should be ran with connection \ :literal:`local`\ and hosts \ :literal:`localhost`\ - -.. Seealso - - -.. Examples - -Examples --------- - -.. code-block:: yaml+jinja - - - - name: "Test Nautobot module" - connection: local - hosts: localhost - gather_facts: False - tasks: - - name: Create ipam role within Nautobot with only required information - networktocode.nautobot.ipam_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test IPAM Role - state: present - - - name: Delete ipam role within nautobot - networktocode.nautobot.ipam_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test IPAM Role - state: absent - - - - -.. Facts - - -.. Return values - -Return Values -------------- -Common return values are documented :ref:`here `, the following are the fields unique to this module: - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Key - - Description - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__return-msg: - - .. rst-class:: ansible-option-title - - **msg** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Message indicating failure or info about what has been achieved - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` always - - - .. raw:: html - -
- - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.ipam_role_module__return-role: - - .. rst-class:: ansible-option-title - - **role** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`dictionary` - - .. raw:: html - -
- - - .. raw:: html - -
- - Serialized object as created or already existent within Nautobot - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` on creation - - - .. raw:: html - -
- - - -.. Status (Presently only deprecated) - - -.. Authors - -Authors -~~~~~~~ - -- Mikhail Yohman (@FragmentedPacket) - - - -.. Extra links - -Collection links -~~~~~~~~~~~~~~~~ - -.. raw:: html - - - -.. Parsing errors - diff --git a/docs/plugins/location_module.rst b/docs/plugins/location_module.rst index 5254fc66..d1436159 100644 --- a/docs/plugins/location_module.rst +++ b/docs/plugins/location_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.location module -- Creates or removes locations from Naut .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -216,21 +215,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.location_module__parameter-location_type: + .. _ansible_collections.networktocode.nautobot.location_module__parameter-id: .. rst-class:: ansible-option-title - **location_type** + **id** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`string` .. raw:: html @@ -240,43 +239,11 @@ Parameters
- The type of location - - Required if \ :emphasis:`state=present`\ and does not exist yet - + Primary Key of the location, used to delete the location. - .. raw:: html - -
+ Because of hierarchical nature of locations and name being not unique across locations, - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.location_module__parameter-name: - - .. rst-class:: ansible-option-title - - **name** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - Name of the location to be created + it's a user responsibility to query location and pass its id(PK) to the task to delete the location. .. raw:: html @@ -286,17 +253,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.location_module__parameter-parent: + .. _ansible_collections.networktocode.nautobot.location_module__parameter-location_type: .. rst-class:: ansible-option-title - **parent** + **location_type** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -310,7 +277,9 @@ Parameters
- The parent location this location should be tied to + The type of location + + Required if \ :emphasis:`state=present`\ and does not exist yet .. raw:: html @@ -320,24 +289,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.location_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.location_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - + :ansible-option-type:`string` .. raw:: html @@ -347,11 +313,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + Name of the location to be created .. raw:: html @@ -361,17 +323,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.location_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.location_module__parameter-parent_location: .. rst-class:: ansible-option-title - **site** + **parent_location** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -385,7 +347,7 @@ Parameters
- The site this location should be tied to + The parent location this location should be tied to .. raw:: html @@ -395,21 +357,24 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.location_module__parameter-slug: + .. _ansible_collections.networktocode.nautobot.location_module__parameter-query_params: .. rst-class:: ansible-option-title - **slug** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + + :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + .. raw:: html @@ -419,7 +384,11 @@ Parameters
- URL-friendly unique shorthand + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make + + an object unique in their environment. .. raw:: html @@ -644,7 +613,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: My Location - status: active + status: Active location_type: name: My Location Type state: present @@ -653,22 +622,22 @@ Examples networktocode.nautobot.location: url: http://nautobot.local token: thisIsMyToken - name: My Location + id: "{{ location_to_delete['key'] }}" state: absent + vars: + location_to_delete: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\" parent_location=\"Location Parent\" location_type=\"Main Type\"') }}" - name: Create location with all parameters networktocode.nautobot.location: url: http://nautobot.local token: thisIsMyToken name: My Nested Location - status: active + status: Active location_type: name: My Location Type description: My Nested Location Description - parent: + parent_location: name: My Location - site: - name: My Site state: present diff --git a/docs/plugins/location_type_module.rst b/docs/plugins/location_type_module.rst index 1a49357f..7bb6ff5c 100644 --- a/docs/plugins/location_type_module.rst +++ b/docs/plugins/location_type_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.location_type module -- Creates or removes location types .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -398,40 +397,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.location_type_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - URL-friendly unique shorthand - - .. raw:: html
diff --git a/docs/plugins/lookup_graphql_lookup.rst b/docs/plugins/lookup_graphql_lookup.rst index f1353651..a2c3c046 100644 --- a/docs/plugins/lookup_graphql_lookup.rst +++ b/docs/plugins/lookup_graphql_lookup.rst @@ -42,7 +42,7 @@ networktocode.nautobot.lookup_graphql lookup -- Queries and returns elements fro .. Collection note .. note:: - This lookup plugin is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This lookup plugin is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this lookup plugin, @@ -91,9 +91,11 @@ The below requirements are needed on the local controller node that executes thi .. Options -Parameters ----------- +Keyword parameters +------------------ +This describes keyword parameters of the lookup. These are the values ``key1=value1``, ``key2=value2`` and so on in the following +examples: ``lookup('networktocode.nautobot.lookup_graphql', key1=value1, key2=value2, ...)`` and ``query('networktocode.nautobot.lookup_graphql', key1=value1, key2=value2, ...)`` .. rst-class:: ansible-option-table @@ -258,7 +260,7 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_TOKEN + - Environment variable: :envvar:`NAUTOBOT\_TOKEN` .. raw:: html @@ -302,7 +304,7 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_URL + - Environment variable: :envvar:`NAUTOBOT\_URL` .. raw:: html @@ -373,17 +375,17 @@ Examples set_fact: query_string: | query { - sites { + locations { id name - region { + parent { name } } } # Make query to GraphQL Endpoint - - name: Obtain list of sites from Nautobot + - name: Obtain list of locations from Nautobot set_fact: query_response: "{{ query('networktocode.nautobot.lookup_graphql', query=query_string, url='https://nautobot.example.com', token='') }}" @@ -391,13 +393,13 @@ Examples - name: SET FACTS TO SEND TO GRAPHQL ENDPOINT set_fact: graph_variables: - site_name: DEN + location_name: DEN query_string: | - query ($site_name:String!) { - sites (name: $site_name) { + query ($location_name:String!) { + locations (name: $location_name) { id name - region { + parent { name } } diff --git a/docs/plugins/lookup_lookup.rst b/docs/plugins/lookup_lookup.rst index 9ece553e..634946ee 100644 --- a/docs/plugins/lookup_lookup.rst +++ b/docs/plugins/lookup_lookup.rst @@ -42,7 +42,7 @@ networktocode.nautobot.lookup lookup -- Queries and returns elements from Nautob .. Collection note .. note:: - This lookup plugin is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This lookup plugin is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this lookup plugin, @@ -145,9 +145,11 @@ Terms .. Options -Parameters ----------- +Keyword parameters +------------------ +This describes keyword parameters of the lookup. These are the values ``key1=value1``, ``key2=value2`` and so on in the following +examples: ``lookup('networktocode.nautobot.lookup', key1=value1, key2=value2, ...)`` and ``query('networktocode.nautobot.lookup', key1=value1, key2=value2, ...)`` .. rst-class:: ansible-option-table @@ -196,7 +198,7 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_URL + - Environment variable: :envvar:`NAUTOBOT\_URL` .. raw:: html @@ -393,7 +395,7 @@ Parameters :ansible-option-configuration:`Configuration:` - - Environment variable: NAUTOBOT\_TOKEN + - Environment variable: :envvar:`NAUTOBOT\_TOKEN` .. raw:: html @@ -447,6 +449,12 @@ Parameters .. Notes +Notes +----- + +.. note:: + - When keyword and positional parameters are used together, positional parameters must be listed before keyword parameters: + ``lookup('networktocode.nautobot.lookup', term1, term2, key1=value1, key2=value2)`` and ``query('networktocode.nautobot.lookup', term1, term2, key1=value1, key2=value2)`` .. Seealso diff --git a/docs/plugins/manufacturer_module.rst b/docs/plugins/manufacturer_module.rst index 7e1181cb..7f46cc0d 100644 --- a/docs/plugins/manufacturer_module.rst +++ b/docs/plugins/manufacturer_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.manufacturer module -- Create or delete manufacturers wit .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -253,45 +252,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.manufacturer_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - - .. raw:: html
diff --git a/docs/plugins/nautobot_server_module.rst b/docs/plugins/nautobot_server_module.rst index 10a6bf00..0654b821 100644 --- a/docs/plugins/nautobot_server_module.rst +++ b/docs/plugins/nautobot_server_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.nautobot_server module -- Manages Nautobot Server applica .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -95,7 +95,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -138,6 +137,10 @@ Parameters + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`{}` + .. raw:: html
@@ -278,6 +281,10 @@ Parameters A list of flags to append to the command that is passed to \ :literal:`nautobot-server`\ , so that ["flag1", "flag2"] is translated to "--flag1 --flag2". + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`[]` + .. raw:: html
@@ -314,6 +321,10 @@ Parameters These are appended to the end of the command, so that ["arg1", "arg2"] is translated to "arg1 arg2". + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`[]` + .. raw:: html
diff --git a/docs/plugins/platform_module.rst b/docs/plugins/platform_module.rst index 3480a9ce..525da460 100644 --- a/docs/plugins/platform_module.rst +++ b/docs/plugins/platform_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.platform module -- Create or delete platforms within Naut .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -364,45 +363,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.platform_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - - .. raw:: html
diff --git a/docs/plugins/plugin_module.rst b/docs/plugins/plugin_module.rst index f7985648..6d85afd4 100644 --- a/docs/plugins/plugin_module.rst +++ b/docs/plugins/plugin_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.plugin module -- CRUD operation on plugin objects .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -252,7 +251,7 @@ Parameters
- Plugin object identifier(s) like name, slug, etc. + Plugin object identifier(s) like name, model, etc. .. raw:: html diff --git a/docs/plugins/power_feed_module.rst b/docs/plugins/power_feed_module.rst index 876e9480..899f435e 100644 --- a/docs/plugins/power_feed_module.rst +++ b/docs/plugins/power_feed_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.power_feed module -- Create, update or delete power feeds .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/power_outlet_module.rst b/docs/plugins/power_outlet_module.rst index 65e6ae56..15437abe 100644 --- a/docs/plugins/power_outlet_module.rst +++ b/docs/plugins/power_outlet_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.power_outlet module -- Create, update or delete power out .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/power_outlet_template_module.rst b/docs/plugins/power_outlet_template_module.rst index 55240586..65a5c1fd 100644 --- a/docs/plugins/power_outlet_template_module.rst +++ b/docs/plugins/power_outlet_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.power_outlet_template module -- Create, update or delete .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/power_panel_module.rst b/docs/plugins/power_panel_module.rst index f92ef9ad..cb34ea44 100644 --- a/docs/plugins/power_panel_module.rst +++ b/docs/plugins/power_panel_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.power_panel module -- Create, update or delete power pane .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -145,21 +144,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-location: .. rst-class:: ansible-option-title - **name** + **location** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`any` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -172,7 +171,7 @@ Parameters
- The name of the power panel + The location the power panel is located in .. raw:: html @@ -182,21 +181,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -209,11 +208,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the power panel .. raw:: html @@ -223,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-rack_group: + .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-query_params: .. rst-class:: ansible-option-title - **rack_group** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -250,7 +245,11 @@ Parameters
- The rack group the power panel is assigned to + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make + + an object unique in their environment. .. raw:: html @@ -260,21 +259,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.power_panel_module__parameter-rack_group: .. rst-class:: ansible-option-title - **site** + **rack_group** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` / :ansible-option-required:`required` + :ansible-option-type:`any` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -287,7 +286,7 @@ Parameters
- The site the power panel is located in + The rack group the power panel is assigned to .. raw:: html @@ -477,7 +476,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Test Power Panel - site: Test Site + location: Test location state: present - name: Update power panel with other fields @@ -485,7 +484,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Test Power Panel - site: Test Site + location: Test location rack_group: Test Rack Group state: present @@ -494,7 +493,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Test Power Panel - site: Test Site + location: Test location state: absent diff --git a/docs/plugins/power_port_module.rst b/docs/plugins/power_port_module.rst index 2da52aae..05799e83 100644 --- a/docs/plugins/power_port_module.rst +++ b/docs/plugins/power_port_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.power_port module -- Create, update or delete power ports .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/power_port_template_module.rst b/docs/plugins/power_port_template_module.rst index 5c9b38e3..c62bacb6 100644 --- a/docs/plugins/power_port_template_module.rst +++ b/docs/plugins/power_port_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.power_port_template module -- Create, update or delete po .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/prefix_module.rst b/docs/plugins/prefix_module.rst index c38812dc..ff3f29a4 100644 --- a/docs/plugins/prefix_module.rst +++ b/docs/plugins/prefix_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.prefix module -- Creates or removes prefixes from Nautobo .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -219,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-family: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-first_available: .. rst-class:: ansible-option-title - **family** + **first_available** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`integer` + :ansible-option-type:`boolean` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -246,7 +245,15 @@ Parameters
- Specifies which address family the prefix prefix belongs to + If \ :literal:`yes`\ and state \ :literal:`present`\ , if an parent is given, it will get the first available prefix of the given prefix\_length inside the given parent (and namespace, if given). Unused with state \ :literal:`absent`\ . + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry-default:`false` :ansible-option-choices-default-mark:`← (default)` + - :ansible-option-choices-entry:`true` .. raw:: html @@ -256,23 +263,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-first_available: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-ip_version: .. rst-class:: ansible-option-title - **first_available** + **ip_version** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`boolean` + :ansible-option-type:`integer` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -283,15 +290,7 @@ Parameters
- If \ :literal:`yes`\ and state \ :literal:`present`\ , if an parent is given, it will get the first available prefix of the given prefix\_length inside the given parent (and vrf, if given). Unused with state \ :literal:`absent`\ . - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry-default:`false` :ansible-option-choices-default-mark:`← (default)` - - :ansible-option-choices-entry:`true` + Specifies which address version the prefix prefix belongs to .. raw:: html @@ -301,21 +300,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-is_pool: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-location: .. rst-class:: ansible-option-title - **is_pool** + **location** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`boolean` + :ansible-option-type:`any` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -328,15 +327,7 @@ Parameters
- All IP Addresses within this prefix are considered usable - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`false` - - :ansible-option-choices-entry:`true` + Location that prefix is associated with .. raw:: html @@ -346,23 +337,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-parent: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-namespace: .. rst-class:: ansible-option-title - **parent** + **namespace** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`string` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -373,9 +364,14 @@ Parameters
- Required if state is \ :literal:`present`\ and first\_available is \ :literal:`yes`\ . Will get a new available prefix in this parent prefix. + namespace that IP address is associated with. IPs are unique per namespaces. + + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`"Global"` + .. raw:: html
@@ -383,17 +379,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-prefix: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-parent: .. rst-class:: ansible-option-title - **prefix** + **parent** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -410,7 +406,7 @@ Parameters
- Required if state is \ :literal:`present`\ and first\_available is False. Will allocate or free this prefix. + Required if state is \ :literal:`present`\ and first\_available is \ :literal:`yes`\ . Will get a new available prefix in this parent prefix. .. raw:: html @@ -420,21 +416,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-prefix_length: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-prefix: .. rst-class:: ansible-option-title - **prefix_length** + **prefix** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`integer` + :ansible-option-type:`any` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -447,9 +443,7 @@ Parameters
- Required ONLY if state is \ :literal:`present`\ and first\_available is \ :literal:`yes`\ . - Will get a new available prefix of the given prefix\_length in this parent prefix. - + Required if state is \ :literal:`present`\ and first\_available is False. Will allocate or free this prefix. .. raw:: html @@ -459,21 +453,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-prefix_role: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-prefix_length: .. rst-class:: ansible-option-title - **prefix_role** + **prefix_length** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`integer` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -486,7 +480,9 @@ Parameters
- The role of the prefix + Required ONLY if state is \ :literal:`present`\ and first\_available is \ :literal:`yes`\ . + Will get a new available prefix of the given prefix\_length in this parent prefix. + .. raw:: html @@ -537,17 +533,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-role: .. rst-class:: ansible-option-title - **site** + **role** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -564,7 +560,7 @@ Parameters
- Site that prefix is associated with + The role of the prefix .. raw:: html @@ -763,21 +759,24 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-url: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-type: .. rst-class:: ansible-option-title - **url** + **type** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`string` + + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` + .. raw:: html @@ -787,7 +786,16 @@ Parameters
- The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) + Prefix type + + + .. rst-class:: ansible-option-line + + :ansible-option-choices:`Choices:` + + - :ansible-option-choices-entry:`"Container"` + - :ansible-option-choices-entry:`"Network"` + - :ansible-option-choices-entry:`"Pool"` .. raw:: html @@ -797,21 +805,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-validate_certs: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-url: .. rst-class:: ansible-option-title - **validate_certs** + **url** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`string` / :ansible-option-required:`required` .. raw:: html @@ -821,12 +829,8 @@ Parameters
- If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. - - - .. rst-class:: ansible-option-line + The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) - :ansible-option-default-bold:`Default:` :ansible-option-default:`true` .. raw:: html @@ -835,25 +839,22 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-vlan: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-validate_certs: .. rst-class:: ansible-option-title - **vlan** + **validate_certs** .. raw:: html - + .. rst-class:: ansible-option-type-line :ansible-option-type:`any` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - .. raw:: html
@@ -862,9 +863,13 @@ Parameters
- The VLAN the prefix will be assigned to + If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`true` + .. raw:: html
@@ -872,17 +877,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-vrf: + .. _ansible_collections.networktocode.nautobot.prefix_module__parameter-vlan: .. rst-class:: ansible-option-title - **vrf** + **vlan** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -899,7 +904,7 @@ Parameters
- VRF that prefix is associated with + The VLAN the prefix will be assigned to .. raw:: html @@ -957,18 +962,17 @@ Examples token: thisIsMyToken family: 4 prefix: 10.156.32.0/19 - site: Test Site - vrf: Test VRF + location: Test Location tenant: Test Tenant vlan: name: Test VLAN - site: Test Site + location: Test Location tenant: Test Tenant vlan_group: Test Vlan Group status: Reserved - prefix_role: Network of care + role: Network of care description: Test description - is_pool: true + type: Pool tags: - Schnozzberry state: present @@ -1004,8 +1008,7 @@ Examples token: thisIsMyToken parent: 10.157.0.0/19 prefix_length: 24 - vrf: Test VRF - site: Test Site + location: Test Location state: present first_available: yes diff --git a/docs/plugins/provider_module.rst b/docs/plugins/provider_module.rst index 9a8eeb84..259b0ca4 100644 --- a/docs/plugins/provider_module.rst +++ b/docs/plugins/provider_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.provider module -- Create, update or delete providers wit .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/query_graphql_module.rst b/docs/plugins/query_graphql_module.rst index b5e2d71d..dac023fe 100644 --- a/docs/plugins/query_graphql_module.rst +++ b/docs/plugins/query_graphql_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.query_graphql module -- Queries and returns elements from .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -96,7 +96,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -171,6 +170,10 @@ Parameters Dictionary of keys/values to pass into the GraphQL query, see (\ https://pynautobot.readthedocs.io/en/latest/advanced/graphql.html\ ) for more info + .. rst-class:: ansible-option-line + + :ansible-option-default-bold:`Default:` :ansible-option-default:`{}` + .. raw:: html
@@ -384,17 +387,17 @@ Examples set_fact: query_string: | query { - sites { + locations { id name - region { + parent { name } } } # Make query to GraphQL Endpoint - - name: Obtain list of sites from Nautobot + - name: Obtain list of locations from Nautobot networktocode.nautobot.query_graphql: url: http://nautobot.local token: thisIsMyToken @@ -405,20 +408,20 @@ Examples - name: SET FACTS TO SEND TO GRAPHQL ENDPOINT set_fact: graph_variables: - site_name: AMS01 + $location_name: AMS01 query_string: | - query ($site_name: String!) { - sites (slug: $site_name) { + query ($location_name: String!) { + locations (name: $location_name) { id name - region { + parent { name } } } # Get Response with variables and set to root keys - - name: Obtain list of devices at site in variables from Nautobot + - name: Obtain list of devices at location in variables from Nautobot networktocode.nautobot.query_graphql: url: http://nautobot.local token: thisIsMyToken diff --git a/docs/plugins/rack_group_module.rst b/docs/plugins/rack_group_module.rst index 58b0988f..dd1f8967 100644 --- a/docs/plugins/rack_group_module.rst +++ b/docs/plugins/rack_group_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.rack_group module -- Create, update or delete racks group .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -182,54 +181,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-location: .. rst-class:: ansible-option-title - **name** + **location** .. raw:: html - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The name of the rack group - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-parent_rack_group: - - .. rst-class:: ansible-option-title - - **parent_rack_group** - - .. raw:: html - - + .. rst-class:: ansible-option-type-line @@ -246,7 +208,7 @@ Parameters
- The parent rack-group the rack group will be assigned to + Required if \ :emphasis:`state=present`\ and the rack does not exist yet .. raw:: html @@ -256,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -283,11 +245,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the rack group .. raw:: html @@ -297,17 +255,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-region: + .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-parent_rack_group: .. rst-class:: ansible-option-title - **region** + **parent_rack_group** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -324,7 +282,7 @@ Parameters
- The region the rack group will be assigned to + The parent rack-group the rack group will be assigned to .. raw:: html @@ -334,21 +292,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-query_params: .. rst-class:: ansible-option-title - **site** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -361,46 +319,11 @@ Parameters
- Required if \ :emphasis:`state=present`\ and the rack does not exist yet - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_group_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
+ This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - The slugified version of the name or custom slug. + in plugins/module\_utils/utils.py and provides control to users on what may make - This is auto-generated following Nautobot rules if not provided + an object unique in their environment. .. raw:: html @@ -590,7 +513,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Test rack group - site: Test Site + location: Test Location state: present - name: Delete rack group within nautobot @@ -598,7 +521,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Test Rack group - site: Test Site + location: Test Location state: absent diff --git a/docs/plugins/rack_module.rst b/docs/plugins/rack_module.rst index 40c63831..86c0bda9 100644 --- a/docs/plugins/rack_module.rst +++ b/docs/plugins/rack_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.rack module -- Create, update or delete racks within Naut .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -331,6 +330,43 @@ Parameters The unique rack ID assigned by the facility. + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.rack_module__parameter-location: + + .. rst-class:: ansible-option-title + + **location** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`any` + + :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + Required if \ :emphasis:`state=present`\ and the rack does not exist yet. + + .. raw:: html
@@ -572,17 +608,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.rack_module__parameter-rack_role: + .. _ansible_collections.networktocode.nautobot.rack_module__parameter-role: .. rst-class:: ansible-option-title - **rack_role** + **role** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -639,43 +675,6 @@ Parameters Serial number of the rack. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_module__parameter-site: - - .. rst-class:: ansible-option-title - - **site** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Required if \ :emphasis:`state=present`\ and the rack does not exist yet. - - .. raw:: html
@@ -1109,7 +1108,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Test rack - site: Test Site + location: Test Location status: active state: present diff --git a/docs/plugins/rack_role_module.rst b/docs/plugins/rack_role_module.rst deleted file mode 100644 index c7c6be94..00000000 --- a/docs/plugins/rack_role_module.rst +++ /dev/null @@ -1,620 +0,0 @@ - -.. Document meta - -:orphan: - -.. |antsibull-internal-nbsp| unicode:: 0xA0 - :trim: - -.. role:: ansible-attribute-support-label -.. role:: ansible-attribute-support-property -.. role:: ansible-attribute-support-full -.. role:: ansible-attribute-support-partial -.. role:: ansible-attribute-support-none -.. role:: ansible-attribute-support-na -.. role:: ansible-option-type -.. role:: ansible-option-elements -.. role:: ansible-option-required -.. role:: ansible-option-versionadded -.. role:: ansible-option-aliases -.. role:: ansible-option-choices -.. role:: ansible-option-choices-default-mark -.. role:: ansible-option-default-bold -.. role:: ansible-option-configuration -.. role:: ansible-option-returned-bold -.. role:: ansible-option-sample-bold - -.. Anchors - -.. _ansible_collections.networktocode.nautobot.rack_role_module: - -.. Anchors: short name for ansible.builtin - -.. Anchors: aliases - - - -.. Title - -networktocode.nautobot.rack_role module -- Create, update or delete racks roles within Nautobot -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. Collection note - -.. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). - - To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. - You need further requirements to be able to use this module, - see :ref:`Requirements ` for details. - - To use it in a playbook, specify: :code:`networktocode.nautobot.rack_role`. - -.. version_added - -.. rst-class:: ansible-version-added - -New in networktocode.nautobot 1.0.0 - -.. contents:: - :local: - :depth: 1 - -.. Deprecated - - -Synopsis --------- - -.. Description - -- Creates, updates or removes racks roles from Nautobot - - -.. Aliases - - -.. Requirements - -.. _ansible_collections.networktocode.nautobot.rack_role_module_requirements: - -Requirements ------------- -The below requirements are needed on the host that executes this module. - -- pynautobot - - - - - - -.. Options - -Parameters ----------- - - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Parameter - - Comments - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-api_version: - - .. rst-class:: ansible-option-title - - **api_version** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 4.1.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - API Version Nautobot REST API - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-color: - - .. rst-class:: ansible-option-title - - **color** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Hexidecimal code for a color, ex. FFFFFF - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-name: - - .. rst-class:: ansible-option-title - - **name** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The name of the rack role - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-query_params: - - .. rst-class:: ansible-option-title - - **query_params** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-state: - - .. rst-class:: ansible-option-title - - **state** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Use \ :literal:`present`\ or \ :literal:`absent`\ for adding or removing. - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`"absent"` - - :ansible-option-choices-entry-default:`"present"` :ansible-option-choices-default-mark:`← (default)` - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-token: - - .. rst-class:: ansible-option-title - - **token** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The token created within Nautobot to authorize API access - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-url: - - .. rst-class:: ansible-option-title - - **url** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__parameter-validate_certs: - - .. rst-class:: ansible-option-title - - **validate_certs** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - .. raw:: html - -
- - - .. raw:: html - -
- - If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. - - - .. rst-class:: ansible-option-line - - :ansible-option-default-bold:`Default:` :ansible-option-default:`true` - - .. raw:: html - -
- - -.. Attributes - - -.. Notes - -Notes ------ - -.. note:: - - Tags should be defined as a YAML list - - This should be ran with connection \ :literal:`local`\ and hosts \ :literal:`localhost`\ - -.. Seealso - - -.. Examples - -Examples --------- - -.. code-block:: yaml+jinja - - - - name: "Test Nautobot modules" - connection: local - hosts: localhost - gather_facts: False - - tasks: - - name: Create rack role within Nautobot with only required information - networktocode.nautobot.rack_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test rack role - color: FFFFFF - state: present - - - name: Delete rack role within nautobot - networktocode.nautobot.rack_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test Rack role - state: absent - - - - -.. Facts - - -.. Return values - -Return Values -------------- -Common return values are documented :ref:`here `, the following are the fields unique to this module: - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Key - - Description - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__return-msg: - - .. rst-class:: ansible-option-title - - **msg** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Message indicating failure or info about what has been achieved - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` always - - - .. raw:: html - -
- - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rack_role_module__return-rack_role: - - .. rst-class:: ansible-option-title - - **rack_role** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`dictionary` - - .. raw:: html - -
- - - .. raw:: html - -
- - Serialized object as created or already existent within Nautobot - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` success (when \ :emphasis:`state=present`\ ) - - - .. raw:: html - -
- - - -.. Status (Presently only deprecated) - - -.. Authors - -Authors -~~~~~~~ - -- Mikhail Yohman (@FragmentedPacket) - - - -.. Extra links - -Collection links -~~~~~~~~~~~~~~~~ - -.. raw:: html - - - -.. Parsing errors - diff --git a/docs/plugins/rear_port_module.rst b/docs/plugins/rear_port_module.rst index f9681150..ad14a2b6 100644 --- a/docs/plugins/rear_port_module.rst +++ b/docs/plugins/rear_port_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.rear_port module -- Create, update or delete rear ports w .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/rear_port_template_module.rst b/docs/plugins/rear_port_template_module.rst index 81a6bd5a..8791873d 100644 --- a/docs/plugins/rear_port_template_module.rst +++ b/docs/plugins/rear_port_template_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.rear_port_template module -- Create, update or delete rea .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/relationship_association_module.rst b/docs/plugins/relationship_association_module.rst index e96ad529..9c4b01aa 100644 --- a/docs/plugins/relationship_association_module.rst +++ b/docs/plugins/relationship_association_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.relationship_association module -- Creates or removes a r .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/rir_module.rst b/docs/plugins/rir_module.rst index b699eb0d..f1eeffcf 100644 --- a/docs/plugins/rir_module.rst +++ b/docs/plugins/rir_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.rir module -- Create, update or delete RIRs within Nautob .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -261,45 +260,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.rir_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - - .. raw:: html
diff --git a/docs/plugins/device_role_module.rst b/docs/plugins/role_module.rst similarity index 79% rename from docs/plugins/device_role_module.rst rename to docs/plugins/role_module.rst index 42659d4e..33a82b5e 100644 --- a/docs/plugins/device_role_module.rst +++ b/docs/plugins/role_module.rst @@ -26,7 +26,7 @@ .. Anchors -.. _ansible_collections.networktocode.nautobot.device_role_module: +.. _ansible_collections.networktocode.nautobot.role_module: .. Anchors: short name for ansible.builtin @@ -36,25 +36,25 @@ .. Title -networktocode.nautobot.device_role module -- Create, update or delete devices roles within Nautobot -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +networktocode.nautobot.role module -- Create, update or delete roles within Nautobot +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, - see :ref:`Requirements ` for details. + see :ref:`Requirements ` for details. - To use it in a playbook, specify: :code:`networktocode.nautobot.device_role`. + To use it in a playbook, specify: :code:`networktocode.nautobot.role`. .. version_added .. rst-class:: ansible-version-added -New in networktocode.nautobot 1.0.0 +New in networktocode.nautobot 5.0.0 .. contents:: :local: @@ -68,7 +68,7 @@ Synopsis .. Description -- Creates, updates or removes devices roles from Nautobot +- Creates, updates or removes roles from Nautobot .. Aliases @@ -76,7 +76,7 @@ Synopsis .. Requirements -.. _ansible_collections.networktocode.nautobot.device_role_module_requirements: +.. _ansible_collections.networktocode.nautobot.role_module_requirements: Requirements ------------ @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -110,7 +109,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-api_version: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-api_version: .. rst-class:: ansible-option-title @@ -147,7 +146,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-color: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-color: .. rst-class:: ansible-option-title @@ -161,7 +160,7 @@ Parameters :ansible-option-type:`string` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -182,23 +181,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-description: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-content_types: .. rst-class:: ansible-option-title - **description** + **content_types** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -209,7 +208,7 @@ Parameters
- The description of the device role + Model names which the role can be related to. .. raw:: html @@ -219,23 +218,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-description: .. rst-class:: ansible-option-title - **name** + **description** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`string` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -246,7 +245,7 @@ Parameters
- The name of the device role + The description of the role .. raw:: html @@ -256,23 +255,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -283,11 +282,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the role .. raw:: html @@ -297,21 +292,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-slug: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-query_params: .. rst-class:: ansible-option-title - **slug** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -324,9 +319,11 @@ Parameters
- The slugified version of the name or custom slug. + This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined + + in plugins/module\_utils/utils.py and provides control to users on what may make - This is auto-generated following Nautobot rules if not provided + an object unique in their environment. .. raw:: html @@ -338,7 +335,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-state: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-state: .. rst-class:: ansible-option-title @@ -380,7 +377,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-token: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-token: .. rst-class:: ansible-option-title @@ -414,7 +411,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-url: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-url: .. rst-class:: ansible-option-title @@ -448,7 +445,7 @@ Parameters
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-validate_certs: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-validate_certs: .. rst-class:: ansible-option-title @@ -484,23 +481,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_role_module__parameter-vm_role: + .. _ansible_collections.networktocode.nautobot.role_module__parameter-weight: .. rst-class:: ansible-option-title - **vm_role** + **weight** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`boolean` + :ansible-option-type:`integer` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -511,15 +508,7 @@ Parameters
- Whether the role is a VM role - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`false` - - :ansible-option-choices-entry:`true` + Weight assigned to the role. .. raw:: html @@ -556,19 +545,21 @@ Examples gather_facts: False tasks: - - name: Create device role within Nautobot with only required information - networktocode.nautobot.device_role: + - name: Create role within Nautobot with only required information + networktocode.nautobot.role: url: http://nautobot.local token: thisIsMyToken - name: Test device role + name: Test role color: FFFFFF + content_types: + - "dcim.device" state: present - - name: Delete device role within nautobot - networktocode.nautobot.device_role: + - name: Delete role within nautobot + networktocode.nautobot.role: url: http://nautobot.local token: thisIsMyToken - name: Test Rack role + name: Test role state: absent @@ -596,21 +587,21 @@ Common return values are documented :ref:`here `, the foll * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_role_module__return-device_role: + .. _ansible_collections.networktocode.nautobot.role_module__return-msg: .. rst-class:: ansible-option-title - **device_role** + **msg** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`dictionary` + :ansible-option-type:`string` .. raw:: html @@ -620,12 +611,12 @@ Common return values are documented :ref:`here `, the foll
- Serialized object as created or already existent within Nautobot + Message indicating failure or info about what has been achieved .. rst-class:: ansible-option-line - :ansible-option-returned-bold:`Returned:` success (when \ :emphasis:`state=present`\ ) + :ansible-option-returned-bold:`Returned:` always .. raw:: html @@ -636,21 +627,21 @@ Common return values are documented :ref:`here `, the foll * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.device_role_module__return-msg: + .. _ansible_collections.networktocode.nautobot.role_module__return-role: .. rst-class:: ansible-option-title - **msg** + **role** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`dictionary` .. raw:: html @@ -660,12 +651,12 @@ Common return values are documented :ref:`here `, the foll
- Message indicating failure or info about what has been achieved + Serialized object as created or already existent within Nautobot .. rst-class:: ansible-option-line - :ansible-option-returned-bold:`Returned:` always + :ansible-option-returned-bold:`Returned:` success (when \ :emphasis:`state=present`\ ) .. raw:: html diff --git a/docs/plugins/route_target_module.rst b/docs/plugins/route_target_module.rst index a30d20f5..4913c3e1 100644 --- a/docs/plugins/route_target_module.rst +++ b/docs/plugins/route_target_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.route_target module -- Creates or removes route targets f .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/service_module.rst b/docs/plugins/service_module.rst index 72f9ae6b..473c50f6 100644 --- a/docs/plugins/service_module.rst +++ b/docs/plugins/service_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.service module -- Creates or removes service from Nautobo .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -256,17 +255,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.service_module__parameter-ipaddresses: + .. _ansible_collections.networktocode.nautobot.service_module__parameter-ip_addresses: .. rst-class:: ansible-option-title - **ipaddresses** + **ip_addresses** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -703,7 +702,7 @@ Examples ports: - 9100 protocol: TCP - ipaddresses: + ip_addresses: - address: 127.0.0.1 tags: - prometheus diff --git a/docs/plugins/site_module.rst b/docs/plugins/site_module.rst deleted file mode 100644 index 5652c794..00000000 --- a/docs/plugins/site_module.rst +++ /dev/null @@ -1,1231 +0,0 @@ - -.. Document meta - -:orphan: - -.. |antsibull-internal-nbsp| unicode:: 0xA0 - :trim: - -.. role:: ansible-attribute-support-label -.. role:: ansible-attribute-support-property -.. role:: ansible-attribute-support-full -.. role:: ansible-attribute-support-partial -.. role:: ansible-attribute-support-none -.. role:: ansible-attribute-support-na -.. role:: ansible-option-type -.. role:: ansible-option-elements -.. role:: ansible-option-required -.. role:: ansible-option-versionadded -.. role:: ansible-option-aliases -.. role:: ansible-option-choices -.. role:: ansible-option-choices-default-mark -.. role:: ansible-option-default-bold -.. role:: ansible-option-configuration -.. role:: ansible-option-returned-bold -.. role:: ansible-option-sample-bold - -.. Anchors - -.. _ansible_collections.networktocode.nautobot.site_module: - -.. Anchors: short name for ansible.builtin - -.. Anchors: aliases - - - -.. Title - -networktocode.nautobot.site module -- Creates or removes sites from Nautobot -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. Collection note - -.. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). - - To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. - You need further requirements to be able to use this module, - see :ref:`Requirements ` for details. - - To use it in a playbook, specify: :code:`networktocode.nautobot.site`. - -.. version_added - -.. rst-class:: ansible-version-added - -New in networktocode.nautobot 1.0.0 - -.. contents:: - :local: - :depth: 1 - -.. Deprecated - - -Synopsis --------- - -.. Description - -- Creates or removes sites from Nautobot - - -.. Aliases - - -.. Requirements - -.. _ansible_collections.networktocode.nautobot.site_module_requirements: - -Requirements ------------- -The below requirements are needed on the host that executes this module. - -- pynautobot - - - - - - -.. Options - -Parameters ----------- - - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Parameter - - Comments - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-api_version: - - .. rst-class:: ansible-option-title - - **api_version** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 4.1.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - API Version Nautobot REST API - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-asn: - - .. rst-class:: ansible-option-title - - **asn** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`integer` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The ASN associated with the site - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-comments: - - .. rst-class:: ansible-option-title - - **comments** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Comments for the site. This can be markdown syntax - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-contact_email: - - .. rst-class:: ansible-option-title - - **contact_email** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Contact email for site - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-contact_name: - - .. rst-class:: ansible-option-title - - **contact_name** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Name of contact for site - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-contact_phone: - - .. rst-class:: ansible-option-title - - **contact_phone** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Contact phone number for site - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-custom_fields: - - .. rst-class:: ansible-option-title - - **custom_fields** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`dictionary` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Must exist in Nautobot and in key/value format - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-description: - - .. rst-class:: ansible-option-title - - **description** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The description of the prefix - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-facility: - - .. rst-class:: ansible-option-title - - **facility** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Data center provider or facility, ex. Equinix NY7 - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-latitude: - - .. rst-class:: ansible-option-title - - **latitude** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Latitude in decimal format - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-longitude: - - .. rst-class:: ansible-option-title - - **longitude** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Longitude in decimal format - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-name: - - .. rst-class:: ansible-option-title - - **name** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - Name of the site to be created - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-physical_address: - - .. rst-class:: ansible-option-title - - **physical_address** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Physical address of site - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-query_params: - - .. rst-class:: ansible-option-title - - **query_params** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-region: - - .. rst-class:: ansible-option-title - - **region** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The region that the site should be associated with - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-shipping_address: - - .. rst-class:: ansible-option-title - - **shipping_address** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Shipping address of site - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - URL-friendly unique shorthand - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-state: - - .. rst-class:: ansible-option-title - - **state** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Use \ :literal:`present`\ or \ :literal:`absent`\ for adding or removing. - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`"absent"` - - :ansible-option-choices-entry-default:`"present"` :ansible-option-choices-default-mark:`← (default)` - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-status: - - .. rst-class:: ansible-option-title - - **status** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Status of the site - - Required if \ :emphasis:`state=present`\ and does not exist yet - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-tags: - - .. rst-class:: ansible-option-title - - **tags** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`list` / :ansible-option-elements:`elements=any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Any tags that this item may need to be associated with - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-tenant: - - .. rst-class:: ansible-option-title - - **tenant** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The tenant the site will be assigned to - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-time_zone: - - .. rst-class:: ansible-option-title - - **time_zone** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - Timezone associated with the site, ex. America/Denver - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-token: - - .. rst-class:: ansible-option-title - - **token** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The token created within Nautobot to authorize API access - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-url: - - .. rst-class:: ansible-option-title - - **url** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` / :ansible-option-required:`required` - - .. raw:: html - -
- - - .. raw:: html - -
- - The URL of the Nautobot instance resolvable by the Ansible host (for example: http://nautobot.example.com:8000) - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__parameter-validate_certs: - - .. rst-class:: ansible-option-title - - **validate_certs** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - .. raw:: html - -
- - - .. raw:: html - -
- - If \ :literal:`no`\ , SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates. - - - .. rst-class:: ansible-option-line - - :ansible-option-default-bold:`Default:` :ansible-option-default:`true` - - .. raw:: html - -
- - -.. Attributes - - -.. Notes - -Notes ------ - -.. note:: - - Tags should be defined as a YAML list - - This should be ran with connection \ :literal:`local`\ and hosts \ :literal:`localhost`\ - -.. Seealso - - -.. Examples - -Examples --------- - -.. code-block:: yaml+jinja - - - - name: "Test Nautobot site module" - connection: local - hosts: localhost - gather_facts: False - tasks: - - name: Create site within Nautobot with only required information - networktocode.nautobot.site: - url: http://nautobot.local - token: thisIsMyToken - name: Test - Colorado - status: active - state: present - - - name: Delete site within nautobot - networktocode.nautobot.site: - url: http://nautobot.local - token: thisIsMyToken - name: Test - Colorado - state: absent - - - name: Create site with all parameters - networktocode.nautobot.site: - url: http://nautobot.local - token: thisIsMyToken - name: Test - California - status: Planned - region: Test Region - tenant: Test Tenant - facility: EquinoxCA7 - asn: 65001 - time_zone: America/Los Angeles - description: This is a test description - physical_address: Hollywood, CA, 90210 - shipping_address: Hollywood, CA, 90210 - latitude: 10.100000 - longitude: 12.200000 - contact_name: Jenny - contact_phone: 867-5309 - contact_email: jenny@changednumber.com - slug: test-california - comments: ### Placeholder - state: present - - - - -.. Facts - - -.. Return values - -Return Values -------------- -Common return values are documented :ref:`here `, the following are the fields unique to this module: - -.. rst-class:: ansible-option-table - -.. list-table:: - :width: 100% - :widths: auto - :header-rows: 1 - - * - Key - - Description - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__return-msg: - - .. rst-class:: ansible-option-title - - **msg** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - .. raw:: html - -
- - - .. raw:: html - -
- - Message indicating failure or info about what has been achieved - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` always - - - .. raw:: html - -
- - - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.site_module__return-site: - - .. rst-class:: ansible-option-title - - **site** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`dictionary` - - .. raw:: html - -
- - - .. raw:: html - -
- - Serialized object as created or already existent within Nautobot - - - .. rst-class:: ansible-option-line - - :ansible-option-returned-bold:`Returned:` on creation - - - .. raw:: html - -
- - - -.. Status (Presently only deprecated) - - -.. Authors - -Authors -~~~~~~~ - -- Mikhail Yohman (@FragmentedPacket) - - - -.. Extra links - -Collection links -~~~~~~~~~~~~~~~~ - -.. raw:: html - - - -.. Parsing errors - diff --git a/docs/plugins/status_module.rst b/docs/plugins/status_module.rst index 069215c6..28677753 100644 --- a/docs/plugins/status_module.rst +++ b/docs/plugins/status_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.status module -- Creates or removes status from Nautobot .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -329,45 +328,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.status_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - - .. raw:: html
@@ -559,7 +519,6 @@ Examples - dcim.cable - dcim.powerfeed - dcim.rack - - dcim.site - circuits.circuit - virtualization.virtualmachine - ipam.prefix diff --git a/docs/plugins/tag_module.rst b/docs/plugins/tag_module.rst index 01812f4a..4e068e18 100644 --- a/docs/plugins/tag_module.rst +++ b/docs/plugins/tag_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.tag module -- Creates or removes tags from Nautobot .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -210,7 +209,7 @@ Parameters e.g. dcim.device, ipam.ipaddress (more can be found in the examples) - Requires \ :literal:`api\_version \>= 1.3`\ + Required if \ :emphasis:`state=present`\ and the tag does not exist yet .. raw:: html @@ -328,45 +327,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.tag_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - - .. raw:: html
@@ -576,7 +536,6 @@ Examples - dcim.rack - dcim.rack reservation - dcim.rear port - - dcim.site - dcim.virtual chassis - extras.Git repository - extras.job diff --git a/docs/plugins/tenant_group_module.rst b/docs/plugins/tenant_group_module.rst index 970d85e3..ade4e730 100644 --- a/docs/plugins/tenant_group_module.rst +++ b/docs/plugins/tenant_group_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.tenant_group module -- Creates or removes tenant groups f .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -290,43 +289,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.tenant_group_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - URL-friendly unique shorthand - - .. raw:: html
@@ -513,7 +475,6 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Tenant Group ABC - slug: "tenant_group_abc" state: present - name: Delete tenant within Nautobot @@ -529,7 +490,6 @@ Examples token: thisIsMyToken name: Tenant Group ABC parent_tenant_group: Customer Tenants - slug: "tenant_group_abc" state: present diff --git a/docs/plugins/tenant_module.rst b/docs/plugins/tenant_module.rst index f4005f5a..4fc0e7f1 100644 --- a/docs/plugins/tenant_module.rst +++ b/docs/plugins/tenant_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.tenant module -- Creates or removes tenants from Nautobot .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -327,43 +326,6 @@ Parameters an object unique in their environment. - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.tenant_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - URL-friendly unique shorthand - - .. raw:: html
@@ -641,7 +603,6 @@ Examples tenant_group: Very Special Tenants description: ABC Incorporated comments: '### This tenant is super cool' - slug: tenant_abc tags: - tagA - tagB diff --git a/docs/plugins/virtual_chassis_module.rst b/docs/plugins/virtual_chassis_module.rst index 685465d3..0a2b69dc 100644 --- a/docs/plugins/virtual_chassis_module.rst +++ b/docs/plugins/virtual_chassis_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.virtual_chassis module -- Create, update or delete virtua .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: diff --git a/docs/plugins/virtual_machine_module.rst b/docs/plugins/virtual_machine_module.rst index 4c1259d2..ba608977 100644 --- a/docs/plugins/virtual_machine_module.rst +++ b/docs/plugins/virtual_machine_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.virtual_machine module -- Create, update or delete virtua .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -293,17 +292,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.virtual_machine_module__parameter-local_context_data: + .. _ansible_collections.networktocode.nautobot.virtual_machine_module__parameter-local_config_context_data: .. rst-class:: ansible-option-title - **local_context_data** + **local_config_context_data** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -556,17 +555,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.virtual_machine_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.virtual_machine_module__parameter-role: .. rst-class:: ansible-option-title - **site** + **role** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -583,7 +582,7 @@ Parameters
- The name of the site attach to the virtual machine + The role of the virtual machine .. raw:: html @@ -884,43 +883,6 @@ Parameters Number of vcpus of the virtual machine - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.virtual_machine_module__parameter-virtual_machine_role: - - .. rst-class:: ansible-option-title - - **virtual_machine_role** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The role of the virtual machine - - .. raw:: html
@@ -976,7 +938,6 @@ Examples token: thisIsMyToken name: Another Test Virtual Machine cluster: test cluster - site: Test Site status: active tags: - Schnozzberry diff --git a/docs/plugins/vlan_group_module.rst b/docs/plugins/vlan_group_module.rst index 0821a7cc..a97f0bce 100644 --- a/docs/plugins/vlan_group_module.rst +++ b/docs/plugins/vlan_group_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.vlan_group module -- Create, update or delete vlans group .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -182,23 +181,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vlan_group_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.vlan_group_module__parameter-location: .. rst-class:: ansible-option-title - **name** + **location** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`any` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -209,7 +208,7 @@ Parameters
- The name of the vlan group + The location the vlan will be assigned to .. raw:: html @@ -219,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vlan_group_module__parameter-query_params: + .. _ansible_collections.networktocode.nautobot.vlan_group_module__parameter-name: .. rst-class:: ansible-option-title - **query_params** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -246,11 +245,7 @@ Parameters
- This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - - in plugins/module\_utils/utils.py and provides control to users on what may make - - an object unique in their environment. + The name of the vlan group .. raw:: html @@ -260,21 +255,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vlan_group_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.vlan_group_module__parameter-query_params: .. rst-class:: ansible-option-title - **site** + **query_params** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`any` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -287,46 +282,11 @@ Parameters
- The site the vlan will be assigned to - - - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.vlan_group_module__parameter-slug: - - .. rst-class:: ansible-option-title - - **slug** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`string` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
+ This can be used to override the specified values in ALLOWED\_QUERY\_PARAMS that is defined - The slugified version of the name or custom slug. + in plugins/module\_utils/utils.py and provides control to users on what may make - This is auto-generated following Nautobot rules if not provided + an object unique in their environment. .. raw:: html @@ -516,7 +476,7 @@ Examples url: http://nautobot.local token: thisIsMyToken name: Test vlan group - site: Test Site + location: Test Location state: present - name: Delete vlan group within nautobot diff --git a/docs/plugins/vlan_module.rst b/docs/plugins/vlan_module.rst index d3871313..feeaaab0 100644 --- a/docs/plugins/vlan_module.rst +++ b/docs/plugins/vlan_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.vlan module -- Create, update or delete vlans within Naut .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -212,6 +211,43 @@ Parameters The description of the vlan + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.vlan_module__parameter-location: + + .. rst-class:: ansible-option-title + + **location** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`any` + + :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + The location the VLAN will be associated to + + .. raw:: html
@@ -297,17 +333,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vlan_module__parameter-site: + .. _ansible_collections.networktocode.nautobot.vlan_module__parameter-role: .. rst-class:: ansible-option-title - **site** + **role** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -324,7 +360,7 @@ Parameters
- The site the VLAN will be associated to + The role of the VLAN. .. raw:: html @@ -662,43 +698,6 @@ Parameters The VLAN group the VLAN will be associated to - .. raw:: html - -
- - * - .. raw:: html - -
-
- - .. _ansible_collections.networktocode.nautobot.vlan_module__parameter-vlan_role: - - .. rst-class:: ansible-option-title - - **vlan_role** - - .. raw:: html - - - - .. rst-class:: ansible-option-type-line - - :ansible-option-type:`any` - - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` - - - .. raw:: html - -
- - - .. raw:: html - -
- - The role of the VLAN. - - .. raw:: html
@@ -757,11 +756,11 @@ Examples token: thisIsMyToken name: Test VLAN vid: 400 - site: Test Site + location: Test Site group: Test VLAN Group tenant: Test Tenant status: Deprecated - vlan_role: Test VLAN Role + role: Test VLAN Role description: Just a test tags: - Schnozzberry diff --git a/docs/plugins/vm_interface_module.rst b/docs/plugins/vm_interface_module.rst index 0750a073..93cfd9e0 100644 --- a/docs/plugins/vm_interface_module.rst +++ b/docs/plugins/vm_interface_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.vm_interface module -- Creates or removes interfaces from .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -451,6 +450,45 @@ Parameters - :ansible-option-choices-entry-default:`"present"` :ansible-option-choices-default-mark:`← (default)` + .. raw:: html + +
+ + * - .. raw:: html + +
+
+ + .. _ansible_collections.networktocode.nautobot.vm_interface_module__parameter-status: + + .. rst-class:: ansible-option-title + + **status** + + .. raw:: html + + + + .. rst-class:: ansible-option-type-line + + :ansible-option-type:`any` + + :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + + + .. raw:: html + +
+ + - .. raw:: html + +
+ + The status of the interface. + + Required if \ :emphasis:`state=present`\ and does not exist yet + + .. raw:: html
@@ -763,12 +801,12 @@ Examples enabled: false untagged_vlan: name: Wireless - site: Test Site + location: "{{ test_location['key'] }}" tagged_vlans: - name: Data - site: Test Site + location: "{{ test_location['key'] }}" - name: VoIP - site: Test Site + location: "{{ test_location['key'] }}" mtu: 1600 mode: Tagged state: present diff --git a/docs/plugins/vrf_module.rst b/docs/plugins/vrf_module.rst index e084d64c..4dd8934e 100644 --- a/docs/plugins/vrf_module.rst +++ b/docs/plugins/vrf_module.rst @@ -42,7 +42,7 @@ networktocode.nautobot.vrf module -- Create, update or delete vrfs within Nautob .. Collection note .. note:: - This module is part of the `networktocode.nautobot collection `_ (version 4.5.0). + This module is part of the `networktocode.nautobot collection `_ (version 5.0.0). To install it, use: :code:`ansible-galaxy collection install networktocode.nautobot`. You need further requirements to be able to use this module, @@ -94,7 +94,6 @@ The below requirements are needed on the host that executes this module. Parameters ---------- - .. rst-class:: ansible-option-table .. list-table:: @@ -219,21 +218,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-enforce_unique: + .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-export_targets: .. rst-class:: ansible-option-title - **enforce_unique** + **export_targets** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`boolean` + :ansible-option-type:`list` / :ansible-option-elements:`elements=string` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -246,15 +245,7 @@ Parameters
- Prevent duplicate prefixes/IP addresses within this VRF - - - .. rst-class:: ansible-option-line - - :ansible-option-choices:`Choices:` - - - :ansible-option-choices-entry:`false` - - :ansible-option-choices-entry:`true` + Export targets tied to VRF .. raw:: html @@ -264,17 +255,17 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-export_targets: + .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-import_targets: .. rst-class:: ansible-option-title - **export_targets** + **import_targets** .. raw:: html - + .. rst-class:: ansible-option-type-line @@ -291,7 +282,7 @@ Parameters
- Export targets tied to VRF + Import targets tied to VRF .. raw:: html @@ -301,21 +292,21 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-import_targets: + .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-name: .. rst-class:: ansible-option-title - **import_targets** + **name** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`list` / :ansible-option-elements:`elements=string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -328,7 +319,7 @@ Parameters
- Import targets tied to VRF + The name of the vrf .. raw:: html @@ -338,23 +329,23 @@ Parameters * - .. raw:: html
-
+
- .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-name: + .. _ansible_collections.networktocode.nautobot.vrf_module__parameter-namespace: .. rst-class:: ansible-option-title - **name** + **namespace** .. raw:: html - + .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` / :ansible-option-required:`required` + :ansible-option-type:`string` - :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` + :ansible-option-versionadded:`added in networktocode.nautobot 5.0.0` .. raw:: html @@ -365,8 +356,12 @@ Parameters
- The name of the vrf + namespace that IP address is associated with. VRFs are unique per namespaces. + + + .. rst-class:: ansible-option-line + :ansible-option-default-bold:`Default:` :ansible-option-default:`"Global"` .. raw:: html @@ -430,7 +425,7 @@ Parameters .. rst-class:: ansible-option-type-line - :ansible-option-type:`string` + :ansible-option-type:`string` / :ansible-option-required:`required` :ansible-option-versionadded:`added in networktocode.nautobot 3.0.0` @@ -723,7 +718,6 @@ Examples name: Test VRF rd: "65000:1" tenant: Test Tenant - enforce_unique: true import_targets: - "65000:65001" export_targets: diff --git a/galaxy.yml b/galaxy.yml index 82a4d5b9..4829244a 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -9,7 +9,7 @@ namespace: networktocode name: nautobot # The version of the collection. Must be compatible with semantic versioning -version: 4.5.0 +version: 5.0.0 # The path to the Markdown (.md) readme file. This path is relative to the root of the collection readme: README.md diff --git a/hacking/local-test.sh b/hacking/local-test.sh index af7ddb6e..2c6963e1 100755 --- a/hacking/local-test.sh +++ b/hacking/local-test.sh @@ -9,5 +9,5 @@ ansible-galaxy collection install networktocode-nautobot-*.tar.gz -p . # You can now cd into the installed version and run tests -(cd ansible_collections/networktocode/nautobot/ && ansible-test units -v --python 3.8 && ansible-test sanity --requirements -v --python 3.8 --skip-test pep8 plugins/) +(cd ansible_collections/networktocode/nautobot/ && ansible-test units -v --python 3.9 && ansible-test sanity --requirements -v --python 3.9 --skip-test pep8 plugins/) rm -rf ansible_collections diff --git a/hacking/update_test_inventories.sh b/hacking/update_test_inventories.sh index 4b63c46a..9fb27f81 100755 --- a/hacking/update_test_inventories.sh +++ b/hacking/update_test_inventories.sh @@ -5,6 +5,7 @@ set -e # - Build Nautobot via development environment # - Fill with test data, run ./tests/integration/nautobot-populate.py +# - Add '127.0.0.1 nautobot' to /etc/hosts # - Run ./hacking/update_test_inventories.sh # - Manually verify the diff of new JSON is correct, to prevent introducing a regression. @@ -16,7 +17,10 @@ export OUTPUT_INVENTORY_JSON=tests/integration/targets/inventory/files rm -rf /tmp/inventory_nautobot/ # Clean and install the built collection -./hacking/local-test.sh +./hacking/build.sh + +# Install new built version +ansible-galaxy collection install networktocode-nautobot-*.tar.gz -p . # Run the same script used by integration tests, but save the results ./tests/integration/targets/inventory/runme.sh diff --git a/plugins/inventory/gql_inventory.py b/plugins/inventory/gql_inventory.py index 3fa289e5..69cf3a00 100644 --- a/plugins/inventory/gql_inventory.py +++ b/plugins/inventory/gql_inventory.py @@ -68,15 +68,20 @@ group_by: required: False description: - - List of dot-sparated paths to index graphql query results (e.g. `platform.slug`) + - List of dot-sparated paths to index graphql query results (e.g. `platform.display`) - The final value returned by each path is used to derive group names and then group the devices into these groups. - - Valid group names must be string, so indexing the dotted path should return a string (i.e. `platform.slug` instead of `platform`) + - Valid group names must be string, so indexing the dotted path should return a string (i.e. `platform.display` instead of `platform`) - > - If value returned by the defined path is a dictionary, an attempt will first be made to access the `name` field, and then the `slug` field. - (i.e. `platform` would attempt to lookup `platform.name`, and if that data was not returned, it would then try `platform.slug`) + If value returned by the defined path is a dictionary, an attempt will first be made to access the `name` field, and then the `display` field. + (i.e. `platform` would attempt to lookup `platform.name`, and if that data was not returned, it would then try `platform.display`) type: list elements: str default: [] + group_names_raw: + description: Will not add the group_by choice name to the group names + default: False + type: boolean + version_added: "4.6.0" """ EXAMPLES = """ @@ -124,11 +129,11 @@ tags: name serial: tenant: name - site: + location: name: contact_name: description: - region: name + parent: name virtual_machines: tags: name tenant: name @@ -143,19 +148,19 @@ tags: name serial: tenant: name - status: slug - site: + status: display + location: name: contact_name: description: - region: name + parent: name virtual_machines: tags: name tenant: name - status: slug + status: display group_by: - tenant.name - - status.slug + - status.display # Filter output using any supported parameters. # To get supported parameters check the api/docs page for devices. @@ -214,8 +219,8 @@ GROUP_BY = { "platform": "napalm_driver", "status": "name", - "device_role": "name", - "site": "name", + "role": "name", + "location": "id", } @@ -279,7 +284,7 @@ def create_groups(self, device): if parent_attr == "tags": if not chain or len(chain) > 1: - self.display.display(f"Tags must be grouped by name or slug. {group_by_path} is not a valid path.") + self.display.display(f"Tags must be grouped by name or display. {group_by_path} is not a valid path.") continue self.create_tag_groups(device, chain[0]) continue @@ -302,17 +307,17 @@ def create_groups(self, device): if isinstance(group_name, Mapping): if "name" in group_name: group_name = group_name["name"] - elif "slug" in group_name: - group_name = group_name["slug"] + elif "display" in group_name: + group_name = group_name["display"] else: - self.display.display(f"No slug or name value for {group_name} in {group_by_path} on device {device_name}.") + self.display.display(f"No display or name value for {group_name} in {group_by_path} on device {device_name}.") if not group_name: # If the value is empty, it can't be grouped continue if isinstance(group_name, str): - # If using force_valid_group_names=always in ansible.cfg, hyphens in Nautobot slugs will be converted to underscores + # If using force_valid_group_names=always in ansible.cfg, hyphens in Nautobot names will be converted to underscores group = self.inventory.add_group(group_name) self.inventory.add_child(group, device_name) else: @@ -325,7 +330,7 @@ def create_tag_groups(self, device, tag_attr): device_name = device["name"] for tag in device.get("tags", []): if tag.get(tag_attr): - group_name = f"tags_{tag[tag_attr]}" + group_name = f"tags_{tag[tag_attr]}" if not self.group_names_raw else tag[tag_attr] group = self.inventory.add_group(group_name) self.inventory.add_child(group, device_name) else: @@ -405,5 +410,6 @@ def parse(self, inventory, loader, path, cache=True): self.gql_query = self.get_option("query") self.group_by = self.get_option("group_by") self.follow_redirects = self.get_option("follow_redirects") + self.group_names_raw = self.get_option("group_names_raw") self.main() diff --git a/plugins/inventory/inventory.py b/plugins/inventory/inventory.py index dc921b10..08f2a969 100644 --- a/plugins/inventory/inventory.py +++ b/plugins/inventory/inventory.py @@ -48,7 +48,7 @@ description: - If True, it adds config_context in host vars. - Config-context enables the association of arbitrary data to devices and virtual machines grouped by - region, site, role, platform, and/or tenant. Please check official nautobot docs for more info. + location, role, platform, and/or tenant. Please check official nautobot docs for more info. default: False type: boolean flatten_config_context: @@ -83,7 +83,7 @@ plurals: description: - If True, all host vars are contained inside single-element arrays for legacy compatibility with old versions of this plugin. - - Group names will be plural (ie. "sites_mysite" instead of "site_mysite") + - Group names will be plural (ie. "locations_mylocation" instead of "location_mylocation") - The choices of I(group_by) will be changed by this option. default: True type: boolean @@ -116,8 +116,8 @@ type: list elements: str choices: - - sites - - site + - locations + - location - tenants - tenant - tenant_group @@ -135,7 +135,6 @@ - manufacturer - platforms - platform - - region - cluster - cluster_type - cluster_group @@ -256,7 +255,6 @@ from typing import Iterable from itertools import chain from collections import defaultdict -from ipaddress import ip_interface from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable from ansible.module_utils.ansible_release import __version__ as ansible_version @@ -377,7 +375,6 @@ def query_string(value, separator="&"): @property def group_extractors(self): - # List of group_by options and hostvars to extract # Some keys are different depending on plurals option @@ -389,12 +386,11 @@ def group_extractors(self): "config_context": self.extract_config_context, "local_context_data": self.extract_local_context_data, "custom_fields": self.extract_custom_fields, - "region": self.extract_regions, + self._pluralize_group_by("location"): self.extract_locations, "cluster": self.extract_cluster, "cluster_group": self.extract_cluster_group, "cluster_type": self.extract_cluster_type, "is_virtual": self.extract_is_virtual, - self._pluralize_group_by("site"): self.extract_site, self._pluralize_group_by("tenant"): self.extract_tenant, "tenant_group": self.extract_tenant_group, self._pluralize_group_by("rack"): self.extract_rack, @@ -420,7 +416,7 @@ def group_extractors(self): def _pluralize_group_by(self, group_by): mapping = { - "site": "sites", + "location": "locations", "tenant": "tenants", "rack": "racks", "tag": "tags", @@ -450,13 +446,13 @@ def _objects_array_following_parents(self, initial_object_id, object_lookup, obj # Keep looping until the object has no parent while object_id is not None: - object_slug = object_lookup[object_id] + object_name = object_lookup[object_id] - if object_slug in objects: + if object_name in objects: # Won't ever happen - defensively guard against infinite loop break - objects.append(object_slug) + objects.append(object_name) # Get the parent of this object object_id = object_parent_lookup[object_id] @@ -531,12 +527,6 @@ def extract_rack_role(self, host): except Exception: return - def extract_site(self, host): - try: - return self._pluralize(self.sites_lookup[host["site"]["id"]]) - except Exception: - return - def extract_tenant(self, host): try: return self._pluralize(self.tenants_lookup[host["tenant"]["id"]]) @@ -551,10 +541,7 @@ def extract_tenant_group(self, host): def extract_device_role(self, host): try: - if "device_role" in host: - return self._pluralize(self.device_roles_lookup[host["device_role"]["id"]]) - elif "role" in host: - return self._pluralize(self.device_roles_lookup[host["role"]["id"]]) + return self._pluralize(self.device_roles_lookup[host["role"]["id"]]) except Exception: return @@ -572,9 +559,9 @@ def extract_local_context_data(self, host): try: if self.flatten_local_context_data: # Don't wrap in an array if we're about to flatten it to separate host vars - return host["local_context_data"] + return host["local_config_context_data"] else: - return self._pluralize(host["local_context_data"]) + return self._pluralize(host["local_config_context_data"]) except Exception: return @@ -585,23 +572,22 @@ def extract_manufacturer(self, host): return def extract_primary_ip(self, host): - try: - address = host["primary_ip"]["address"] - return str(ip_interface(address).ip) - except Exception: - return + address_v4 = self.extract_primary_ip4(host) + address_v6 = self.extract_primary_ip6(host) + if address_v4: + return address_v4 + elif address_v6: + return address_v6 def extract_primary_ip4(self, host): try: - address = host["primary_ip4"]["address"] - return str(ip_interface(address).ip) + return host["primary_ip4"] except Exception: return def extract_primary_ip6(self, host): try: - address = host["primary_ip6"]["address"] - return str(ip_interface(address).ip) + return host["primary_ip6"] except Exception: return @@ -609,9 +595,9 @@ def extract_tags(self, host): try: tag_zero = host["tags"][0] # Check the type of the first element in the "tags" array. - # If a dictionary (Nautobot >= 2.9), return an array of tags' slugs. + # If a dictionary (Nautobot >= 2.9), return an array of tags' names. if isinstance(tag_zero, dict): - return list(sub["slug"] for sub in host["tags"]) + return list(sub["name"] for sub in host["tags"]) # If a string (Nautobot <= 2.8), return the original "tags" array. elif isinstance(tag_zero, str): return host["tags"] @@ -621,7 +607,6 @@ def extract_tags(self, host): def extract_interfaces(self, host): try: - interfaces_lookup = self.vm_interfaces_lookup if host["is_virtual"] else self.device_interfaces_lookup interfaces = list(interfaces_lookup[host["id"]].values()) @@ -648,32 +633,43 @@ def extract_custom_fields(self, host): except Exception: return - def extract_regions(self, host): - # A host may have a site. A site may have a region. A region may have a parent region. - # Produce a list of regions: - # - it will be empty if the device has no site, or the site has no region set - # - it will have 1 element if the site's region has no parent - # - it will have multiple elements if the site's region has a parent region + def _extract_location_from_host(self, host): + if host.get("object_type") == "virtualization.virtualmachine": + return host.get("cluster", {}).get("location") + else: + return host.get("location", None) + + def extract_location(self, host): + location = self._extract_location_from_host(host) + if isinstance(location, dict): + return self.locations_lookup.get(location["id"]) + + def extract_locations(self, host): + # A host may have a location. A location may have a parent location. + # Produce a list of locations: + # - it will be empty if the device has no location + # - it will have 1 element if the location has no parent + # - it will have multiple elements if the location has a parent location + + location = self._extract_location_from_host(host) - site = host.get("site", None) - if not isinstance(site, dict): - # Device has no site + if not isinstance(location, dict): + # Device has no location return [] - site_id = site.get("id", None) - if site_id is None: - # Device has no site + location_id = location.get("id", None) + if location_id is None: + # Location doesn't exist return [] return self._objects_array_following_parents( - initial_object_id=self.sites_region_lookup[site_id], - object_lookup=self.regions_lookup, - object_parent_lookup=self.regions_parent_lookup, + initial_object_id=location_id, + object_lookup=self.locations_lookup, + object_parent_lookup=self.locations_parent_lookup, ) def extract_cluster(self, host): try: - # cluster does not have a slug return host["cluster"]["name"] except Exception: return @@ -694,18 +690,12 @@ def extract_is_virtual(self, host): return host.get("is_virtual") def extract_dns_name(self, host): + primary_ip = self.extract_primary_ip(host) # No primary IP assigned - if not host.get("primary_ip"): + if not primary_ip: return None - before_v29 = bool(self.ipaddresses_lookup) - if before_v29: - ip_address = self.ipaddresses_lookup.get(host["primary_ip"]["id"]) - else: - if host["is_virtual"]: - ip_address = self.vm_ipaddresses_lookup.get(host["primary_ip"]["id"]) - else: - ip_address = self.device_ipaddresses_lookup.get(host["primary_ip"]["id"]) + ip_address = self.ipaddresses_lookup.get(primary_ip["id"]) # Don"t assign a host_var for empty dns_name if ip_address.get("dns_name") == "": @@ -716,65 +706,50 @@ def extract_dns_name(self, host): def refresh_platforms_lookup(self): url = self.api_endpoint + "/api/dcim/platforms/?limit=0" platforms = self.get_resource_list(api_url=url) - self.platforms_lookup = dict((platform["id"], platform["slug"]) for platform in platforms) - - def refresh_sites_lookup(self): - url = self.api_endpoint + "/api/dcim/sites/?limit=0" - sites = self.get_resource_list(api_url=url) - self.sites_lookup = dict((site["id"], site["slug"]) for site in sites) - - def get_region_for_site(site): - # Will fail if site does not have a region defined in Nautobot - try: - return (site["id"], site["region"]["id"]) - except Exception: - return (site["id"], None) + self.platforms_lookup = dict((platform["id"], platform["network_driver"]) for platform in platforms) - # Dictionary of site id to region id - self.sites_region_lookup = dict(map(get_region_for_site, sites)) + def refresh_locations_lookup(self): + url = self.api_endpoint + "/api/dcim/locations/?limit=0" + locations = self.get_resource_list(api_url=url) + self.locations_lookup = dict((location["id"], location["name"]) for location in locations) - def refresh_regions_lookup(self): - url = self.api_endpoint + "/api/dcim/regions/?limit=0" - regions = self.get_resource_list(api_url=url) - self.regions_lookup = dict((region["id"], region["slug"]) for region in regions) - - def get_region_parent(region): - # Will fail if region does not have a parent region + def get_location_parent(location): + # Will fail if location does not have a parent location try: - return (region["id"], region["parent"]["id"]) + return (location["id"], location["parent"]["id"]) except Exception: - return (region["id"], None) + return (location["id"], None) - # Dictionary of region id to parent region id - self.regions_parent_lookup = dict(filter(lambda x: x is not None, map(get_region_parent, regions))) + # Dictionary of location id to parent location id + self.locations_parent_lookup = dict(filter(lambda x: x is not None, map(get_location_parent, locations))) def refresh_tenants_lookup(self): - url = self.api_endpoint + "/api/tenancy/tenants/?limit=0" + url = self.api_endpoint + "/api/tenancy/tenants/?limit=0&depth=1" tenants = self.get_resource_list(api_url=url) - self.tenants_lookup = dict((tenant["id"], tenant["slug"]) for tenant in tenants) + self.tenants_lookup = dict((tenant["id"], tenant["name"]) for tenant in tenants) def get_group_for_tenant(tenant): try: - return (tenant["id"], tenant["group"]["slug"]) + return (tenant["id"], tenant["tenant_group"]["name"]) except Exception: return (tenant["id"], None) self.tenant_group_lookup = dict(map(get_group_for_tenant, tenants)) def refresh_racks_lookup(self): - url = self.api_endpoint + "/api/dcim/racks/?limit=0" + url = self.api_endpoint + "/api/dcim/racks/?limit=0&depth=1" racks = self.get_resource_list(api_url=url) self.racks_lookup = dict((rack["id"], rack["name"]) for rack in racks) def get_group_for_rack(rack): try: - return (rack["id"], rack["group"]["id"]) + return (rack["id"], rack["rack_group"]["id"]) except Exception: return (rack["id"], None) def get_role_for_rack(rack): try: - return (rack["id"], rack["role"]["slug"]) + return (rack["id"], rack["role"]["name"]) except Exception: return (rack["id"], None) @@ -782,9 +757,9 @@ def get_role_for_rack(rack): self.racks_role_lookup = dict(map(get_role_for_rack, racks)) def refresh_rack_groups_lookup(self): - url = self.api_endpoint + "/api/dcim/rack-groups/?limit=0" + url = self.api_endpoint + "/api/dcim/rack-groups/?limit=0&depth=1" rack_groups = self.get_resource_list(api_url=url) - self.rack_groups_lookup = dict((rack_group["id"], rack_group["slug"]) for rack_group in rack_groups) + self.rack_groups_lookup = dict((rack_group["id"], rack_group["name"]) for rack_group in rack_groups) def get_rack_group_parent(rack_group): try: @@ -796,35 +771,35 @@ def get_rack_group_parent(rack_group): self.rack_group_parent_lookup = dict(map(get_rack_group_parent, rack_groups)) def refresh_device_roles_lookup(self): - url = self.api_endpoint + "/api/dcim/device-roles/?limit=0" - device_roles = self.get_resource_list(api_url=url) - self.device_roles_lookup = dict((device_role["id"], device_role["slug"]) for device_role in device_roles) + url = self.api_endpoint + "/api/extras/roles/?limit=0" + roles = self.get_resource_list(api_url=url) + self.device_roles_lookup = dict((role["id"], role["name"]) for role in roles if "dcim.device" in role["content_types"]) def refresh_device_types_lookup(self): url = self.api_endpoint + "/api/dcim/device-types/?limit=0" device_types = self.get_resource_list(api_url=url) - self.device_types_lookup = dict((device_type["id"], device_type["slug"]) for device_type in device_types) + self.device_types_lookup = dict((device_type["id"], device_type["model"]) for device_type in device_types) def refresh_manufacturers_lookup(self): url = self.api_endpoint + "/api/dcim/manufacturers/?limit=0" manufacturers = self.get_resource_list(api_url=url) - self.manufacturers_lookup = dict((manufacturer["id"], manufacturer["slug"]) for manufacturer in manufacturers) + self.manufacturers_lookup = dict((manufacturer["id"], manufacturer["name"]) for manufacturer in manufacturers) def refresh_clusters_lookup(self): - url = self.api_endpoint + "/api/virtualization/clusters/?limit=0" + url = self.api_endpoint + "/api/virtualization/clusters/?limit=0&depth=1" clusters = self.get_resource_list(api_url=url) def get_cluster_type(cluster): # Will fail if cluster does not have a type (required property so should always be true) try: - return (cluster["id"], cluster["type"]["slug"]) + return (cluster["id"], cluster["cluster_type"]["name"]) except Exception: return (cluster["id"], None) def get_cluster_group(cluster): # Will fail if cluster does not have a group (group is optional) try: - return (cluster["id"], cluster["group"]["slug"]) + return (cluster["id"], cluster["cluster_group"]["name"]) except Exception: return (cluster["id"], None) @@ -832,7 +807,7 @@ def get_cluster_group(cluster): self.clusters_group_lookup = dict(map(get_cluster_group, clusters)) def refresh_services(self): - url = self.api_endpoint + "/api/ipam/services/?limit=0" + url = self.api_endpoint + "/api/ipam/services/?limit=0&depth=1" services = [] if self.fetch_all: @@ -840,12 +815,12 @@ def refresh_services(self): else: device_services = self.get_resource_list_chunked( api_url=url, - query_key="device_id", + query_key="device", query_values=self.devices_lookup.keys(), ) vm_services = self.get_resource_list_chunked( api_url=url, - query_key="virtual_machine_id", + query_key="virtual_machine", query_values=self.vms_lookup.keys(), ) services = chain(device_services, vm_services) @@ -865,9 +840,8 @@ def refresh_services(self): self.vm_services_lookup[service["virtual_machine"]["id"]][service_id] = service def refresh_interfaces(self): - - url_device_interfaces = self.api_endpoint + "/api/dcim/interfaces/?limit=0" - url_vm_interfaces = self.api_endpoint + "/api/virtualization/interfaces/?limit=0" + url_device_interfaces = self.api_endpoint + "/api/dcim/interfaces/?limit=0&depth=1" + url_vm_interfaces = self.api_endpoint + "/api/virtualization/interfaces/?limit=0&depth=1" device_interfaces = [] vm_interfaces = [] @@ -893,7 +867,7 @@ def refresh_interfaces(self): self.device_interfaces_lookup = defaultdict(dict) self.vm_interfaces_lookup = defaultdict(dict) - # /dcim/interfaces gives count_ipaddresses per interface. /virtualization/interfaces does not + # /dcim/interfaces gives ip_address_count per interface. /virtualization/interfaces does not self.devices_with_ips = set() for interface in device_interfaces: @@ -914,7 +888,7 @@ def refresh_interfaces(self): self.device_interfaces_lookup[device_id][interface_id] = interface # Keep track of what devices have interfaces with IPs, so if fetch_all is False we can avoid unnecessary queries - if interface["count_ipaddresses"] > 0: + if interface["ip_address_count"] > 0: self.devices_with_ips.add(device_id) for interface in vm_interfaces: @@ -925,7 +899,8 @@ def refresh_interfaces(self): # Note: depends on the result of refresh_interfaces for self.devices_with_ips def refresh_ipaddresses(self): - url = self.api_endpoint + "/api/ipam/ip-addresses/?limit=0&assigned_to_interface=true" + # setting depth=2 to fetch information about namespaces under parent prefixes. + url = self.api_endpoint + "/api/ipam/ip-addresses/?limit=0&depth=2&has_interface_assignments=true" ipaddresses = [] if self.fetch_all: @@ -956,45 +931,30 @@ def refresh_ipaddresses(self): self.device_ipaddresses_lookup = defaultdict(dict) for ipaddress in ipaddresses: - # As of Nautobot v2.9 "assigned_object_x" replaces "interface" - if ipaddress.get("assigned_object_id"): - interface_id = ipaddress["assigned_object_id"] - ip_id = ipaddress["id"] - # We need to copy the ipaddress entry to preserve the original in case caching is used. - ipaddress_copy = ipaddress.copy() - - if ipaddress["assigned_object_type"] == "virtualization.vminterface": - self.vm_ipaddresses_lookup[ip_id] = ipaddress_copy - self.vm_ipaddresses_intf_lookup[interface_id][ip_id] = ipaddress_copy - else: - self.device_ipaddresses_lookup[ip_id] = ipaddress_copy - self.device_ipaddresses_intf_lookup[interface_id][ - ip_id - ] = ipaddress_copy # Remove "assigned_object_X" attributes, as that's redundant when ipaddress is added to an interface - - del ipaddress_copy["assigned_object_id"] - del ipaddress_copy["assigned_object_type"] - del ipaddress_copy["assigned_object"] - continue - - if not ipaddress.get("interface"): - continue - interface_id = ipaddress["interface"]["id"] - ip_id = ipaddress["id"] - # We need to copy the ipaddress entry to preserve the original in case caching is used. ipaddress_copy = ipaddress.copy() - - self.ipaddresses_intf_lookup[interface_id][ip_id] = ipaddress_copy - self.ipaddresses_lookup[ip_id] = ipaddress_copy + ip_id = ipaddress["id"] + for interface in ipaddress["interfaces"]: + interface_id = interface["id"] + self.device_ipaddresses_lookup[ip_id] = ipaddress_copy + self.device_ipaddresses_intf_lookup[interface_id][ip_id] = ipaddress_copy + self.ipaddresses_intf_lookup[interface_id][ip_id] = ipaddress_copy + self.ipaddresses_lookup[ip_id] = ipaddress_copy + + for interface in ipaddress["vm_interfaces"]: + interface_id = interface["id"] + self.vm_ipaddresses_lookup[ip_id] = ipaddress_copy + self.vm_ipaddresses_intf_lookup[interface_id][ip_id] = ipaddress_copy + self.ipaddresses_intf_lookup[interface_id][ip_id] = ipaddress_copy + self.ipaddresses_lookup[ip_id] = ipaddress_copy # Remove "interface" attribute, as that's redundant when ipaddress is added to an interface - del ipaddress_copy["interface"] + del ipaddress_copy["interfaces"] + del ipaddress_copy["vm_interfaces"] @property def lookup_processes(self): lookups = [ - self.refresh_sites_lookup, - self.refresh_regions_lookup, + self.refresh_locations_lookup, self.refresh_tenants_lookup, self.refresh_racks_lookup, self.refresh_rack_groups_lookup, @@ -1024,7 +984,6 @@ def lookup_processes_secondary(self): return lookups def refresh_lookups(self, lookups): - # Exceptions that occur in threads by default are printed to stderr, and ignored by the main thread # They need to be caught, and raised in the main thread to prevent further execution of this plugin @@ -1104,8 +1063,8 @@ def filter_query_parameters(self, parameters, allowed_query_parameters): ) def refresh_url(self): - device_query_parameters = [("limit", 0)] - vm_query_parameters = [("limit", 0)] + device_query_parameters = [("limit", 0), ("depth", 1)] + vm_query_parameters = [("limit", 0), ("depth", 1)] device_url = self.api_endpoint + "/api/dcim/devices/?" vm_url = self.api_endpoint + "/api/virtualization/virtual-machines/?" @@ -1139,12 +1098,12 @@ def refresh_url(self): if vm_url: vm_url = vm_url + urlencode(vm_query_parameters) - # Exclude config_context if not required - if not self.config_context: + # Include config_context if required + if self.config_context: if device_url: - device_url = device_url + "&exclude=config_context" + device_url = f"{device_url}&include=config_context" if vm_url: - vm_url = vm_url + "&exclude=config_context" + vm_url = f"{vm_url}&include=config_context" return device_url, vm_url @@ -1181,8 +1140,12 @@ def extract_name(self, host): else: return host["name"] or str(uuid.uuid4()) - def generate_group_name(self, grouping, group): + @staticmethod + def _remove_invalid_group_chars(group): + # Removes spaces and hyphens which Ansible doesn't like and converts to lowercase. + return group.replace("-", "_").replace(" ", "_").lower() + def generate_group_name(self, grouping, group): # Check for special case - if group is a boolean, just return grouping name instead # eg. "is_virtual" - returns true for VMs, should put them in a group named "is_virtual", not "is_virtual_True" if isinstance(group, bool): @@ -1198,31 +1161,13 @@ def generate_group_name(self, grouping, group): grouping = "service" if grouping == "status": - group = group["value"] + group = group["display"] - if self.group_names_raw: - return group - else: - return "_".join([grouping, group]) + group = self._remove_invalid_group_chars(group) + return group if self.group_names_raw else "_".join([grouping, group]) def add_host_to_groups(self, host, hostname): - - # If we're grouping by regions, hosts are not added to region groups - # - the site groups are added as sub-groups of regions - # So, we need to make sure we're also grouping by sites if regions are enabled - - if "region" in self.group_by: - # Make sure "site" or "sites" grouping also exists, depending on plurals options - site_group_by = self._pluralize_group_by("site") - if site_group_by not in self.group_by: - self.group_by.append(site_group_by) - for grouping in self.group_by: - - # Don't handle regions here - that will happen in main() - if grouping == "region": - continue - if grouping not in self.group_extractors: raise AnsibleError( 'group_by option "%s" is not valid. (Maybe check the plurals option? It can determine what group_by options are valid)' % grouping @@ -1248,44 +1193,27 @@ def add_host_to_groups(self, host, hostname): transformed_group_name = self.inventory.add_group(group=group_name) self.inventory.add_host(group=transformed_group_name, host=hostname) - def _add_region_groups(self): - - # Mapping of region id to group name - region_transformed_group_names = dict() - - # Create groups for each region - for region_id in self.regions_lookup: - region_group_name = self.generate_group_name("region", self.regions_lookup[region_id]) - region_transformed_group_names[region_id] = self.inventory.add_group(group=region_group_name) + def _add_location_groups(self): + # Mapping of location id to group name + location_transformed_group_names = dict() - # Now that all region groups exist, add relationships between them - for region_id in self.regions_lookup: - region_group_name = region_transformed_group_names[region_id] - parent_region_id = self.regions_parent_lookup.get(region_id, None) - if parent_region_id is not None and parent_region_id in region_transformed_group_names: - parent_region_name = region_transformed_group_names[parent_region_id] - self.inventory.add_child(parent_region_name, region_group_name) + # Create groups for each location + for location_id in self.locations_lookup: + location_group_name = self.generate_group_name("location", self.locations_lookup[location_id]) + location_transformed_group_names[location_id] = self.inventory.add_group(group=location_group_name) - # Add site groups as children of region groups - for site_id in self.sites_lookup: - region_id = self.sites_region_lookup.get(site_id, None) - if region_id is None: - continue - - region_transformed_group_name = region_transformed_group_names[region_id] - - site_name = self.sites_lookup[site_id] - site_group_name = self.generate_group_name(self._pluralize_group_by("site"), site_name) - # Add the site group to get its transformed name - # Will already be created by add_host_to_groups - it's ok to call add_group again just to get its name - site_transformed_group_name = self.inventory.add_group(group=site_group_name) - - self.inventory.add_child(region_transformed_group_name, site_transformed_group_name) + # Now that all location groups exist, add relationships between them + for location_id in self.locations_lookup: + location_group_name = location_transformed_group_names[location_id] + parent_location_id = self.locations_parent_lookup.get(location_id, None) + if parent_location_id is not None and parent_location_id in location_transformed_group_names: + parent_location_name = location_transformed_group_names[parent_location_id] + self.inventory.add_child(parent_location_name, location_group_name) def _fill_host_variables(self, host, hostname): extracted_primary_ip = self.extract_primary_ip(host=host) if extracted_primary_ip: - self.inventory.set_variable(hostname, "ansible_host", extracted_primary_ip) + self.inventory.set_variable(hostname, "ansible_host", extracted_primary_ip["host"]) if self.ansible_host_dns_name: extracted_dns_name = self.extract_dns_name(host=host) @@ -1294,11 +1222,15 @@ def _fill_host_variables(self, host, hostname): extracted_primary_ip4 = self.extract_primary_ip4(host=host) if extracted_primary_ip4: - self.inventory.set_variable(hostname, "primary_ip4", extracted_primary_ip4) + self.inventory.set_variable(hostname, "primary_ip4", extracted_primary_ip4["host"]) extracted_primary_ip6 = self.extract_primary_ip6(host=host) if extracted_primary_ip6: - self.inventory.set_variable(hostname, "primary_ip6", extracted_primary_ip6) + self.inventory.set_variable(hostname, "primary_ip6", extracted_primary_ip6["host"]) + + location = self.extract_location(host=host) + if location: + self.inventory.set_variable(hostname, "location", location) for attribute, extractor in self.group_extractors.items(): extracted_value = extractor(host) @@ -1312,8 +1244,8 @@ def _fill_host_variables(self, host, hostname): if attribute == "tag": attribute = "tags" - if attribute == "region": - attribute = "regions" + if attribute == "location": + attribute = "locations" if attribute == "rack_group": attribute = "rack_groups" @@ -1322,7 +1254,7 @@ def _fill_host_variables(self, host, hostname): if isinstance(extracted_value, dict) and ( (attribute == "config_context" and self.flatten_config_context) or (attribute == "custom_fields" and self.flatten_custom_fields) - or (attribute == "local_context_data" and self.flatten_local_context_data) + or (attribute == "local_config_context_data" and self.flatten_local_context_data) ): for key, value in extracted_value.items(): self.inventory.set_variable(hostname, key, value) @@ -1354,12 +1286,11 @@ def main(self): # Interface, and Service lookup will depend on hosts, if option fetch_all is false self.refresh_lookups(self.lookup_processes) - # Looking up IP Addresses depends on the result of interfaces count_ipaddresses field + # Looking up IP Addresses depends on the result of interfaces ip_address_count field # - can skip any device/vm without any IPs self.refresh_lookups(self.lookup_processes_secondary) for host in chain(self.devices_list, self.vms_list): - virtual_chassis_master = self._get_host_virtual_chassis_master(host) if virtual_chassis_master is not None and virtual_chassis_master != host["id"]: # Device is part of a virtual chassis, but is not the master @@ -1381,9 +1312,9 @@ def main(self): self._add_host_to_keyed_groups(self.get_option("keyed_groups"), host, hostname, strict=strict) self.add_host_to_groups(host=host, hostname=hostname) - # Create groups for regions, containing the site groups - if "region" in self.group_by: - self._add_region_groups() + # Create groups for parent locations, containing child locations + if "locations" in self.group_by: + self._add_location_groups() def parse(self, inventory, loader, path, cache=True): super(InventoryModule, self).parse(inventory, loader, path) diff --git a/plugins/lookup/lookup.py b/plugins/lookup/lookup.py index a386eca8..f8e9226d 100644 --- a/plugins/lookup/lookup.py +++ b/plugins/lookup/lookup.py @@ -163,7 +163,6 @@ def get_endpoint(nautobot, term): "console-server-ports": {"endpoint": nautobot.dcim.console_server_ports}, "device-bay-templates": {"endpoint": nautobot.dcim.device_bay_templates}, "device-bays": {"endpoint": nautobot.dcim.device_bays}, - "device-roles": {"endpoint": nautobot.dcim.device_roles}, "device-types": {"endpoint": nautobot.dcim.device_types}, "devices": {"endpoint": nautobot.dcim.devices}, "export-templates": {"endpoint": nautobot.dcim.export_templates}, @@ -176,9 +175,11 @@ def get_endpoint(nautobot, term): "interfaces": {"endpoint": nautobot.dcim.interfaces}, "inventory-items": {"endpoint": nautobot.dcim.inventory_items}, "ip-addresses": {"endpoint": nautobot.ipam.ip_addresses}, + "ip-address-to-interface": {"endpoint": nautobot.ipam.ip_address_to_interface}, "locations": {"endpoint": nautobot.dcim.locations}, "location_types": {"endpoint": nautobot.dcim.location_types}, "manufacturers": {"endpoint": nautobot.dcim.manufacturers}, + "namespaces": {"endpoint": nautobot.ipam.namespaces}, "object-changes": {"endpoint": nautobot.extras.object_changes}, "platforms": {"endpoint": nautobot.dcim.platforms}, "power-connections": {"endpoint": nautobot.dcim.power_connections}, @@ -191,18 +192,15 @@ def get_endpoint(nautobot, term): "provider_networks": {"endpoint": nautobot.circuits.provider_networks}, "rack-groups": {"endpoint": nautobot.dcim.rack_groups}, "rack-reservations": {"endpoint": nautobot.dcim.rack_reservations}, - "rack-roles": {"endpoint": nautobot.dcim.rack_roles}, "racks": {"endpoint": nautobot.dcim.racks}, "rear-port-templates": {"endpoint": nautobot.dcim.rear_port_templates}, "rear-ports": {"endpoint": nautobot.dcim.rear_ports}, - "regions": {"endpoint": nautobot.dcim.regions}, "relationships": {"endpoint": nautobot.extras.relationships}, "relationship_associations": {"endpoint": nautobot.extras.relationship_associations}, "reports": {"endpoint": nautobot.extras.reports}, "rirs": {"endpoint": nautobot.ipam.rirs}, - "roles": {"endpoint": nautobot.ipam.roles}, + "roles": {"endpoint": nautobot.extras.roles}, "services": {"endpoint": nautobot.ipam.services}, - "sites": {"endpoint": nautobot.dcim.sites}, "statuses": {"endpoint": nautobot.extras.statuses}, "tags": {"endpoint": nautobot.extras.tags}, "tenant-groups": {"endpoint": nautobot.tenancy.tenant_groups}, diff --git a/plugins/lookup/lookup_graphql.py b/plugins/lookup/lookup_graphql.py index 5df5ea6f..6e785562 100644 --- a/plugins/lookup/lookup_graphql.py +++ b/plugins/lookup/lookup_graphql.py @@ -60,17 +60,17 @@ set_fact: query_string: | query { - sites { + locations { id name - region { + parent { name } } } # Make query to GraphQL Endpoint - - name: Obtain list of sites from Nautobot + - name: Obtain list of locations from Nautobot set_fact: query_response: "{{ query('networktocode.nautobot.lookup_graphql', query=query_string, url='https://nautobot.example.com', token='') }}" @@ -78,13 +78,13 @@ - name: SET FACTS TO SEND TO GRAPHQL ENDPOINT set_fact: graph_variables: - site_name: DEN + location_name: DEN query_string: | - query ($site_name:String!) { - sites (name: $site_name) { + query ($location_name:String!) { + locations (name: $location_name) { id name - region { + parent { name } } @@ -195,7 +195,7 @@ class LookupModule(LookupBase): LookupModule(LookupBase) is defined by Ansible """ - def run(self, query, variables=None, graph_variables=None, **kwargs): + def run(self, terms, variables=None, graph_variables=None, **kwargs): """Runs Ansible Lookup Plugin for using Nautobot GraphQL endpoint Raises: @@ -210,8 +210,8 @@ def run(self, query, variables=None, graph_variables=None, **kwargs): PYNAUTOBOT_IMPORT_ERROR, ) - # Query comes in as a list, this needs to be moved to string for pynautobot - lookup_info = nautobot_lookup_graphql(query=query[0], variables=variables, graph_variables=graph_variables, **kwargs) + # Terms comes in as a list, this needs to be moved to string for pynautobot + lookup_info = nautobot_lookup_graphql(query=terms[0], variables=variables, graph_variables=graph_variables, **kwargs) # Results should be the data response of the query to be returned as a lookup return lookup_info diff --git a/plugins/module_utils/circuits.py b/plugins/module_utils/circuits.py index fda2eb7b..37fe995b 100644 --- a/plugins/module_utils/circuits.py +++ b/plugins/module_utils/circuits.py @@ -8,7 +8,6 @@ from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import ( NautobotModule, ENDPOINT_NAME_MAPPING, - SLUG_REQUIRED, ) @@ -44,17 +43,13 @@ def run(self): # Used for msg output if data.get("name"): name = data["name"] - elif data.get("slug"): - name = data["slug"] elif data.get("cid"): name = data["cid"] elif data.get("circuit") and data.get("term_side"): circuit = self.nb.circuits.circuits.get(data["circuit"]).serialize() name = "{0}_{1}".format(circuit["cid"].replace(" ", "_"), data["term_side"]).lower() - - if self.endpoint in SLUG_REQUIRED: - if not data.get("slug"): - data["slug"] = self._to_slug(name) + else: + name = data.get("id") object_query_params = self._build_query_params(endpoint_name, data, user_query_params) self.nb_object = self._nb_endpoint_get(nb_endpoint, object_query_params, name) diff --git a/plugins/module_utils/dcim.py b/plugins/module_utils/dcim.py index 5c533fe3..ee2983de 100644 --- a/plugins/module_utils/dcim.py +++ b/plugins/module_utils/dcim.py @@ -9,7 +9,6 @@ from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import ( NautobotModule, ENDPOINT_NAME_MAPPING, - SLUG_REQUIRED, ) @@ -21,7 +20,7 @@ NB_DEVICE_BAYS = "device_bays" NB_DEVICE_BAY_TEMPLATES = "device_bay_templates" NB_DEVICES = "devices" -NB_DEVICE_ROLES = "device_roles" +NB_ROLES = "roles" NB_DEVICE_TYPES = "device_types" NB_FRONT_PORTS = "front_ports" NB_FRONT_PORT_TEMPLATES = "front_port_templates" @@ -39,12 +38,9 @@ NB_POWER_PORTS = "power_ports" NB_POWER_PORT_TEMPLATES = "power_port_templates" NB_RACKS = "racks" -NB_RACK_ROLES = "rack_roles" NB_RACK_GROUPS = "rack_groups" NB_REAR_PORTS = "rear_ports" NB_REAR_PORT_TEMPLATES = "rear_port_templates" -NB_REGIONS = "regions" -NB_SITES = "sites" NB_VIRTUAL_CHASSIS = "virtual_chassis" @@ -62,7 +58,6 @@ def run(self): - device_bays - device_bay_templates - devices - - device_roles - device_types - front_ports - front_port_templates @@ -77,13 +72,10 @@ def run(self): - power_panels - power_ports - power_port_templates - - sites - racks - - rack_roles - rack_groups - rear_ports - rear_port_templates - - regions - virtual_chassis """ # Used to dynamically set key when returning results @@ -98,20 +90,24 @@ def run(self): data = self.data + # # Include config context for device endpoint + # if endpoint_name == "device": + # nb_endpoint.url = f"{nb_endpoint.url}/?&include=config_context_data" + # Used for msg output if data.get("name"): name = data["name"] - elif data.get("model") and not data.get("slug"): + elif data.get("model"): name = data["model"] elif data.get("master"): name = self.module.params["data"]["master"] - elif data.get("slug"): - name = data["slug"] + elif data.get("id"): + name = data["id"] elif endpoint_name == "cable": if self.module.params["termination_a"].get("name"): termination_a_name = self.module.params["termination_a"]["name"] - elif self.module.params["termination_a"].get("slug"): - termination_a_name = self.module.params["termination_a"]["slug"] + elif self.module.params["termination_a"].get("display"): + termination_a_name = self.module.params["termination_a"]["display"] elif self.module.params["termination_a"].get("circuit"): termination_a_name = self.module.params["termination_a"]["circuit"] else: @@ -119,8 +115,8 @@ def run(self): if self.module.params["termination_b"].get("name"): termination_b_name = self.module.params["termination_b"]["name"] - elif self.module.params["termination_b"].get("slug"): - termination_b_name = self.module.params["termination_b"]["slug"] + elif self.module.params["termination_b"].get("display"): + termination_b_name = self.module.params["termination_b"]["display"] elif self.module.params["termination_a"].get("circuit"): termination_a_name = self.module.params["termination_b"]["circuit"] else: @@ -133,23 +129,17 @@ def run(self): termination_b_name, ) - if self.endpoint in SLUG_REQUIRED: - if not data.get("slug"): - data["slug"] = self._to_slug(name) - # Make color params lowercase if data.get("color"): data["color"] = data["color"].lower() if self.endpoint == "cables": - cables = [ - cable - for cable in nb_endpoint.all() - if cable.termination_a_type == data["termination_a_type"] - and cable.termination_a_id == data["termination_a_id"] - and cable.termination_b_type == data["termination_b_type"] - and cable.termination_b_id == data["termination_b_id"] - ] + cables = nb_endpoint.filter( + termination_a_type=data["termination_a_type"], + termination_a_id=data["termination_a_id"], + termination_b_type=data["termination_b_type"], + termination_b_id=data["termination_b_id"], + ) if len(cables) == 0: self.nb_object = None elif len(cables) == 1: diff --git a/plugins/module_utils/extras.py b/plugins/module_utils/extras.py index a339a5c5..4f4e85b6 100644 --- a/plugins/module_utils/extras.py +++ b/plugins/module_utils/extras.py @@ -8,7 +8,6 @@ from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import ( NautobotModule, ENDPOINT_NAME_MAPPING, - SLUG_REQUIRED, ) NB_TAGS = "tags" @@ -41,14 +40,10 @@ def run(self): # Used for msg output if data.get("name"): name = data["name"] - elif data.get("slug"): - name = data["slug"] elif endpoint_name == "relationship_associations": name = f"{data['source_type']} -> {data['destination_type']}" - - if self.endpoint in SLUG_REQUIRED: - if not data.get("slug"): - data["slug"] = self._to_slug(name) + else: + name = data.get("id") # Make color params lowercase if data.get("color"): diff --git a/plugins/module_utils/ipam.py b/plugins/module_utils/ipam.py index 6d603e0b..db8d1286 100644 --- a/plugins/module_utils/ipam.py +++ b/plugins/module_utils/ipam.py @@ -6,20 +6,18 @@ __metaclass__ = type # Import necessary packages -import traceback from ipaddress import ip_interface from ansible.module_utils._text import to_text -from ansible.module_utils.basic import missing_required_lib from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import ( NautobotModule, ENDPOINT_NAME_MAPPING, - SLUG_REQUIRED, ) -NB_AGGREGATES = "aggregates" NB_IP_ADDRESSES = "ip_addresses" +NB_IP_ADDRESS_TO_INTERFACE = "ip_address_to_interface" +NB_NAMESPACES = "namespaces" NB_PREFIXES = "prefixes" NB_IPAM_ROLES = "roles" NB_RIRS = "rirs" @@ -34,6 +32,9 @@ class NautobotIpamModule(NautobotModule): def _handle_state_new_present(self, nb_app, nb_endpoint, endpoint_name, name, data): if data.get("address"): if self.state == "present": + if self.nb_object and endpoint_name == "ip_address": + # namespace is only used for querying in ip_address endpoint, don't pass it to update methods. + data.pop("namespace") self._ensure_object_exists(nb_endpoint, endpoint_name, name, data) elif self.state == "new": self.nb_object, diff = self._create_object(nb_endpoint, data) @@ -48,21 +49,9 @@ def _handle_state_new_present(self, nb_app, nb_endpoint, endpoint_name, name, da def _ensure_ip_in_prefix_present_on_netif(self, nb_app, nb_endpoint, data, endpoint_name): query_params = { - "parent": data["prefix"], + "parent": data["parent"], } - if not data.get("assigned_object_id") or not data.get("prefix"): - self._handle_errors("A prefix and assigned_object is required") - data_intf_key = "assigned_object_id" - - intf_obj_type = data.get("assigned_object_type", "dcim.interface") - if intf_obj_type == "virtualization.vminterface": - intf_type = "vminterface_id" - else: - intf_type = "interface_id" - - query_params.update({intf_type: data[data_intf_key]}) - if data.get("vrf"): query_params["vrf_id"] = data["vrf"] @@ -79,11 +68,13 @@ def _ensure_ip_in_prefix_present_on_netif(self, nb_app, nb_endpoint, data, endpo def _get_new_available_ip_address(self, nb_app, data, endpoint_name): prefix_query = self._build_query_params("prefix", data) - prefix = self._nb_endpoint_get(nb_app.prefixes, prefix_query, data["prefix"]) + prefix = self._nb_endpoint_get(nb_app.prefixes, prefix_query, data["parent"]) if not prefix: self.result["changed"] = False - self.result["msg"] = "%s does not exist - please create first" % (data["prefix"]) + self.result["msg"] = "%s does not exist - please create first" % (data["parent"]) elif prefix.available_ips.list(): + # Convert 'parent' to 'prefix' key when calling prefix endpoint + data["prefix"] = data.pop("parent") self.nb_object, diff = self._create_object(prefix.available_ips, data) self.nb_object = self.nb_object.serialize() self.result["changed"] = True @@ -94,7 +85,7 @@ def _get_new_available_ip_address(self, nb_app, data, endpoint_name): self.result["diff"] = diff else: self.result["changed"] = False - self.result["msg"] = "No available IPs available within %s" % (data["prefix"]) + self.result["msg"] = "No available IPs available within %s" % (data["parent"]) def _get_new_available_prefix(self, data, endpoint_name): if not self.nb_object: @@ -105,7 +96,8 @@ def _get_new_available_prefix(self, data, endpoint_name): self.result["changed"] = True self.result["msg"] = "New prefix created within %s" % (data["parent"]) self.module.exit_json(**self.result) - + # Convert parent to prefix key when calling prefix endpoint + data["prefix"] = data.pop("parent") self.nb_object, diff = self._create_object(self.nb_object.available_prefixes, data) self.nb_object = self.nb_object.serialize() self.result["changed"] = True @@ -123,9 +115,8 @@ def run(self): This function should have all necessary code for endpoints within the application to create/update/delete the endpoint objects Supported endpoints: - - aggregates - - ipam_roles - ip_addresses + - ip_address_to_interface - prefixes - rirs - route_targets @@ -144,7 +135,6 @@ def run(self): user_query_params = self.module.params.get("query_params") data = self.data - if self.endpoint == "ip_addresses": if data.get("address"): try: @@ -152,21 +142,16 @@ def run(self): except ValueError: pass name = data.get("address") - elif self.endpoint in ["aggregates", "prefixes"]: + elif self.endpoint in ["prefixes"]: name = data.get("prefix") else: name = data.get("name") - if self.endpoint in SLUG_REQUIRED: - if not data.get("slug"): - data["slug"] = self._to_slug(name) - if self.module.params.get("first_available"): first_available = True else: first_available = False - - if data.get("prefix") and self.endpoint == "ip_addresses": + if data.get("parent") and self.endpoint == "ip_addresses": object_query_params = self._build_query_params("prefix", data) self.nb_object = self._nb_endpoint_get(nb_app.prefixes, object_query_params, name) else: diff --git a/plugins/module_utils/tenancy.py b/plugins/module_utils/tenancy.py index b91749e7..9f14dd77 100644 --- a/plugins/module_utils/tenancy.py +++ b/plugins/module_utils/tenancy.py @@ -8,7 +8,6 @@ from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import ( NautobotModule, ENDPOINT_NAME_MAPPING, - SLUG_REQUIRED, ) @@ -40,12 +39,8 @@ def run(self): # Used for msg output if data.get("name"): name = data["name"] - elif data.get("slug"): - name = data["slug"] - - if self.endpoint in SLUG_REQUIRED: - if not data.get("slug"): - data["slug"] = self._to_slug(name) + else: + name = data.get("id") object_query_params = self._build_query_params(endpoint_name, data, user_query_params) self.nb_object = self._nb_endpoint_get(nb_endpoint, object_query_params, name) diff --git a/plugins/module_utils/utils.py b/plugins/module_utils/utils.py index f3544f1f..a223dfc4 100644 --- a/plugins/module_utils/utils.py +++ b/plugins/module_utils/utils.py @@ -10,7 +10,6 @@ # Import necessary packages import traceback -import re import json import os @@ -43,7 +42,6 @@ "device_bays", "device_bay_templates", "devices", - "device_roles", "device_types", "front_ports", "front_port_templates", @@ -62,15 +60,24 @@ "power_port_templates", "racks", "rack_groups", - "rack_roles", "rear_ports", "rear_port_templates", - "regions", - "sites", "virtual_chassis", ], - extras=["tags", "statuses", "relationship_associations"], - ipam=["aggregates", "ip_addresses", "prefixes", "rirs", "roles", "route_targets", "vlans", "vlan_groups", "vrfs", "services"], + extras=["tags", "statuses", "relationship_associations", "roles"], + ipam=[ + "ip_addresses", + "ip_address_to_interface", + "namespaces", + "prefixes", + "rirs", + "route_targets", + "vlans", + "vlan_groups", + "vrfs", + "services", + ], + plugins=[], secrets=[], tenancy=["tenants", "tenant_groups"], virtualization=["cluster_groups", "cluster_types", "clusters", "virtual_machines"], @@ -80,58 +87,51 @@ QUERY_TYPES = dict( circuit="cid", circuit_termination="circuit", - circuit_type="slug", + circuit_type="name", cluster="name", - cluster_group="slug", - cluster_type="slug", + cluster_group="name", + cluster_type="name", device="name", - device_role="slug", - device_type="slug", + role="name", + device_type="model", export_targets="name", - group="slug", + group="name", installed_device="name", import_targets="name", - manufacturer="slug", + location="id", + manufacturer="name", master="name", nat_inside="address", nat_outside="address", - parent_rack_group="slug", - parent_region="slug", - parent_tenant_group="slug", + parent_rack_group="name", + parent_tenant_group="name", power_panel="name", power_port="name", power_port_template="name", - platform="slug", - prefix_role="slug", + platform="name", primary_ip="address", primary_ip4="address", primary_ip6="address", - provider="slug", + provider="name", rack="name", - rack_group="slug", - rack_role="slug", + rack_group="name", rear_port="name", rear_port_template="name", - region="slug", - rir="slug", + rir="name", route_targets="name", - slug="slug", - site="slug", - tenant="slug", - tenant_group="slug", + status="name", + tenant="name", + tenant_group="name", time_zone="timezone", virtual_chassis="name", virtual_machine="name", - virtual_machine_role="slug", vlan="name", - vlan_group="slug", - vlan_role="name", + vlan_group="name", vrf="name", ) # Specifies keys within data that need to be converted to ID and the endpoint to be used when queried CONVERT_TO_ID = { - "assigned_object": "assigned_object", "circuit": "circuits", "circuit_type": "circuit_types", "circuit_termination": "circuit_terminations", @@ -148,7 +148,6 @@ "dcim.powerport": "power_ports", "dcim.rearport": "rear_ports", "device": "devices", - "device_role": "device_roles", "device_type": "device_types", "export_targets": "route_targets", "group": "tenant_groups", @@ -159,32 +158,32 @@ "ip_addresses": "ip_addresses", "ipaddresses": "ip_addresses", "lag": "interfaces", + "location": "locations", "manufacturer": "manufacturers", "master": "devices", "nat_inside": "ip_addresses", "nat_outside": "ip_addresses", + "namespace": "namespaces", "platform": "platforms", "parent_rack_group": "rack_groups", - "parent_region": "regions", + "parent_location": "locations", "parent_tenant_group": "tenant_groups", "power_panel": "power_panels", "power_port": "power_ports", "power_port_template": "power_port_templates", - "prefix_role": "roles", "primary_ip": "ip_addresses", "primary_ip4": "ip_addresses", "primary_ip6": "ip_addresses", "provider": "providers", "rack": "racks", "rack_group": "rack_groups", - "rack_role": "rack_roles", - "region": "regions", "rear_port": "rear_ports", "rear_port_template": "rear_port_templates", "rir": "rirs", + "role": "roles", "route_targets": "route_targets", "services": "services", - "site": "sites", + "status": "statuses", "tags": "tags", "tagged_vlans": "vlans", "tenant": "tenants", @@ -194,15 +193,13 @@ "untagged_vlan": "vlans", "virtual_chassis": "virtual_chassis", "virtual_machine": "virtual_machines", - "virtual_machine_role": "device_roles", "vlan": "vlans", "vlan_group": "vlan_groups", - "vlan_role": "roles", + "vm_interface": "interfaces", "vrf": "vrfs", } ENDPOINT_NAME_MAPPING = { - "aggregates": "aggregate", "cables": "cable", "circuit_terminations": "circuit_termination", "circuit_types": "circuit_type", @@ -217,7 +214,6 @@ "device_bays": "device_bay", "device_bay_templates": "device_bay_template", "devices": "device", - "device_roles": "device_role", "device_types": "device_type", "front_ports": "front_port", "front_port_templates": "front_port_template", @@ -225,9 +221,11 @@ "interface_templates": "interface_template", "inventory_items": "inventory_item", "ip_addresses": "ip_address", + "ip_address_to_interface": "ip_address_to_interface", "locations": "location", "location_types": "location_type", "manufacturers": "manufacturer", + "namespaces": "namespace", "platforms": "platform", "power_feeds": "power_feed", "power_outlets": "power_outlet", @@ -239,16 +237,13 @@ "providers": "provider", "racks": "rack", "rack_groups": "rack_group", - "rack_roles": "rack_role", "rear_ports": "rear_port", "rear_port_templates": "rear_port_template", - "regions": "region", "relationship_associations": "relationship_associations", "rirs": "rir", "roles": "role", "route_targets": "route_target", "services": "services", - "sites": "site", "statuses": "statuses", "tags": "tags", "tenants": "tenant", @@ -262,15 +257,13 @@ # What makes the search unique ALLOWED_QUERY_PARAMS = { - "aggregate": set(["prefix", "rir"]), - "assigned_object": set(["name", "device", "virtual_machine"]), "circuit": set(["cid"]), - "circuit_type": set(["slug"]), + "circuit_type": set(["name"]), "circuit_termination": set(["circuit", "term_side"]), "circuits.circuittermination": set(["circuit", "term_side"]), "cluster": set(["name", "type"]), - "cluster_group": set(["slug"]), - "cluster_type": set(["slug"]), + "cluster_group": set(["name"]), + "cluster_type": set(["name"]), "console_port": set(["name", "device"]), "console_port_template": set(["name", "device_type"]), "console_server_port": set(["name", "device"]), @@ -286,142 +279,118 @@ "device_bay": set(["name", "device"]), "device_bay_template": set(["name", "device_type"]), "device": set(["name"]), - "device_role": set(["slug"]), - "device_type": set(["slug"]), + "device_type": set(["model"]), "front_port": set(["name", "device", "rear_port"]), "front_port_template": set(["name", "device_type", "rear_port_template"]), "installed_device": set(["name"]), "interface": set(["name", "device", "virtual_machine"]), "interface_template": set(["name", "device_type"]), "inventory_item": set(["name", "device"]), - "ip_address": set(["address", "vrf", "device", "interface", "vminterface"]), - "ip_addresses": set(["address", "vrf", "device", "interface", "vminterface"]), - "ipaddresses": set(["address", "vrf", "device", "interface", "vminterface"]), + "ip_address": set(["address", "namespace", "device", "interfaces", "vm_interfaces"]), + "ip_addresses": set(["address", "namespace", "device", "interfaces", "vm_interfaces"]), + "ipaddresses": set(["address", "namespace", "device", "interfaces", "vm_interfaces"]), + "ip_address_to_interface": set(["ip_address", "interface", "vm_interface"]), "lag": set(["name"]), - "location": set(["name"]), + "location": set(["name", "id"]), "location_type": set(["name"]), - "manufacturer": set(["slug"]), + "manufacturer": set(["name"]), "master": set(["name"]), - "nat_inside": set(["vrf", "address"]), - "parent_rack_group": set(["slug"]), - "parent_region": set(["slug"]), - "parent_tenant_group": set(["slug"]), - "platform": set(["slug"]), + "namespace": set(["name"]), + "nat_inside": set(["namespace", "address"]), + "parent_rack_group": set(["name"]), + "parent_tenant_group": set(["name"]), + "platform": set(["name"]), "power_feed": set(["name", "power_panel"]), "power_outlet": set(["name", "device"]), "power_outlet_template": set(["name", "device_type"]), - "power_panel": set(["name", "site"]), + "power_panel": set(["name", "location"]), "power_port": set(["name", "device"]), "power_port_template": set(["name", "device_type"]), - "prefix": set(["prefix", "vrf"]), - "primary_ip4": set(["address", "vrf"]), - "primary_ip6": set(["address", "vrf"]), - "provider": set(["slug"]), - "rack": set(["name", "site"]), - "rack_group": set(["slug"]), - "rack_role": set(["slug"]), - "region": set(["slug"]), + "prefix": set(["prefix", "namespace"]), + "primary_ip4": set(["address", "namespace"]), + "primary_ip6": set(["address", "namespace"]), + "provider": set(["name"]), + "rack": set(["name", "location"]), + "rack_group": set(["name"]), "rear_port": set(["name", "device"]), "rear_port_template": set(["name", "device_type"]), "relationship_associations": set(["source_id", "destination_id"]), - "rir": set(["slug"]), - "role": set(["slug"]), + "rir": set(["name"]), + "role": set(["name"]), "route_target": set(["name"]), "services": set(["device", "virtual_machine", "name", "port", "protocol"]), - "site": set(["slug"]), "statuses": set(["name"]), - "tags": set(["slug"]), - "tagged_vlans": set(["group", "name", "site", "vid", "vlan_group", "tenant"]), - "tenant": set(["slug"]), - "tenant_group": set(["slug"]), + "tags": set(["name"]), + "tagged_vlans": set(["group", "name", "location", "vid", "vlan_group", "tenant"]), + "tenant": set(["name"]), + "tenant_group": set(["name"]), "termination_a": set(["name", "device", "virtual_machine"]), "termination_b": set(["name", "device", "virtual_machine"]), - "untagged_vlan": set(["group", "name", "site", "vid", "vlan_group", "tenant"]), + "untagged_vlan": set(["group", "name", "location", "vid", "vlan_group", "tenant"]), "virtual_chassis": set(["name", "device"]), "virtual_machine": set(["name", "cluster"]), - "vlan": set(["group", "name", "site", "tenant", "vid", "vlan_group"]), - "vlan_group": set(["slug", "site"]), - "vrf": set(["name", "tenant"]), + "vlan": set(["name", "location", "tenant", "vid", "vlan_group"]), + "vlan_group": set(["name", "location"]), + "vm_interface": set(["name", "virtual_machine"]), + "vrf": set(["name", "namespace", "rd"]), } -QUERY_PARAMS_IDS = set(["circuit", "cluster", "device", "group", "interface", "rir", "vrf", "site", "tenant", "type", "virtual_machine", "vminterface"]) +QUERY_PARAMS_IDS = set(["circuit", "cluster", "device", "group", "interface", "rir", "vrf", "tenant", "type", "virtual_machine", "vminterface"]) + +# Some API endpoints dropped '_id' in filter fields in 2.0, ignore them here. +IGNORE_ADDING_IDS = { + "ip_address_to_interface", + "device_bay", + "inventory_item", + "circuit_termination", + "rear_port", + "front_port", + "console_port", + "console_server_port", + "power_port", + "power_outlet", + "dcim.consoleport", + "dcim.consoleserverport", + "circuits.circuittermination", + "services", +} REQUIRED_ID_FIND = { - "cables": set(["status", "type", "length_unit"]), - "circuits": set(["status"]), + "cables": set(["termination_a_type", "termination_b_type", "type", "length_unit"]), "console_ports": set(["type"]), "console_port_templates": set(["type"]), "console_server_ports": set(["type"]), "console_server_port_templates": set(["type"]), - "devices": set(["status", "face"]), + "devices": set(["face"]), "device_types": set(["subdevice_role"]), "front_ports": set(["type"]), "front_port_templates": set(["type"]), "interfaces": set(["form_factor", "mode", "type"]), "interface_templates": set(["type"]), - "ip_addresses": set(["status", "role"]), - "locations": set(["status"]), - "prefixes": set(["status"]), - "power_feeds": set(["status", "type", "supply", "phase"]), + "ip_addresses": set(["type"]), + "prefixes": set(["type"]), + "power_feeds": set(["type", "supply", "phase"]), "power_outlets": set(["type", "feed_leg"]), "power_outlet_templates": set(["type", "feed_leg"]), "power_ports": set(["type"]), "power_port_templates": set(["type"]), - "racks": set(["status", "outer_unit", "type"]), + "racks": set(["outer_unit", "type"]), "rear_ports": set(["type"]), "rear_port_templates": set(["type"]), "services": set(["protocol"]), - "sites": set(["status"]), - "virtual_machines": set(["status", "face"]), - "vlans": set(["status"]), + "virtual_machines": set(["face"]), } # This is used to map non-clashing keys to Nautobot API compliant keys to prevent bad logic in code for similar keys but different modules CONVERT_KEYS = { - "assigned_object": "assigned_object_id", - "circuit_type": "type", - "cluster_type": "type", - "cluster_group": "group", "parent_rack_group": "parent", - "parent_region": "parent", + "parent_location": "parent", "parent_tenant_group": "parent", - "power_port_template": "power_port", - "prefix_role": "role", - "rack_group": "group", - "rack_role": "role", - "rear_port_template": "rear_port", "rear_port_template_position": "rear_port_position", - "tenant_group": "group", "termination_a": "termination_a_id", "termination_b": "termination_b_id", - "virtual_machine_role": "role", - "vlan_role": "role", - "vlan_group": "group", } -# This is used to dynamically convert name to slug on endpoints requiring a slug -SLUG_REQUIRED = { - "circuit_types", - "cluster_groups", - "cluster_types", - "device_roles", - "device_types", - "ipam_roles", - "rack_groups", - "rack_roles", - "regions", - "rirs", - "roles", - "sites", - "statuses", - "tags", - "tenants", - "tenant_groups", - "manufacturers", - "platforms", - "providers", - "vlan_groups", -} NAUTOBOT_ARG_SPEC = dict( url=dict(type="str", required=True), @@ -520,16 +489,13 @@ def _connect_api(self, url, token, ssl_verify, api_version): try: nb = pynautobot.api(url, token=token, api_version=api_version) nb.http_session.verify = ssl_verify - try: - self.version = nb.version - except pynautobot.RequestError as e: - # Better error reporting - # An error might be: Invalid version in \"Accept\" header. Supported versions are 1.2, 1.3 - # This way error returned is less verbose - self._handle_errors(msg=e.error) - except Exception: - self.module.fail_json(msg="Failed to establish connection to Nautobot API") + self.version = nb.version return nb + except pynautobot.RequestError as e: + self._handle_errors(msg=e.error) + except ValueError as e: + # pynautobot 2.0 does version constraint on init, handle errors if versions doesn't match. + self._handle_errors(msg=str(e)) except Exception: self.module.fail_json(msg="Failed to establish connection to Nautobot API") @@ -601,9 +567,6 @@ def _convert_identical_keys(self, data): if self.endpoint == "power_panels" and key == "rack_group": temp_dict[key] = data[key] elif key in CONVERT_KEYS: - # This will keep the original key for assigned_object, but also convert to assigned_object_id - if key == "assigned_object": - temp_dict[key] = data[key] new_key = CONVERT_KEYS[key] temp_dict[new_key] = data[key] else: @@ -685,7 +648,7 @@ def _build_query_params(self, parent, module_data, user_query_params=None, child matches = query_params.intersection(set(module_data.keys())) for match in matches: - if match in QUERY_PARAMS_IDS: + if match in QUERY_PARAMS_IDS and parent not in IGNORE_ADDING_IDS: if child: query_id = self._get_query_param_id(match, child) else: @@ -721,16 +684,9 @@ def _build_query_params(self, parent, module_data, user_query_params=None, child else: query_dict.update({"device": module_data["device"]}) - elif parent == "ip_address" and module_data.get("assigned_object_type"): - if module_data["assigned_object_type"] == "virtualization.vminterface": - query_dict.update({"vminterface_id": module_data.get("assigned_object_id")}) - elif module_data["assigned_object_type"] == "dcim.interface": - query_dict.update({"interface_id": module_data.get("assigned_object_id")}) - elif parent == "rear_port" and self.endpoint == "front_ports": if isinstance(module_data.get("rear_port"), str): rear_port = { - "device_id": module_data.get("device"), "name": module_data.get("rear_port"), } query_dict.update(rear_port) @@ -738,15 +694,10 @@ def _build_query_params(self, parent, module_data, user_query_params=None, child elif parent == "rear_port_template" and self.endpoint == "front_port_templates": if isinstance(module_data.get("rear_port_template"), str): rear_port_template = { - "devicetype_id": module_data.get("device_type"), "name": module_data.get("rear_port_template"), } query_dict.update(rear_port_template) - elif "_template" in parent: - if query_dict.get("device_type"): - query_dict["devicetype_id"] = query_dict.pop("device_type") - if not query_dict: provided_kwargs = child.keys() if child else module_data.keys() acceptable_query_params = user_query_params if user_query_params else query_params @@ -818,14 +769,13 @@ def _find_ids(self, data, user_query_params): # Do not attempt to resolve if already ID/UUID is provided if isinstance(v, int) or self.is_valid_uuid(v): continue - + elif k == "location": + self._handle_errors(msg="Location needs a valid UUID") # Special circumstances to set endpoint to search within - if k == "termination_a": + elif k == "termination_a": endpoint = CONVERT_TO_ID[data.get("termination_a_type")] elif k == "termination_b": endpoint = CONVERT_TO_ID[data.get("termination_b_type")] - elif k == "assigned_object": - endpoint = "interfaces" else: endpoint = CONVERT_TO_ID[k] search = v @@ -834,7 +784,7 @@ def _find_ids(self, data, user_query_params): nb_endpoint = getattr(nb_app, endpoint) if isinstance(v, dict): - if (k == "interface" or k == "assigned_object") and v.get("virtual_machine"): + if k == "vm_interface" and v.get("virtual_machine"): nb_app = getattr(self.nb, "virtualization") nb_endpoint = getattr(nb_app, endpoint) query_params = self._build_query_params(k, data, child=v) @@ -843,7 +793,7 @@ def _find_ids(self, data, user_query_params): id_list = list() for list_item in v: if k == "tags" and isinstance(list_item, str) and not self.is_valid_uuid(list_item): - temp_dict = {"slug": self._to_slug(list_item)} + temp_dict = {"name": list_item} elif isinstance(list_item, dict): norm_data = self._normalize_data(list_item) temp_dict = self._build_query_params(k, data, child=norm_data) @@ -880,25 +830,9 @@ def _find_ids(self, data, user_query_params): return data - def _to_slug(self, value): - """ - :returns slug (str): Slugified value - :params value (str): Value that needs to be changed to slug format - """ - if value is None: - return value - elif isinstance(value, int) or self.is_valid_uuid(value): - return value - else: - removed_chars = re.sub(r"[^\-\.\w\s]", "", value) - convert_chars = re.sub(r"[\-\.\s]+", "-", removed_chars) - return convert_chars.strip().lower() - def _normalize_data(self, data): """ :returns data (dict): Normalized module data to formats accepted by Nautobot searches - such as changing from user specified value to slug - ex. Test Rack -> test-rack :params data (dict): Original data from Nautobot module """ for k, v in data.items(): @@ -910,15 +844,9 @@ def _normalize_data(self, data): else: self._handle_errors(f"Invalid ID passed for {k}: {v['id']}") - for subk, subv in v.items(): - sub_data_type = QUERY_TYPES.get(subk, "q") - if sub_data_type == "slug": - data[k][subk] = self._to_slug(subv) else: data_type = QUERY_TYPES.get(k, "q") - if data_type == "slug": - data[k] = self._to_slug(v) - elif data_type == "timezone": + if data_type == "timezone": if " " in v: data[k] = v.replace(" ", "_") if k == "description": @@ -927,14 +855,6 @@ def _normalize_data(self, data): if k == "mac_address": data[k] = v.upper() - # We need to assign the correct type for the assigned object so the user doesn't have to worry about this. - # We determine it by whether or not they pass in a device or virtual_machine - if data.get("assigned_object"): - if data["assigned_object"].get("device"): - data["assigned_object_type"] = "dcim.interface" - if data["assigned_object"].get("virtual_machine"): - data["assigned_object_type"] = "virtualization.vminterface" - return data def _create_object(self, nb_endpoint, data): @@ -1022,7 +942,7 @@ def _ensure_object_exists(self, nb_endpoint, endpoint_name, name, data): else: self.nb_object, diff = self._update_object(data) if self.nb_object is False: - self._handle_errors(msg="Request failed, couldn't update device: %s" % name) + self._handle_errors(msg="Request failed, couldn't update object: %s" % name) if diff: self.result["msg"] = "%s %s updated" % (endpoint_name, name) self.result["changed"] = True diff --git a/plugins/module_utils/virtualization.py b/plugins/module_utils/virtualization.py index b935cc74..216a321d 100644 --- a/plugins/module_utils/virtualization.py +++ b/plugins/module_utils/virtualization.py @@ -9,7 +9,6 @@ from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import ( NautobotModule, ENDPOINT_NAME_MAPPING, - SLUG_REQUIRED, ) @@ -51,12 +50,8 @@ def run(self): # Used for msg output if data.get("name"): name = data["name"] - elif data.get("slug"): - name = data["slug"] - - if self.endpoint in SLUG_REQUIRED: - if not data.get("slug"): - data["slug"] = self._to_slug(name) + else: + name = data.get("id") object_query_params = self._build_query_params(endpoint_name, data, user_query_params) self.nb_object = self._nb_endpoint_get(nb_endpoint, object_query_params, name) diff --git a/plugins/modules/aggregate.py b/plugins/modules/aggregate.py deleted file mode 100644 index 3ae8f2da..00000000 --- a/plugins/modules/aggregate.py +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright: (c) 2019, Mikhail Yohman (@FragmentedPacket) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -DOCUMENTATION = r""" ---- -module: aggregate -short_description: Creates or removes aggregates from Nautobot -description: - - Creates or removes aggregates from Nautobot -notes: - - Tags should be defined as a YAML list - - This should be ran with connection C(local) and hosts C(localhost) -author: - - Mikhail Yohman (@FragmentedPacket) -version_added: "1.0.0" -extends_documentation_fragment: - - networktocode.nautobot.fragments.base - - networktocode.nautobot.fragments.tags - - networktocode.nautobot.fragments.custom_fields -options: - prefix: - description: - - "The aggregate prefix" - required: true - type: raw - version_added: "3.0.0" - rir: - description: - - "The RIR the aggregate will be assigned to" - required: false - type: raw - version_added: "3.0.0" - date_added: - description: - - "Date added, format: YYYY-MM-DD" - required: false - type: str - version_added: "3.0.0" - description: - description: - - "The description of the aggregate" - required: false - type: str - version_added: "3.0.0" -""" - -EXAMPLES = r""" -- name: "Test Nautobot aggregate module" - connection: local - hosts: localhost - gather_facts: False - - tasks: - - name: Create aggregate within Nautobot with only required information - networktocode.nautobot.aggregate: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.0.0/16 - rir: Test RIR - state: present - - - name: Create aggregate with several specified options - networktocode.nautobot.aggregate: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.0.0/16 - rir: Test RIR - date_added: 1989-01-18 - description: Test description - tags: - - Schnozzberry - state: present - - - name: Delete aggregate within nautobot - networktocode.nautobot.aggregate: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.0.0/16 - state: absent -""" - -RETURN = r""" -aggregate: - description: Serialized object as created or already existent within Nautobot - returned: on creation - type: dict -msg: - description: Message indicating failure or info about what has been achieved - returned: always - type: str -""" - -from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NAUTOBOT_ARG_SPEC -from ansible_collections.networktocode.nautobot.plugins.module_utils.ipam import ( - NautobotIpamModule, - NB_AGGREGATES, -) -from ansible.module_utils.basic import AnsibleModule -from copy import deepcopy - - -def main(): - """ - Main entry point for module execution - """ - argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) - argument_spec.update( - dict( - prefix=dict(required=True, type="raw"), - rir=dict(required=False, type="raw"), - date_added=dict(required=False, type="str"), - description=dict(required=False, type="str"), - tags=dict(required=False, type="list", elements="raw"), - custom_fields=dict(required=False, type="dict"), - ) - ) - - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) - - aggregate = NautobotIpamModule(module, NB_AGGREGATES) - aggregate.run() - - -if __name__ == "__main__": # pragma: no cover - main() diff --git a/plugins/modules/circuit_termination.py b/plugins/modules/circuit_termination.py index 63988ba8..76450f2f 100644 --- a/plugins/modules/circuit_termination.py +++ b/plugins/modules/circuit_termination.py @@ -37,10 +37,10 @@ - Z required: true type: str - site: + location: version_added: "3.0.0" description: - - The site the circuit termination will be assigned to + - The location the circuit termination will be assigned to required: false type: raw port_speed: @@ -94,7 +94,7 @@ token: thisIsMyToken circuit: Test Circuit term_side: A - site: Test Site + location: "{{ location['key'] }}" port_speed: 10000 state: present @@ -159,7 +159,7 @@ def main(): dict( circuit=dict(required=True, type="raw"), term_side=dict(required=True, choices=["A", "Z"]), - site=dict(required=False, type="raw"), + location=dict(required=False, type="raw"), port_speed=dict(required=False, type="int"), upstream_speed=dict(required=False, type="int"), xconnect_id=dict(required=False, type="str"), diff --git a/plugins/modules/circuit_type.py b/plugins/modules/circuit_type.py index b97938f3..0cfa64cd 100644 --- a/plugins/modules/circuit_type.py +++ b/plugins/modules/circuit_type.py @@ -28,10 +28,9 @@ required: true type: str version_added: "3.0.0" - slug: + description: description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided + - The decription of the the circuit type. required: false type: str version_added: "3.0.0" @@ -87,7 +86,7 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), + description=dict(required=False, type="str"), ) ) diff --git a/plugins/modules/cluster.py b/plugins/modules/cluster.py index b1affa96..e405042c 100644 --- a/plugins/modules/cluster.py +++ b/plugins/modules/cluster.py @@ -32,7 +32,7 @@ version_added: "3.0.0" cluster_type: description: - - type of the cluster + - type of the cluster. Required if I(state=present) and the cluster does not exist yet required: false type: raw version_added: "3.0.0" @@ -42,9 +42,9 @@ required: false type: raw version_added: "3.0.0" - site: + location: description: - - Required if I(state=present) and the cluster does not exist yet + - Cluster location. required: false type: raw version_added: "3.0.0" @@ -94,14 +94,14 @@ - Schnozzberry state: present - - name: Update the group and site of an existing cluster + - name: Update the group and location of an existing cluster networktocode.nautobot.cluster: url: http://nautobot.local token: thisIsMyToken name: Test Cluster cluster_type: qemu cluster_group: GROUP - site: SITE + location: "{{ location['key'] }}" state: present """ @@ -135,7 +135,7 @@ def main(): name=dict(required=True, type="str"), cluster_type=dict(required=False, type="raw"), cluster_group=dict(required=False, type="raw"), - site=dict(required=False, type="raw"), + location=dict(required=False, type="raw"), tenant=dict(required=False, type="raw"), comments=dict(required=False, type="str"), tags=dict(required=False, type="list", elements="raw"), @@ -143,7 +143,12 @@ def main(): ) ) - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + required_if = [ + ("state", "present", ["name", "cluster_type"]), + ("state", "absent", ["name"]), + ] + + module = AnsibleModule(argument_spec=argument_spec, required_if=required_if, supports_check_mode=True) cluster = NautobotVirtualizationModule(module, NB_CLUSTERS) cluster.run() diff --git a/plugins/modules/cluster_group.py b/plugins/modules/cluster_group.py index 5e3285a3..de9c06c9 100644 --- a/plugins/modules/cluster_group.py +++ b/plugins/modules/cluster_group.py @@ -28,10 +28,9 @@ required: true type: str version_added: "3.0.0" - slug: + description: description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided + - The description of the cluster group required: false type: str version_added: "3.0.0" @@ -87,7 +86,7 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), + description=dict(required=False, type="str"), ) ) diff --git a/plugins/modules/cluster_type.py b/plugins/modules/cluster_type.py index 13a1158f..7f6fffdc 100644 --- a/plugins/modules/cluster_type.py +++ b/plugins/modules/cluster_type.py @@ -28,10 +28,9 @@ required: true type: str version_added: "3.0.0" - slug: + description: description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided + - The description of the cluster type required: false type: str version_added: "3.0.0" @@ -87,7 +86,7 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), + description=dict(required=False, type="str"), ) ) diff --git a/plugins/modules/device.py b/plugins/modules/device.py index 763f711a..486cb1cc 100644 --- a/plugins/modules/device.py +++ b/plugins/modules/device.py @@ -38,7 +38,7 @@ required: false type: raw version_added: "3.0.0" - device_role: + role: description: - Required if I(state=present) and the device does not exist yet required: false @@ -68,11 +68,11 @@ required: false type: str version_added: "3.0.0" - site: + location: description: - Required if I(state=present) and the device does not exist yet required: false - type: raw + type: str version_added: "3.0.0" rack: description: @@ -146,7 +146,7 @@ required: false type: str version_added: "3.0.0" - local_context_data: + local_config_context_data: description: - Arbitrary JSON data to define the devices configuration variables. required: false @@ -167,10 +167,12 @@ token: thisIsMyToken name: Test Device device_type: C9410R - device_role: Core Switch - site: Main + role: Core Switch + location: "{{ my_location['key'] }}" status: active state: present + vars: + my_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\"') }}" - name: Create device within Nautobot with empty string name to generate UUID networktocode.nautobot.device: @@ -178,10 +180,12 @@ token: thisIsMyToken name: "" device_type: C9410R - device_role: Core Switch - site: Main + role: Core Switch + location: "{{ my_location['key'] }}" status: active state: present + vars: + my_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\"') }}" - name: Delete device within nautobot networktocode.nautobot.device: @@ -196,14 +200,16 @@ token: thisIsMyToken name: Another Test Device device_type: C9410R - device_role: Core Switch - site: Main + role: Core Switch + location: "{{ my_location['key'] }}" status: active - local_context_data: + local_config_context_data: bgp: "65000" tags: - Schnozzberry state: present + vars: + my_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\"') }}" - name: Update the rack and position of an existing device networktocode.nautobot.device: @@ -246,12 +252,12 @@ def main(): dict( name=dict(required=True, type="str"), device_type=dict(required=False, type="raw"), - device_role=dict(required=False, type="raw"), + role=dict(required=False, type="raw"), tenant=dict(required=False, type="raw"), platform=dict(required=False, type="raw"), serial=dict(required=False, type="str"), asset_tag=dict(required=False, type="str"), - site=dict(required=False, type="raw"), + location=dict(required=False, type="str"), rack=dict(required=False, type="raw"), position=dict(required=False, type="int"), face=dict( @@ -268,7 +274,7 @@ def main(): vc_priority=dict(required=False, type="int"), comments=dict(required=False, type="str"), tags=dict(required=False, type="list", elements="raw"), - local_context_data=dict(required=False, type="dict"), + local_config_context_data=dict(required=False, type="dict"), custom_fields=dict(required=False, type="dict"), ) ) diff --git a/plugins/modules/device_interface.py b/plugins/modules/device_interface.py index 53a5d883..b00e016f 100644 --- a/plugins/modules/device_interface.py +++ b/plugins/modules/device_interface.py @@ -189,12 +189,12 @@ type: 1000Base-t (1GE) untagged_vlan: name: Wireless - site: Test Site + location: "{{ location['key'] }}" tagged_vlans: - name: Data - site: Test Site + location: "{{ location['key'] }}" - name: VoIP - site: Test Site + location: "{{ location['key'] }}" mtu: 1600 mgmt_only: true mode: Tagged @@ -285,8 +285,11 @@ def main(): custom_fields=dict(required=False, type="dict"), ) ) + required_if = [ + ("state", "present", ["status"]), + ] - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + module = AnsibleModule(argument_spec=argument_spec, required_if=required_if, supports_check_mode=True) device_interface = NautobotDcimModule(module, NB_INTERFACES, remove_keys=["update_vc_child"]) device_interface.run() diff --git a/plugins/modules/device_type.py b/plugins/modules/device_type.py index 4c53b5b9..88aa1727 100644 --- a/plugins/modules/device_type.py +++ b/plugins/modules/device_type.py @@ -36,14 +36,6 @@ required: true type: raw version_added: "3.0.0" - slug: - description: - - The slug of the device type. Must follow slug formatting (URL friendly) - - If not specified, it will slugify the model - - ex. test-device-type - required: false - type: str - version_added: "3.0.0" part_number: description: - The part number of the device type @@ -92,7 +84,6 @@ networktocode.nautobot.device_type: url: http://nautobot.local token: thisIsMyToken - slug: test-device-type model: ws-test-3750 manufacturer: Test Manufacturer state: present @@ -101,7 +92,6 @@ networktocode.nautobot.device_type: url: http://nautobot.local token: thisIsMyToken - slug: test-device-type model: ws-test-3750 manufacturer: Test Manufacturer part_number: ws-3750g-v2 @@ -114,7 +104,7 @@ networktocode.nautobot.device_type: url: http://nautobot.local token: thisIsMyToken - slug: test-device-type + model: ws-test-3750 state: absent """ @@ -147,7 +137,6 @@ def main(): dict( manufacturer=dict(required=False, type="raw"), model=dict(required=True, type="raw"), - slug=dict(required=False, type="str"), part_number=dict(required=False, type="str"), u_height=dict(required=False, type="int"), is_full_depth=dict(required=False, type="bool"), diff --git a/plugins/modules/ip_address.py b/plugins/modules/ip_address.py index 4204b3d5..ef7017d4 100644 --- a/plugins/modules/ip_address.py +++ b/plugins/modules/ip_address.py @@ -31,27 +31,24 @@ required: false type: str version_added: "3.0.0" - prefix: + namespace: + description: + - | + namespace that IP address is associated with. IPs are unique per namespaces. + required: false + default: Global + type: str + version_added: "5.0.0" + parent: description: - | - With state C(present), if an interface is given, it will ensure - that an IP inside this prefix (and vrf, if given) is attached - to this interface. Otherwise, it will get the next available IP - of this prefix and attach it. With state C(new), it will force to get the next available IP in - this prefix. If an interface is given, it will also force to attach - it. + this prefix. Required if state is C(present) or C(new) when no address is given. Unused if an address is specified. required: false type: raw version_added: "3.0.0" - vrf: - description: - - VRF that IP address is associated with - required: false - type: raw - version_added: "3.0.0" tenant: description: - The tenant that the device will be assigned to @@ -68,18 +65,19 @@ role: description: - The role of the IP address + required: false + type: raw + version_added: "3.0.0" + type: + description: + - The type of the IP address choices: - - Loopback - - Secondary - - Anycast - - VIP - - VRRP - - HSRP - - GLBP - - CARP + - DHCP + - Host + - SLAAC required: false type: str - version_added: "3.0.0" + version_added: "5.0.0" description: description: - The description of the interface @@ -98,28 +96,6 @@ required: false type: str version_added: "3.0.0" - assigned_object: - description: - - Definition of the assigned object. - required: false - type: dict - suboptions: - name: - description: - - The name of the interface - type: str - required: False - device: - description: - - The device the interface is attached to. - type: str - required: False - virtual_machine: - description: - - The virtual machine the interface is attached to. - type: str - required: False - version_added: "3.0.0" state: description: - | @@ -152,11 +128,18 @@ token: thisIsMyToken address: 192.168.1.10 state: new + - name: Create the same IP under another namespace + networktocode.nautobot.ip_address: + url: http://nautobot.local + token: thisIsMyToken + address: 192.168.1.10 + namespace: MyNewNamespace + state: new - name: Get a new available IP inside 192.168.1.0/24 networktocode.nautobot.ip_address: url: http://nautobot.local token: thisIsMyToken - prefix: 192.168.1.0/24 + parent: 192.168.1.0/24 state: new - name: Delete IP address within nautobot networktocode.nautobot.ip_address: @@ -164,14 +147,14 @@ token: thisIsMyToken address: 192.168.1.10 state: absent - - name: Create IP address with several specified options + - name: Create IP address with several specified options in namespace Private networktocode.nautobot.ip_address: url: http://nautobot.local token: thisIsMyToken address: 192.168.1.20 - vrf: Test tenant: Test Tenant status: Reserved + namespace: Private role: Loopback description: Test description tags: @@ -182,33 +165,8 @@ url: http://nautobot.local token: thisIsMyToken address: 192.168.1.30 - vrf: Test nat_inside: address: 192.168.1.20 - vrf: Test - assigned_object: - name: GigabitEthernet1 - device: test100 - - name: Ensure that an IP inside 192.168.1.0/24 is attached to GigabitEthernet1 - networktocode.nautobot.ip_address: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.1.0/24 - vrf: Test - assigned_object: - name: GigabitEthernet1 - device: test100 - state: present - - name: Attach a new available IP of 192.168.1.0/24 to GigabitEthernet1 - networktocode.nautobot.ip_address: - url: http://nautobot.local - token: thisIsMyToken - prefix: 192.168.1.0/24 - vrf: Test - assigned_object: - name: GigabitEthernet1 - device: test100 - state: new """ RETURN = r""" @@ -241,44 +199,34 @@ def main(): argument_spec.update( dict( address=dict(required=False, type="str"), - prefix=dict(required=False, type="raw"), - vrf=dict(required=False, type="raw"), + parent=dict(required=False, type="raw"), tenant=dict(required=False, type="raw"), status=dict(required=False, type="raw"), - role=dict( + role=dict(required=False, type="raw"), + type=dict( required=False, type="str", - choices=["Loopback", "Secondary", "Anycast", "VIP", "VRRP", "HSRP", "GLBP", "CARP"], + choices=["DHCP", "Host", "SLAAC"], ), description=dict(required=False, type="str"), nat_inside=dict(required=False, type="raw"), dns_name=dict(required=False, type="str"), - assigned_object=dict( - required=False, - type="dict", - options=dict( - name=dict(required=False, type="str"), - device=dict(required=False, type="str"), - virtual_machine=dict(required=False, type="str"), - ), - ), + namespace=dict(required=False, type="str", default="Global"), tags=dict(required=False, type="list", elements="raw"), custom_fields=dict(required=False, type="dict"), ) ) required_if = [ - ("state", "present", ["address", "prefix", "status"], True), + ("state", "present", ["address", "parent", "status"], True), ("state", "absent", ["address"]), - ("state", "new", ["address", "prefix"], True), + ("state", "new", ["address", "parent"], True), ] - mutually_exclusive = [["address", "prefix"]] module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, required_if=required_if, - mutually_exclusive=mutually_exclusive, ) ip_address = NautobotIpamModule(module, NB_IP_ADDRESSES) diff --git a/plugins/modules/ip_address_to_interface.py b/plugins/modules/ip_address_to_interface.py new file mode 100644 index 00000000..b44df9a1 --- /dev/null +++ b/plugins/modules/ip_address_to_interface.py @@ -0,0 +1,134 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright: (c) 2018, Mikhail Yohman (@FragmentedPacket) +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = r""" +--- +module: ip_address_to_interface +short_description: Creates or removes IP address to interface association from Nautobot +description: + - Creates or removes IP address to interface association from Nautobot +notes: + - Tags should be defined as a YAML list + - This should be ran with connection C(local) and hosts C(localhost) +author: + - Mikhail Yohman (@FragmentedPacket) + - Anthony Ruhier (@Anthony25) +version_added: "5.0.0" +extends_documentation_fragment: + - networktocode.nautobot.fragments.base +options: + ip_address: + description: + - IP address to associate with an interface. + required: true + type: raw + version_added: "5.0.0" + interface: + description: + - Device interface to associate with an IP. + required: false + type: raw + version_added: "5.0.0" + vm_interface: + description: + - VM interface to associate with an IP. + required: false + type: raw + version_added: "5.0.0" + state: + description: + - Use C(present) or C(absent) for adding, or removing. + choices: [ absent, present ] + default: present + type: str +""" + +EXAMPLES = r""" +- name: "Test Nautobot IP address to interface module" + connection: local + hosts: localhost + gather_facts: False + + tasks: + - name: "Add IP address on GigabitEthernet4 - test100" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address['key'] }}" + interface: + name: GigabitEthernet4 + device: test100 + vars: + ip_address: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=10.100.0.1/32') }}" + + - name: "Delete IP address on GigabitEthernet4 - test100" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address['key'] }}" + interface: + name: GigabitEthernet4 + device: test100 + state: absent + vars: + ip_address: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=10.100.0.1/32') }}" + +""" + +RETURN = r""" +ip_address_to_interface: + description: Serialized object as created or already existent within Nautobot + returned: on creation + type: dict +msg: + description: Message indicating failure or info about what has been achieved + returned: always + type: str +""" + +from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NAUTOBOT_ARG_SPEC +from ansible_collections.networktocode.nautobot.plugins.module_utils.ipam import ( + NautobotIpamModule, + NB_IP_ADDRESS_TO_INTERFACE, +) +from ansible.module_utils.basic import AnsibleModule +from copy import deepcopy + + +def main(): + """ + Main entry point for module execution + """ + argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) + argument_spec.update( + dict( + ip_address=dict(required=True, type="raw"), + interface=dict(required=False, type="raw"), + vm_interface=dict(required=False, type="raw"), + ) + ) + required_one_of = [ + ("interface", "vm_interface"), + ] + mutually_exclusive = [ + ("interface", "vm_interface"), + ] + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + required_one_of=required_one_of, + mutually_exclusive=mutually_exclusive, + ) + + ip_address = NautobotIpamModule(module, NB_IP_ADDRESS_TO_INTERFACE) + ip_address.run() + + +if __name__ == "__main__": # pragma: no cover + main() diff --git a/plugins/modules/ipam_role.py b/plugins/modules/ipam_role.py deleted file mode 100644 index 44a9bba6..00000000 --- a/plugins/modules/ipam_role.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright: (c) 2019, Mikhail Yohman (@FragmentedPacket) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -DOCUMENTATION = r""" ---- -module: ipam_role -short_description: Creates or removes ipam roles from Nautobot -description: - - Creates or removes ipam roles from Nautobot -notes: - - Tags should be defined as a YAML list - - This should be ran with connection C(local) and hosts C(localhost) -author: - - Mikhail Yohman (@FragmentedPacket) -version_added: "1.0.0" -extends_documentation_fragment: - - networktocode.nautobot.fragments.base -options: - name: - description: - - Name of the ipam role to be created - required: true - type: str - version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" - weight: - description: - - The weight of the ipam role to be created - required: false - type: int - version_added: "3.0.0" -""" - -EXAMPLES = r""" -- name: "Test Nautobot module" - connection: local - hosts: localhost - gather_facts: False - tasks: - - name: Create ipam role within Nautobot with only required information - networktocode.nautobot.ipam_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test IPAM Role - state: present - - - name: Delete ipam role within nautobot - networktocode.nautobot.ipam_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test IPAM Role - state: absent -""" - -RETURN = r""" -role: - description: Serialized object as created or already existent within Nautobot - returned: on creation - type: dict -msg: - description: Message indicating failure or info about what has been achieved - returned: always - type: str -""" - -from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NAUTOBOT_ARG_SPEC -from ansible_collections.networktocode.nautobot.plugins.module_utils.ipam import ( - NautobotIpamModule, - NB_IPAM_ROLES, -) -from ansible.module_utils.basic import AnsibleModule -from copy import deepcopy - - -def main(): - """ - Main entry point for module execution - """ - argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) - argument_spec.update( - dict( - name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), - weight=dict(required=False, type="int"), - ) - ) - - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) - - ipam_role = NautobotIpamModule(module, NB_IPAM_ROLES) - ipam_role.run() - - -if __name__ == "__main__": # pragma: no cover - main() diff --git a/plugins/modules/location.py b/plugins/modules/location.py index 99704e43..918e92a7 100644 --- a/plugins/modules/location.py +++ b/plugins/modules/location.py @@ -25,14 +25,16 @@ - networktocode.nautobot.fragments.base - networktocode.nautobot.fragments.custom_fields options: - name: + id: description: - - Name of the location to be created - required: true + - Primary Key of the location, used to delete the location. + - Because of hierarchical nature of locations and name being not unique across locations, + - it's a user responsibility to query location and pass its id(PK) to the task to delete the location. + required: false type: str - slug: + name: description: - - URL-friendly unique shorthand + - Name of the location to be created required: false type: str status: @@ -52,16 +54,11 @@ - Required if I(state=present) and does not exist yet required: false type: raw - parent: + parent_location: description: - The parent location this location should be tied to required: false type: raw - site: - description: - - The site this location should be tied to - required: false - type: raw """ EXAMPLES = r""" @@ -75,7 +72,7 @@ url: http://nautobot.local token: thisIsMyToken name: My Location - status: active + status: Active location_type: name: My Location Type state: present @@ -84,22 +81,22 @@ networktocode.nautobot.location: url: http://nautobot.local token: thisIsMyToken - name: My Location + id: "{{ location_to_delete['key'] }}" state: absent + vars: + location_to_delete: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Location\" parent_location=\"Location Parent\" location_type=\"Main Type\"') }}" - name: Create location with all parameters networktocode.nautobot.location: url: http://nautobot.local token: thisIsMyToken name: My Nested Location - status: active + status: Active location_type: name: My Location Type description: My Nested Location Description - parent: + parent_location: name: My Location - site: - name: My Site state: present """ @@ -130,20 +127,19 @@ def main(): argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) argument_spec.update( dict( - name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), + id=dict(required=False, type="str"), + name=dict(required=False, type="str"), status=dict(required=False, type="raw"), description=dict(required=False, type="str"), location_type=dict(required=False, type="raw"), - parent=dict(required=False, type="raw"), - site=dict(required=False, type="raw"), + parent_location=dict(required=False, type="raw"), custom_fields=dict(required=False, type="dict"), ) ) required_if = [ ("state", "present", ["name", "location_type", "status"]), - ("state", "absent", ["name"]), + ("state", "absent", ["id"]), ] module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_if=required_if) diff --git a/plugins/modules/location_type.py b/plugins/modules/location_type.py index 7bae09dd..32adfbb5 100644 --- a/plugins/modules/location_type.py +++ b/plugins/modules/location_type.py @@ -30,11 +30,6 @@ - Name of the location type to be created required: true type: str - slug: - description: - - URL-friendly unique shorthand - required: false - type: str description: description: - Location Type description @@ -121,7 +116,6 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), description=dict(required=False, type="str"), parent=dict(required=False, type="raw"), nestable=dict(required=False, type="bool"), diff --git a/plugins/modules/manufacturer.py b/plugins/modules/manufacturer.py index 9141f093..14032dd9 100644 --- a/plugins/modules/manufacturer.py +++ b/plugins/modules/manufacturer.py @@ -28,13 +28,6 @@ required: true type: str version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" description: description: - Applies to the description field for Nautobot Manufacturer @@ -94,7 +87,6 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), description=dict(required=False, type="str"), ) ) diff --git a/plugins/modules/nautobot_server.py b/plugins/modules/nautobot_server.py index 4531f8f3..25f96b26 100644 --- a/plugins/modules/nautobot_server.py +++ b/plugins/modules/nautobot_server.py @@ -38,6 +38,7 @@ This translates {"name_arg": "value_arg"} to "--name_arg value_arg". type: dict required: false + default: {} positional_args: description: - A list of additional arguments to append to the end of the command that is passed to C(nautobot-server). @@ -45,12 +46,14 @@ type: list required: false elements: str + default: [] flags: description: - A list of flags to append to the command that is passed to C(nautobot-server), so that ["flag1", "flag2"] is translated to "--flag1 --flag2". type: list required: false elements: str + default: [] project_path: description: - The path to the root of the Nautobot application where B(nautobot-server) lives. @@ -189,7 +192,6 @@ def collectstatic_changed(line): def main(): - # Commands that are known to use the --noinput flag commands_with_noinput = { "createsuperuser", diff --git a/plugins/modules/platform.py b/plugins/modules/platform.py index d9d02ee2..0bed642c 100644 --- a/plugins/modules/platform.py +++ b/plugins/modules/platform.py @@ -28,13 +28,6 @@ required: true type: str version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" description: description: - The description of the platform @@ -122,7 +115,6 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), description=dict(required=False, type="str"), manufacturer=dict(required=False, type="raw"), napalm_driver=dict(required=False, type="str"), diff --git a/plugins/modules/plugin.py b/plugins/modules/plugin.py index 9c81056d..e964d9f5 100644 --- a/plugins/modules/plugin.py +++ b/plugins/modules/plugin.py @@ -37,7 +37,7 @@ identifiers: aliases: [ids] description: - - Plugin object identifier(s) like name, slug, etc. + - Plugin object identifier(s) like name, model, etc. required: true type: dict version_added: "4.4.0" diff --git a/plugins/modules/power_panel.py b/plugins/modules/power_panel.py index c146fc6d..7cf4d5f9 100644 --- a/plugins/modules/power_panel.py +++ b/plugins/modules/power_panel.py @@ -23,9 +23,9 @@ extends_documentation_fragment: - networktocode.nautobot.fragments.base options: - site: + location: description: - - The site the power panel is located in + - The location the power panel is located in required: true type: raw version_added: "3.0.0" @@ -55,7 +55,7 @@ url: http://nautobot.local token: thisIsMyToken name: Test Power Panel - site: Test Site + location: Test location state: present - name: Update power panel with other fields @@ -63,7 +63,7 @@ url: http://nautobot.local token: thisIsMyToken name: Test Power Panel - site: Test Site + location: Test location rack_group: Test Rack Group state: present @@ -72,7 +72,7 @@ url: http://nautobot.local token: thisIsMyToken name: Test Power Panel - site: Test Site + location: Test location state: absent """ @@ -103,7 +103,7 @@ def main(): argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) argument_spec.update( dict( - site=dict(required=True, type="raw"), + location=dict(required=True, type="raw"), rack_group=dict(required=False, type="raw"), name=dict(required=True, type="str"), ) diff --git a/plugins/modules/prefix.py b/plugins/modules/prefix.py index 2549fad6..70dd75ac 100644 --- a/plugins/modules/prefix.py +++ b/plugins/modules/prefix.py @@ -25,18 +25,26 @@ - networktocode.nautobot.fragments.tags - networktocode.nautobot.fragments.custom_fields options: - family: + ip_version: description: - - Specifies which address family the prefix prefix belongs to + - Specifies which address version the prefix prefix belongs to required: false type: int - version_added: "3.0.0" + version_added: "5.0.0" prefix: description: - Required if state is C(present) and first_available is False. Will allocate or free this prefix. required: false type: raw version_added: "3.0.0" + namespace: + description: + - | + namespace that IP address is associated with. IPs are unique per namespaces. + required: false + default: Global + type: str + version_added: "5.0.0" parent: description: - Required if state is C(present) and first_available is C(yes). Will get a new available prefix in this parent prefix. @@ -51,15 +59,9 @@ required: false type: int version_added: "3.0.0" - site: - description: - - Site that prefix is associated with - required: false - type: raw - version_added: "3.0.0" - vrf: + location: description: - - VRF that prefix is associated with + - Location that prefix is associated with required: false type: raw version_added: "3.0.0" @@ -82,18 +84,22 @@ required: false type: raw version_added: "3.0.0" - prefix_role: + role: description: - The role of the prefix required: false type: raw version_added: "3.0.0" - is_pool: + type: description: - - All IP Addresses within this prefix are considered usable + - Prefix type + choices: + - Container + - Network + - Pool required: false - type: bool - version_added: "3.0.0" + type: str + version_added: "5.0.0" description: description: - The description of the prefix @@ -104,7 +110,7 @@ description: - If C(yes) and state C(present), if an parent is given, it will get the first available prefix of the given prefix_length inside the given parent (and - vrf, if given). + namespace, if given). Unused with state C(absent). default: false type: bool @@ -139,18 +145,17 @@ token: thisIsMyToken family: 4 prefix: 10.156.32.0/19 - site: Test Site - vrf: Test VRF + location: Test Location tenant: Test Tenant vlan: name: Test VLAN - site: Test Site + location: Test Location tenant: Test Tenant vlan_group: Test Vlan Group status: Reserved - prefix_role: Network of care + role: Network of care description: Test description - is_pool: true + type: Pool tags: - Schnozzberry state: present @@ -186,8 +191,7 @@ token: thisIsMyToken parent: 10.157.0.0/19 prefix_length: 24 - vrf: Test VRF - site: Test Site + location: Test Location state: present first_available: yes """ @@ -220,18 +224,22 @@ def main(): argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) argument_spec.update( dict( - family=dict(required=False, type="int"), + ip_version=dict(required=False, type="int"), prefix=dict(required=False, type="raw"), parent=dict(required=False, type="raw"), prefix_length=dict(required=False, type="int"), - site=dict(required=False, type="raw"), - vrf=dict(required=False, type="raw"), + location=dict(required=False, type="raw"), tenant=dict(required=False, type="raw"), vlan=dict(required=False, type="raw"), status=dict(required=False, type="raw"), - prefix_role=dict(required=False, type="raw"), - is_pool=dict(required=False, type="bool"), + role=dict(required=False, type="raw"), + type=dict( + required=False, + type="str", + choices=["Container", "Network", "Pool"], + ), description=dict(required=False, type="str"), + namespace=dict(required=False, type="str", default="Global"), tags=dict(required=False, type="list", elements="raw"), custom_fields=dict(required=False, type="dict"), first_available=dict(required=False, type="bool", default=False), diff --git a/plugins/modules/query_graphql.py b/plugins/modules/query_graphql.py index 041f10cd..ff7b5e04 100644 --- a/plugins/modules/query_graphql.py +++ b/plugins/modules/query_graphql.py @@ -23,6 +23,7 @@ - Dictionary of keys/values to pass into the GraphQL query, see (U(https://pynautobot.readthedocs.io/en/latest/advanced/graphql.html)) for more info required: False type: dict + default: {} query: description: - The GraphQL formatted query string, see (U(https://pynautobot.readthedocs.io/en/latest/advanced/graphql.html)) for more details. @@ -65,17 +66,17 @@ set_fact: query_string: | query { - sites { + locations { id name - region { + parent { name } } } # Make query to GraphQL Endpoint - - name: Obtain list of sites from Nautobot + - name: Obtain list of locations from Nautobot networktocode.nautobot.query_graphql: url: http://nautobot.local token: thisIsMyToken @@ -86,20 +87,20 @@ - name: SET FACTS TO SEND TO GRAPHQL ENDPOINT set_fact: graph_variables: - site_name: AMS01 + $location_name: AMS01 query_string: | - query ($site_name: String!) { - sites (slug: $site_name) { + query ($location_name: String!) { + locations (name: $location_name) { id name - region { + parent { name } } } # Get Response with variables and set to root keys - - name: Obtain list of devices at site in variables from Nautobot + - name: Obtain list of devices at location in variables from Nautobot networktocode.nautobot.query_graphql: url: http://nautobot.local token: thisIsMyToken diff --git a/plugins/modules/rack.py b/plugins/modules/rack.py index e5934be8..2ef22fba 100644 --- a/plugins/modules/rack.py +++ b/plugins/modules/rack.py @@ -37,7 +37,7 @@ required: false type: str version_added: "3.0.0" - site: + location: description: - Required if I(state=present) and the rack does not exist yet. required: false @@ -62,7 +62,7 @@ required: false type: raw version_added: "3.0.0" - rack_role: + role: description: - The rack role the rack will be associated to. required: false @@ -156,7 +156,7 @@ url: http://nautobot.local token: thisIsMyToken name: Test rack - site: Test Site + location: Test Location status: active state: present @@ -197,11 +197,11 @@ def main(): dict( name=dict(required=True, type="str"), facility_id=dict(required=False, type="str"), - site=dict(required=False, type="raw"), + location=dict(required=False, type="raw"), rack_group=dict(required=False, type="raw"), tenant=dict(required=False, type="raw"), status=dict(required=False, type="raw"), - rack_role=dict(required=False, type="raw"), + role=dict(required=False, type="raw"), serial=dict(required=False, type="str"), asset_tag=dict(required=False, type="str"), type=dict( diff --git a/plugins/modules/rack_group.py b/plugins/modules/rack_group.py index cf8aac48..d89b23a2 100644 --- a/plugins/modules/rack_group.py +++ b/plugins/modules/rack_group.py @@ -34,14 +34,7 @@ required: true type: str version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" - site: + location: description: - Required if I(state=present) and the rack does not exist yet required: false @@ -53,12 +46,6 @@ required: false type: raw version_added: "3.0.0" - region: - description: - - The region the rack group will be assigned to - required: false - type: raw - version_added: "3.0.0" """ EXAMPLES = r""" @@ -73,7 +60,7 @@ url: http://nautobot.local token: thisIsMyToken name: Test rack group - site: Test Site + location: Test Location state: present - name: Delete rack group within nautobot @@ -81,7 +68,7 @@ url: http://nautobot.local token: thisIsMyToken name: Test Rack group - site: Test Site + location: Test Location state: absent """ @@ -113,10 +100,8 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), description=dict(required=False, type="str"), - site=dict(required=False, type="raw"), - region=dict(required=False, type="raw"), + location=dict(required=False, type="raw"), parent_rack_group=dict(required=False, type="raw"), ) ) diff --git a/plugins/modules/rack_role.py b/plugins/modules/rack_role.py deleted file mode 100644 index b519ea0e..00000000 --- a/plugins/modules/rack_role.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright: (c) 2018, Mikhail Yohman (@FragmentedPacket) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -DOCUMENTATION = r""" ---- -module: rack_role -short_description: Create, update or delete racks roles within Nautobot -description: - - Creates, updates or removes racks roles from Nautobot -notes: - - Tags should be defined as a YAML list - - This should be ran with connection C(local) and hosts C(localhost) -author: - - Mikhail Yohman (@FragmentedPacket) -version_added: "1.0.0" -extends_documentation_fragment: - - networktocode.nautobot.fragments.base -options: - name: - description: - - The name of the rack role - required: true - type: str - version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" - color: - description: - - Hexidecimal code for a color, ex. FFFFFF - required: false - type: str - version_added: "3.0.0" -""" - -EXAMPLES = r""" -- name: "Test Nautobot modules" - connection: local - hosts: localhost - gather_facts: False - - tasks: - - name: Create rack role within Nautobot with only required information - networktocode.nautobot.rack_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test rack role - color: FFFFFF - state: present - - - name: Delete rack role within nautobot - networktocode.nautobot.rack_role: - url: http://nautobot.local - token: thisIsMyToken - name: Test Rack role - state: absent -""" - -RETURN = r""" -rack_role: - description: Serialized object as created or already existent within Nautobot - returned: success (when I(state=present)) - type: dict -msg: - description: Message indicating failure or info about what has been achieved - returned: always - type: str -""" - -from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NAUTOBOT_ARG_SPEC -from ansible_collections.networktocode.nautobot.plugins.module_utils.dcim import ( - NautobotDcimModule, - NB_RACK_ROLES, -) -from ansible.module_utils.basic import AnsibleModule -from copy import deepcopy - - -def main(): - """ - Main entry point for module execution - """ - argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) - argument_spec.update( - dict( - name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), - color=dict(required=False, type="str"), - ) - ) - - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) - - rack_role = NautobotDcimModule(module, NB_RACK_ROLES) - rack_role.run() - - -if __name__ == "__main__": # pragma: no cover - main() diff --git a/plugins/modules/region.py b/plugins/modules/region.py deleted file mode 100644 index 5fb75842..00000000 --- a/plugins/modules/region.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright: (c) 2019, Mikhail Yohman (@FragmentedPacket) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -DOCUMENTATION = r""" ---- -module: region -short_description: Creates or removes regions from Nautobot -description: - - Creates or removes regions from Nautobot -notes: - - Tags should be defined as a YAML list - - This should be ran with connection C(local) and hosts C(localhost) -author: - - Mikhail Yohman (@FragmentedPacket) -version_added: "1.0.0" -extends_documentation_fragment: - - networktocode.nautobot.fragments.base -options: - name: - description: - - Name of the region to be created - required: true - type: str - version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" - parent_region: - description: - - The parent region this region should be tied to - required: false - type: raw - version_added: "3.0.0" -""" - -EXAMPLES = r""" -- name: "Test Nautobot region module" - connection: local - hosts: localhost - gather_facts: False - tasks: - - name: Create tenant within Nautobot with only required information - networktocode.nautobot.region: - url: http://nautobot.local - token: thisIsMyToken - name: "Test Region One" - state: present - - - name: Delete tenant within nautobot - networktocode.nautobot.region: - url: http://nautobot.local - token: thisIsMyToken - name: Tenant Group ABC - state: absent -""" - -RETURN = r""" -region: - description: Serialized object as created or already existent within Nautobot - returned: on creation - type: dict -msg: - description: Message indicating failure or info about what has been achieved - returned: always - type: str -""" - -from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NAUTOBOT_ARG_SPEC -from ansible_collections.networktocode.nautobot.plugins.module_utils.dcim import ( - NautobotDcimModule, - NB_REGIONS, -) -from ansible.module_utils.basic import AnsibleModule -from copy import deepcopy - - -def main(): - """ - Main entry point for module execution - """ - argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) - argument_spec.update( - dict( - name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), - parent_region=dict(required=False, type="raw"), - ) - ) - - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) - - region = NautobotDcimModule(module, NB_REGIONS) - region.run() - - -if __name__ == "__main__": # pragma: no cover - main() diff --git a/plugins/modules/rir.py b/plugins/modules/rir.py index 98b3b0b8..b0c327d0 100644 --- a/plugins/modules/rir.py +++ b/plugins/modules/rir.py @@ -28,13 +28,6 @@ required: true type: str version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" is_private: description: - IP space managed by this RIR is considered private @@ -101,7 +94,6 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), is_private=dict(required=False, type="bool"), ) ) diff --git a/plugins/modules/device_role.py b/plugins/modules/role.py similarity index 63% rename from plugins/modules/device_role.py rename to plugins/modules/role.py index 087f0b8e..30ba2f91 100644 --- a/plugins/modules/device_role.py +++ b/plugins/modules/role.py @@ -9,49 +9,48 @@ DOCUMENTATION = r""" --- -module: device_role -short_description: Create, update or delete devices roles within Nautobot +module: role +short_description: Create, update or delete roles within Nautobot description: - - Creates, updates or removes devices roles from Nautobot + - Creates, updates or removes roles from Nautobot notes: - Tags should be defined as a YAML list - This should be ran with connection C(local) and hosts C(localhost) author: - Mikhail Yohman (@FragmentedPacket) -version_added: "1.0.0" +version_added: "5.0.0" extends_documentation_fragment: - networktocode.nautobot.fragments.base options: name: description: - - The name of the device role + - The name of the role required: true type: str - version_added: "3.0.0" + version_added: "5.0.0" description: description: - - The description of the device role + - The description of the role required: false type: str - version_added: "3.0.0" + version_added: "5.0.0" color: description: - Hexidecimal code for a color, ex. FFFFFF required: false type: str - version_added: "3.0.0" - slug: + version_added: "5.0.0" + content_types: description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" - vm_role: + - Model names which the role can be related to. + type: list + elements: str + version_added: "5.0.0" + weight: description: - - Whether the role is a VM role - type: bool - version_added: "3.0.0" + - Weight assigned to the role. + type: int + version_added: "5.0.0" """ EXAMPLES = r""" @@ -61,24 +60,26 @@ gather_facts: False tasks: - - name: Create device role within Nautobot with only required information - networktocode.nautobot.device_role: + - name: Create role within Nautobot with only required information + networktocode.nautobot.role: url: http://nautobot.local token: thisIsMyToken - name: Test device role + name: Test role color: FFFFFF + content_types: + - "dcim.device" state: present - - name: Delete device role within nautobot - networktocode.nautobot.device_role: + - name: Delete role within nautobot + networktocode.nautobot.role: url: http://nautobot.local token: thisIsMyToken - name: Test Rack role + name: Test role state: absent """ RETURN = r""" -device_role: +role: description: Serialized object as created or already existent within Nautobot returned: success (when I(state=present)) type: dict @@ -90,7 +91,7 @@ from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NAUTOBOT_ARG_SPEC from ansible_collections.networktocode.nautobot.plugins.module_utils.dcim import ( NautobotDcimModule, - NB_DEVICE_ROLES, + NB_ROLES, ) from ansible.module_utils.basic import AnsibleModule from copy import deepcopy @@ -106,15 +107,20 @@ def main(): name=dict(required=True, type="str"), description=dict(required=False, type="str"), color=dict(required=False, type="str"), - slug=dict(required=False, type="str"), - vm_role=dict(required=False, type="bool"), + content_types=dict(required=False, type="list", elements="str"), + weight=dict(required=False, type="int"), ) ) - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + required_if = [ + ("state", "present", ["name", "content_types"], True), + ("state", "absent", ["name"]), + ] + + module = AnsibleModule(argument_spec=argument_spec, required_if=required_if, supports_check_mode=True) - device_role = NautobotDcimModule(module, NB_DEVICE_ROLES) - device_role.run() + role = NautobotDcimModule(module, NB_ROLES) + role.run() if __name__ == "__main__": # pragma: no cover diff --git a/plugins/modules/service.py b/plugins/modules/service.py index 85ff3299..4a21904a 100644 --- a/plugins/modules/service.py +++ b/plugins/modules/service.py @@ -54,7 +54,7 @@ required: true type: raw version_added: "3.0.0" - ipaddresses: + ip_addresses: description: - Specifies which IPaddresses to associate with service. required: false @@ -84,7 +84,7 @@ ports: - 9100 protocol: TCP - ipaddresses: + ip_addresses: - address: 127.0.0.1 tags: - prometheus @@ -129,7 +129,7 @@ def main(): name=dict(required=True, type="str"), ports=dict(required=False, type="list", elements="int"), protocol=dict(required=True, type="raw"), - ipaddresses=dict(required=False, type="raw"), + ip_addresses=dict(required=False, type="raw"), description=dict(required=False, type="str"), tags=dict(required=False, type="list", elements="raw"), custom_fields=dict(required=False, type="dict"), diff --git a/plugins/modules/site.py b/plugins/modules/site.py deleted file mode 100644 index ab61e0b9..00000000 --- a/plugins/modules/site.py +++ /dev/null @@ -1,237 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright: (c) 2018, Mikhail Yohman (@FragmentedPacket) -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -DOCUMENTATION = r""" ---- -module: site -short_description: Creates or removes sites from Nautobot -description: - - Creates or removes sites from Nautobot -notes: - - Tags should be defined as a YAML list - - This should be ran with connection C(local) and hosts C(localhost) -author: - - Mikhail Yohman (@FragmentedPacket) -version_added: "1.0.0" -extends_documentation_fragment: - - networktocode.nautobot.fragments.base - - networktocode.nautobot.fragments.tags - - networktocode.nautobot.fragments.custom_fields -options: - name: - description: - - Name of the site to be created - required: true - type: str - status: - description: - - Status of the site - - Required if I(state=present) and does not exist yet - required: false - type: raw - version_added: "3.0.0" - region: - description: - - The region that the site should be associated with - required: false - type: raw - version_added: "3.0.0" - tenant: - description: - - The tenant the site will be assigned to - required: false - type: raw - version_added: "3.0.0" - facility: - description: - - Data center provider or facility, ex. Equinix NY7 - required: false - type: str - version_added: "3.0.0" - asn: - description: - - The ASN associated with the site - required: false - type: int - version_added: "3.0.0" - time_zone: - description: - - Timezone associated with the site, ex. America/Denver - required: false - type: str - version_added: "3.0.0" - description: - description: - - The description of the prefix - required: false - type: str - version_added: "3.0.0" - physical_address: - description: - - Physical address of site - required: false - type: str - version_added: "3.0.0" - shipping_address: - description: - - Shipping address of site - required: false - type: str - version_added: "3.0.0" - latitude: - description: - - Latitude in decimal format - required: false - type: str - version_added: "3.0.0" - longitude: - description: - - Longitude in decimal format - required: false - type: str - version_added: "3.0.0" - contact_name: - description: - - Name of contact for site - required: false - type: str - version_added: "3.0.0" - contact_phone: - description: - - Contact phone number for site - required: false - type: str - version_added: "3.0.0" - contact_email: - description: - - Contact email for site - required: false - type: str - version_added: "3.0.0" - comments: - description: - - Comments for the site. This can be markdown syntax - required: false - type: str - version_added: "3.0.0" - slug: - description: - - URL-friendly unique shorthand - required: false - type: str - version_added: "3.0.0" -""" - -EXAMPLES = r""" -- name: "Test Nautobot site module" - connection: local - hosts: localhost - gather_facts: False - tasks: - - name: Create site within Nautobot with only required information - networktocode.nautobot.site: - url: http://nautobot.local - token: thisIsMyToken - name: Test - Colorado - status: active - state: present - - - name: Delete site within nautobot - networktocode.nautobot.site: - url: http://nautobot.local - token: thisIsMyToken - name: Test - Colorado - state: absent - - - name: Create site with all parameters - networktocode.nautobot.site: - url: http://nautobot.local - token: thisIsMyToken - name: Test - California - status: Planned - region: Test Region - tenant: Test Tenant - facility: EquinoxCA7 - asn: 65001 - time_zone: America/Los Angeles - description: This is a test description - physical_address: Hollywood, CA, 90210 - shipping_address: Hollywood, CA, 90210 - latitude: 10.100000 - longitude: 12.200000 - contact_name: Jenny - contact_phone: 867-5309 - contact_email: jenny@changednumber.com - slug: test-california - comments: ### Placeholder - state: present -""" - -RETURN = r""" -site: - description: Serialized object as created or already existent within Nautobot - returned: on creation - type: dict -msg: - description: Message indicating failure or info about what has been achieved - returned: always - type: str -""" - -from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NAUTOBOT_ARG_SPEC -from ansible_collections.networktocode.nautobot.plugins.module_utils.dcim import ( - NautobotDcimModule, - NB_SITES, -) -from ansible.module_utils.basic import AnsibleModule -from copy import deepcopy - - -def main(): - """ - Main entry point for module execution - """ - argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) - argument_spec.update( - dict( - name=dict(required=True, type="str"), - status=dict(required=False, type="raw"), - region=dict(required=False, type="raw"), - tenant=dict(required=False, type="raw"), - facility=dict(required=False, type="str"), - asn=dict(required=False, type="int"), - time_zone=dict(required=False, type="str"), - description=dict(required=False, type="str"), - physical_address=dict(required=False, type="str"), - shipping_address=dict(required=False, type="str"), - latitude=dict(required=False, type="str"), - longitude=dict(required=False, type="str"), - contact_name=dict(required=False, type="str"), - contact_phone=dict(required=False, type="str"), - contact_email=dict(required=False, type="str"), - comments=dict(required=False, type="str"), - slug=dict(required=False, type="str"), - tags=dict(required=False, type="list", elements="raw"), - custom_fields=dict(required=False, type="dict"), - ) - ) - - required_if = [ - ("state", "present", ["name", "status"]), - ("state", "absent", ["name"]), - ] - - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_if=required_if) - - site = NautobotDcimModule(module, NB_SITES) - site.run() - - -if __name__ == "__main__": # pragma: no cover - main() diff --git a/plugins/modules/status.py b/plugins/modules/status.py index 40ee8077..47c4b384 100644 --- a/plugins/modules/status.py +++ b/plugins/modules/status.py @@ -35,13 +35,6 @@ required: false type: str version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" color: description: - Status color @@ -75,7 +68,6 @@ - dcim.cable - dcim.powerfeed - dcim.rack - - dcim.site - circuits.circuit - virtualization.virtualmachine - ipam.prefix @@ -122,7 +114,6 @@ def main(): content_types=dict(required=False, type="list", elements="str"), color=dict(required=False, type="str"), description=dict(required=False, type="str"), - slug=dict(required=False, type="str"), ) ) diff --git a/plugins/modules/tag.py b/plugins/modules/tag.py index 7a6ef480..ec0b93b1 100644 --- a/plugins/modules/tag.py +++ b/plugins/modules/tag.py @@ -28,13 +28,6 @@ required: true type: str version_added: "3.0.0" - slug: - description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" color: description: - Tag color @@ -51,7 +44,7 @@ description: - Tags content type(s). These match app.endpoint and the endpoint is singular. - e.g. dcim.device, ipam.ipaddress (more can be found in the examples) - - Requires C(api_version >= 1.3) + - Required if I(state=present) and the tag does not exist yet required: false type: list elements: str @@ -91,7 +84,6 @@ - dcim.rack - dcim.rack reservation - dcim.rear port - - dcim.site - dcim.virtual chassis - extras.Git repository - extras.job @@ -153,7 +145,6 @@ def main(): name=dict(required=True, type="str"), color=dict(required=False, type="str"), description=dict(required=False, type="str"), - slug=dict(required=False, type="str"), content_types=dict(required=False, type="list", elements="str"), ) ) diff --git a/plugins/modules/tenant.py b/plugins/modules/tenant.py index 4ae1698d..611d4fe6 100644 --- a/plugins/modules/tenant.py +++ b/plugins/modules/tenant.py @@ -48,12 +48,6 @@ required: false type: str version_added: "3.0.0" - slug: - description: - - URL-friendly unique shorthand - required: false - type: str - version_added: "3.0.0" """ EXAMPLES = r""" @@ -84,7 +78,6 @@ tenant_group: Very Special Tenants description: ABC Incorporated comments: '### This tenant is super cool' - slug: tenant_abc tags: - tagA - tagB @@ -123,7 +116,6 @@ def main(): tenant_group=dict(required=False, type="raw"), description=dict(required=False, type="str"), comments=dict(required=False, type="str"), - slug=dict(required=False, type="str"), tags=dict(required=False, type="list", elements="raw"), custom_fields=dict(required=False, type="dict"), ) diff --git a/plugins/modules/tenant_group.py b/plugins/modules/tenant_group.py index 37ff8026..25608e83 100644 --- a/plugins/modules/tenant_group.py +++ b/plugins/modules/tenant_group.py @@ -28,12 +28,6 @@ required: true type: str version_added: "3.0.0" - slug: - description: - - URL-friendly unique shorthand - required: false - type: str - version_added: "3.0.0" description: description: - The description of the tenant @@ -59,7 +53,6 @@ url: http://nautobot.local token: thisIsMyToken name: Tenant Group ABC - slug: "tenant_group_abc" state: present - name: Delete tenant within Nautobot @@ -75,7 +68,6 @@ token: thisIsMyToken name: Tenant Group ABC parent_tenant_group: Customer Tenants - slug: "tenant_group_abc" state: present """ @@ -108,7 +100,6 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), description=dict(required=False, type="str"), parent_tenant_group=dict(required=False, type="raw"), ) diff --git a/plugins/modules/virtual_machine.py b/plugins/modules/virtual_machine.py index aa6bee00..32044391 100644 --- a/plugins/modules/virtual_machine.py +++ b/plugins/modules/virtual_machine.py @@ -30,19 +30,13 @@ required: true type: str version_added: "3.0.0" - site: - description: - - The name of the site attach to the virtual machine - required: false - type: raw - version_added: "3.0.0" cluster: description: - The name of the cluster attach to the virtual machine required: false type: raw version_added: "3.0.0" - virtual_machine_role: + role: description: - The role of the virtual machine required: false @@ -97,7 +91,7 @@ required: false type: raw version_added: "3.0.0" - local_context_data: + local_config_context_data: description: - configuration context of the virtual machine required: false @@ -139,7 +133,6 @@ token: thisIsMyToken name: Another Test Virtual Machine cluster: test cluster - site: Test Site status: active tags: - Schnozzberry @@ -185,9 +178,8 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - site=dict(required=False, type="raw"), cluster=dict(required=False, type="raw"), - virtual_machine_role=dict(required=False, type="raw"), + role=dict(required=False, type="raw"), vcpus=dict(required=False, type="int"), tenant=dict(required=False, type="raw"), platform=dict(required=False, type="raw"), @@ -198,7 +190,7 @@ def main(): status=dict(required=False, type="raw"), tags=dict(required=False, type="list", elements="raw"), custom_fields=dict(required=False, type="dict"), - local_context_data=dict(required=False, type="dict"), + local_config_context_data=dict(required=False, type="dict"), comments=dict(required=False, type="str"), ) ) diff --git a/plugins/modules/vlan.py b/plugins/modules/vlan.py index 691b4fbc..a713f476 100644 --- a/plugins/modules/vlan.py +++ b/plugins/modules/vlan.py @@ -24,9 +24,9 @@ - networktocode.nautobot.fragments.tags - networktocode.nautobot.fragments.custom_fields options: - site: + location: description: - - The site the VLAN will be associated to + - The location the VLAN will be associated to required: false type: raw version_added: "3.0.0" @@ -61,7 +61,7 @@ required: false type: raw version_added: "3.0.0" - vlan_role: + role: description: - The role of the VLAN. required: false @@ -106,11 +106,11 @@ token: thisIsMyToken name: Test VLAN vid: 400 - site: Test Site + location: Test Site group: Test VLAN Group tenant: Test Tenant status: Deprecated - vlan_role: Test VLAN Role + role: Test VLAN Role description: Just a test tags: - Schnozzberry @@ -144,13 +144,13 @@ def main(): argument_spec = deepcopy(NAUTOBOT_ARG_SPEC) argument_spec.update( dict( - site=dict(required=False, type="raw"), + location=dict(required=False, type="raw"), vlan_group=dict(required=False, type="raw"), vid=dict(required=False, type="int"), name=dict(required=True, type="str"), tenant=dict(required=False, type="raw"), status=dict(required=False, type="raw"), - vlan_role=dict(required=False, type="raw"), + role=dict(required=False, type="raw"), description=dict(required=False, type="str"), tags=dict(required=False, type="list", elements="raw"), custom_fields=dict(required=False, type="dict"), diff --git a/plugins/modules/vlan_group.py b/plugins/modules/vlan_group.py index ce4994e3..02815f15 100644 --- a/plugins/modules/vlan_group.py +++ b/plugins/modules/vlan_group.py @@ -28,19 +28,12 @@ required: true type: str version_added: "3.0.0" - slug: + location: description: - - The slugified version of the name or custom slug. - - This is auto-generated following Nautobot rules if not provided - required: false - type: str - version_added: "3.0.0" - site: - description: - - The site the vlan will be assigned to + - The location the vlan will be assigned to required: false type: raw - version_added: "3.0.0" + version_added: "5.0.0" description: description: - The description of the vlan group @@ -61,7 +54,7 @@ url: http://nautobot.local token: thisIsMyToken name: Test vlan group - site: Test Site + location: Test Location state: present - name: Delete vlan group within nautobot @@ -100,8 +93,7 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - slug=dict(required=False, type="str"), - site=dict(required=False, type="raw"), + location=dict(required=False, type="raw"), description=dict(required=False, type="str"), ) ) diff --git a/plugins/modules/vm_interface.py b/plugins/modules/vm_interface.py index e23aa04f..702bbf02 100644 --- a/plugins/modules/vm_interface.py +++ b/plugins/modules/vm_interface.py @@ -59,6 +59,13 @@ required: false type: str version_added: "3.0.0" + status: + description: + - The status of the interface. + - Required if I(state=present) and does not exist yet + required: false + type: raw + version_added: "3.0.0" mode: description: - The mode of the interface @@ -110,12 +117,12 @@ enabled: false untagged_vlan: name: Wireless - site: Test Site + location: "{{ test_location['key'] }}" tagged_vlans: - name: Data - site: Test Site + location: "{{ test_location['key'] }}" - name: VoIP - site: Test Site + location: "{{ test_location['key'] }}" mtu: 1600 mode: Tagged state: present @@ -154,6 +161,7 @@ def main(): mtu=dict(required=False, type="int"), mac_address=dict(required=False, type="str"), description=dict(required=False, type="str"), + status=dict(required=False, type="raw"), mode=dict(required=False, type="raw"), untagged_vlan=dict(required=False, type="raw"), tagged_vlans=dict(required=False, type="raw"), @@ -161,7 +169,12 @@ def main(): ) ) - module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) + required_if = [ + ("state", "present", ["name", "status"]), + ("state", "absent", ["name"]), + ] + + module = AnsibleModule(argument_spec=argument_spec, required_if=required_if, supports_check_mode=True) vm_interface = NautobotVirtualizationModule(module, NB_VM_INTERFACES) vm_interface.run() diff --git a/plugins/modules/vrf.py b/plugins/modules/vrf.py index 28fb8481..0d61b497 100644 --- a/plugins/modules/vrf.py +++ b/plugins/modules/vrf.py @@ -30,10 +30,17 @@ required: true type: str version_added: "3.0.0" + namespace: + description: + - namespace that IP address is associated with. VRFs are unique per namespaces. + required: false + default: Global + type: str + version_added: "5.0.0" rd: description: - The RD of the VRF. Must be quoted to pass as a string. - required: false + required: true type: str version_added: "3.0.0" tenant: @@ -42,12 +49,6 @@ required: false type: raw version_added: "3.0.0" - enforce_unique: - description: - - Prevent duplicate prefixes/IP addresses within this VRF - required: false - type: bool - version_added: "3.0.0" import_targets: description: - Import targets tied to VRF @@ -98,7 +99,6 @@ name: Test VRF rd: "65000:1" tenant: Test Tenant - enforce_unique: true import_targets: - "65000:65001" export_targets: @@ -137,9 +137,9 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str"), - rd=dict(required=False, type="str"), + namespace=dict(required=False, type="str", default="Global"), + rd=dict(required=True, type="str"), tenant=dict(required=False, type="raw"), - enforce_unique=dict(required=False, type="bool"), import_targets=dict(required=False, type="list", elements="str"), export_targets=dict(required=False, type="list", elements="str"), description=dict(required=False, type="str"), diff --git a/poetry.lock b/poetry.lock index 788b84f5..db1c2931 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,124 +1,121 @@ # This file is automatically @generated by Poetry and should not be changed by hand. -[[package]] -name = "aiocontextvars" -version = "0.2.2" -description = "Asyncio support for PEP-567 contextvars backport." -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "aiocontextvars-0.2.2-py2.py3-none-any.whl", hash = "sha256:885daf8261818767d8f7cbd79f9d4482d118f024b6586ef6e67980236a27bfa3"}, - {file = "aiocontextvars-0.2.2.tar.gz", hash = "sha256:f027372dc48641f683c559f247bd84962becaacdc9ba711d583c3871fb5652aa"}, -] - -[package.dependencies] -contextvars = {version = "2.4", markers = "python_version < \"3.7\""} - [[package]] name = "aiofiles" -version = "0.8.0" +version = "23.2.1" description = "File support for asyncio." category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7" files = [ - {file = "aiofiles-0.8.0-py3-none-any.whl", hash = "sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937"}, - {file = "aiofiles-0.8.0.tar.gz", hash = "sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"}, + {file = "aiofiles-23.2.1-py3-none-any.whl", hash = "sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107"}, + {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"}, ] [[package]] name = "aiohttp" -version = "3.8.1" +version = "3.8.5" description = "Async http client/server framework (asyncio)" category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, - {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, - {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, - {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, - {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, - {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, - {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, - {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, - {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, - {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, - {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, - {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, - {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, - {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, - {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, - {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, - {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, - {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, - {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, - {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, - {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, - {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, ] [package.dependencies] aiosignal = ">=1.1.2" async-timeout = ">=4.0.0a3,<5.0" -asynctest = {version = "0.13.0", markers = "python_version < \"3.8\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<3.0" +charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" -idna-ssl = {version = ">=1.0", markers = "python_version < \"3.7\""} multidict = ">=4.5,<7.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} yarl = ">=1.0,<2.0" [package.extras] @@ -126,14 +123,14 @@ speedups = ["Brotli", "aiodns", "cchardet"] [[package]] name = "aiosignal" -version = "1.2.0" +version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, - {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, ] [package.dependencies] @@ -141,32 +138,35 @@ frozenlist = ">=1.1.0" [[package]] name = "alabaster" -version = "0.7.12" +version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] [[package]] -name = "ansible-base" -version = "2.10.17" +name = "ansible-core" +version = "2.15.3" description = "Radically simple IT automation" category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +python-versions = ">=3.9" files = [ - {file = "ansible-base-2.10.17.tar.gz", hash = "sha256:ef925882ca8d4c3c2ccd091cde199e0c869024ccad0d07a337dcf207bff32f34"}, + {file = "ansible-core-2.15.3.tar.gz", hash = "sha256:261bc01a15274fc5a6950d5b92b9aa1b7d7c6e8f7543c914505e5bfd9744793a"}, + {file = "ansible_core-2.15.3-py3-none-any.whl", hash = "sha256:bc2f5ab74e1c81609aaa9bc8f7f92d939d8e1c847923290301231bdf4dadc812"}, ] [package.dependencies] cryptography = "*" -jinja2 = "*" +importlib-resources = {version = ">=5.0,<5.1", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.0" packaging = "*" -PyYAML = "*" +PyYAML = ">=5.1" +resolvelib = ">=0.5.3,<1.1.0" [[package]] name = "ansible-pygments" @@ -204,104 +204,115 @@ jinja2 = "*" [[package]] name = "antsibull-changelog" -version = "0.16.0" +version = "0.23.0" description = "Changelog tool for Ansible-base and Ansible collections" category = "dev" optional = false -python-versions = ">=3.6.0,<4.0.0" +python-versions = ">=3.9.0" files = [ - {file = "antsibull-changelog-0.16.0.tar.gz", hash = "sha256:743a03108f78ee6f065c346234c5bd21933ec65a5e6aae4542bddb952419ea88"}, - {file = "antsibull_changelog-0.16.0-py3-none-any.whl", hash = "sha256:578b5116f0d8dc76ed5fa0f7ee3acdf357f34e7173311267c8510e6acfb5dd08"}, + {file = "antsibull_changelog-0.23.0-py3-none-any.whl", hash = "sha256:e9c3425fe6ef8e495aec19705be4af826612f921bdc8dd6dc54d15f70532065f"}, + {file = "antsibull_changelog-0.23.0.tar.gz", hash = "sha256:521985407e1aa2aef1dbfb2b87275cd6f03ea9a96c0c704e9f9cb04141f90e0b"}, ] [package.dependencies] docutils = "*" packaging = "*" -PyYAML = "*" +pyyaml = "*" rstcheck = ">=3.0.0,<7.0.0" -semantic_version = "*" +semantic-version = "*" + +[package.extras] +codeqa = ["flake8 (>=3.8.0)", "pylint", "reuse"] +coverage = ["coverage[toml]"] +dev = ["antsibull-changelog[codeqa]", "antsibull-changelog[coverage]", "antsibull-changelog[formatters]", "antsibull-changelog[test]", "antsibull-changelog[typing]", "nox"] +formatters = ["black", "isort"] +test = ["pytest", "pytest-cov", "pytest-error-for-skips"] +toml = ["tomli"] +typing = ["mypy", "pyre-check (>=0.9.17)", "types-docutils", "types-pyyaml", "types-toml"] [[package]] name = "antsibull-core" -version = "1.2.0" +version = "1.6.0" description = "Tools for building the Ansible Distribution" category = "dev" optional = false python-versions = ">=3.6.1,<4.0.0" files = [ - {file = "antsibull-core-1.2.0.tar.gz", hash = "sha256:d4c613b5704a8be27437721777068f7543e9cf2ae35de83fa1584f1a89f14e37"}, - {file = "antsibull_core-1.2.0-py3-none-any.whl", hash = "sha256:84312f3c27bb4ec11980f1ec00618ff84ca3ace6f9f9d9779277cd47ae3f79d3"}, + {file = "antsibull_core-1.6.0-py3-none-any.whl", hash = "sha256:057968e664eca9ec0f3f943a348a65dfeb94d40c4d2ce460b49fb930ec5513e7"}, + {file = "antsibull_core-1.6.0.tar.gz", hash = "sha256:9c4b0a7b6e46168d45a117c27963ea09f3feb121e8a1e63bb319ae610ac7c932"}, ] [package.dependencies] -aiocontextvars = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.7\""} aiofiles = "*" aiohttp = ">=3.0.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} packaging = ">=20.0" perky = "*" -pydantic = "*" +pydantic = ">=1.0.0,<2.0.0" PyYAML = "*" semantic_version = "*" -sh = "*" +sh = ">=1.0.0,<2.0.0" twiggy = ">=0.5.0" [[package]] name = "antsibull-docs" -version = "1.7.3" +version = "1.11.1" description = "Tools for building Ansible documentation" category = "dev" optional = false python-versions = ">=3.6.1,<4.0.0" files = [ - {file = "antsibull_docs-1.7.3-py3-none-any.whl", hash = "sha256:d8140e596588a060725ed1b09863ed8377c02f889598c165025464e670c34ec6"}, - {file = "antsibull_docs-1.7.3.tar.gz", hash = "sha256:a2c0ca4ec446b71c2492843c9d7d393567b2ec08560b28a126bd6dc8a113add3"}, + {file = "antsibull_docs-1.11.1-py3-none-any.whl", hash = "sha256:e198ee3aaeb9a95b110f424a91ee36cc30cdc41bd4df2eee9185cd0bf6e00d9c"}, + {file = "antsibull_docs-1.11.1.tar.gz", hash = "sha256:b18649b2a56cd6c84a9dd68563bad57bca0f08510efc4ad2c552daf3763fd9b2"}, ] [package.dependencies] +aiohttp = ">=3.0.0" ansible-pygments = "*" -antsibull-core = ">=1.2.0,<2.0.0" +antsibull-core = ">=1.2.0,<3.0.0" asyncio-pool = "*" docutils = "*" -jinja2 = "*" +jinja2 = ">=3.0" packaging = "*" +pydantic = ">=1.0.0,<2.0.0" +PyYAML = "*" rstcheck = ">=3.0.0,<7.0.0" +semantic_version = "*" +sh = ">=1.0.0,<2.0.0" sphinx = "*" +twiggy = "*" [[package]] name = "astroid" -version = "2.11.7" +version = "2.15.6" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" files = [ - {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, - {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, + {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, + {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, ] [package.dependencies] lazy-object-proxy = ">=1.4.0" -setuptools = ">=20.0" -typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} -typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} -wrapt = ">=1.11,<2" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] -[package.dependencies] -typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} - [[package]] name = "asyncio-pool" version = "0.6.0" @@ -314,18 +325,6 @@ files = [ {file = "asyncio_pool-0.6.0.tar.gz", hash = "sha256:d7ba5e299ba58d4fb0cebbc722989d1f880df4c4b19e37055075b3dabc062c5b"}, ] -[[package]] -name = "asynctest" -version = "0.13.0" -description = "Enhance the standard unittest package with features for testing asyncio libraries" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, - {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, -] - [[package]] name = "atomicwrites" version = "1.4.1" @@ -339,97 +338,116 @@ files = [ [[package]] name = "attrs" -version = "22.1.0" +version = "23.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.10.3" +version = "2.12.1" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, - {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, ] -[package.dependencies] -pytz = ">=2015.7" - [[package]] name = "bandit" -version = "1.7.1" +version = "1.7.5" description = "Security oriented static analyser for python code." category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "bandit-1.7.1-py3-none-any.whl", hash = "sha256:f5acd838e59c038a159b5c621cf0f8270b279e884eadd7b782d7491c02add0d4"}, - {file = "bandit-1.7.1.tar.gz", hash = "sha256:a81b00b5436e6880fa8ad6799bc830e02032047713cbb143a12939ac67eb756c"}, + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, ] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} GitPython = ">=1.0.1" PyYAML = ">=5.3.1" +rich = "*" stevedore = ">=1.20.0" +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["PyYAML"] + [[package]] name = "black" -version = "21.12b0" +version = "23.9.1" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6.2" -files = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, +python-versions = ">=3.8" +files = [ + {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, + {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, + {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, + {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, + {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, + {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, + {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, + {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, + {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, ] [package.dependencies] -click = ">=7.1.2" -dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +packaging = ">=22.0" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = ">=3.10.0.0,<3.10.0.1 || >3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] @@ -511,172 +529,250 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" -files = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.0.4" +version = "8.1.7" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] -name = "contextvars" -version = "2.4" -description = "PEP 567 Backport" +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" category = "dev" optional = false python-versions = "*" files = [ - {file = "contextvars-2.4.tar.gz", hash = "sha256:f38c908aaa59c14335eeea12abea5f443646216c4e29380d7bf34d2018e2c39e"}, + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, ] -[package.dependencies] -immutables = ">=0.9" +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "coverage" -version = "4.5.4" +version = "6.5.0" description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4" -files = [ - {file = "coverage-4.5.4-cp26-cp26m-macosx_10_12_x86_64.whl", hash = "sha256:eee64c616adeff7db37cc37da4180a3a5b6177f5c46b187894e633f088fb5b28"}, - {file = "coverage-4.5.4-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:ef824cad1f980d27f26166f86856efe11eff9912c4fed97d3804820d43fa550c"}, - {file = "coverage-4.5.4-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:9a334d6c83dfeadae576b4d633a71620d40d1c379129d587faa42ee3e2a85cce"}, - {file = "coverage-4.5.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:7494b0b0274c5072bddbfd5b4a6c6f18fbbe1ab1d22a41e99cd2d00c8f96ecfe"}, - {file = "coverage-4.5.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:826f32b9547c8091679ff292a82aca9c7b9650f9fda3e2ca6bf2ac905b7ce888"}, - {file = "coverage-4.5.4-cp27-cp27m-win32.whl", hash = "sha256:63a9a5fc43b58735f65ed63d2cf43508f462dc49857da70b8980ad78d41d52fc"}, - {file = "coverage-4.5.4-cp27-cp27m-win_amd64.whl", hash = "sha256:e2ede7c1d45e65e209d6093b762e98e8318ddeff95317d07a27a2140b80cfd24"}, - {file = "coverage-4.5.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:dd579709a87092c6dbee09d1b7cfa81831040705ffa12a1b248935274aee0437"}, - {file = "coverage-4.5.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:08907593569fe59baca0bf152c43f3863201efb6113ecb38ce7e97ce339805a6"}, - {file = "coverage-4.5.4-cp33-cp33m-macosx_10_10_x86_64.whl", hash = "sha256:6b62544bb68106e3f00b21c8930e83e584fdca005d4fffd29bb39fb3ffa03cb5"}, - {file = "coverage-4.5.4-cp34-cp34m-macosx_10_12_x86_64.whl", hash = "sha256:331cb5115673a20fb131dadd22f5bcaf7677ef758741312bee4937d71a14b2ef"}, - {file = "coverage-4.5.4-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:bf1ef9eb901113a9805287e090452c05547578eaab1b62e4ad456fcc049a9b7e"}, - {file = "coverage-4.5.4-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:386e2e4090f0bc5df274e720105c342263423e77ee8826002dcffe0c9533dbca"}, - {file = "coverage-4.5.4-cp34-cp34m-win32.whl", hash = "sha256:fa964bae817babece5aa2e8c1af841bebb6d0b9add8e637548809d040443fee0"}, - {file = "coverage-4.5.4-cp34-cp34m-win_amd64.whl", hash = "sha256:df6712284b2e44a065097846488f66840445eb987eb81b3cc6e4149e7b6982e1"}, - {file = "coverage-4.5.4-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:efc89291bd5a08855829a3c522df16d856455297cf35ae827a37edac45f466a7"}, - {file = "coverage-4.5.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:e4ef9c164eb55123c62411f5936b5c2e521b12356037b6e1c2617cef45523d47"}, - {file = "coverage-4.5.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:ff37757e068ae606659c28c3bd0d923f9d29a85de79bf25b2b34b148473b5025"}, - {file = "coverage-4.5.4-cp35-cp35m-win32.whl", hash = "sha256:bf0a7aed7f5521c7ca67febd57db473af4762b9622254291fbcbb8cd0ba5e33e"}, - {file = "coverage-4.5.4-cp35-cp35m-win_amd64.whl", hash = "sha256:19e4df788a0581238e9390c85a7a09af39c7b539b29f25c89209e6c3e371270d"}, - {file = "coverage-4.5.4-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:60851187677b24c6085248f0a0b9b98d49cba7ecc7ec60ba6b9d2e5574ac1ee9"}, - {file = "coverage-4.5.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:245388cda02af78276b479f299bbf3783ef0a6a6273037d7c60dc73b8d8d7755"}, - {file = "coverage-4.5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c0afd27bc0e307a1ffc04ca5ec010a290e49e3afbe841c5cafc5c5a80ecd81c9"}, - {file = "coverage-4.5.4-cp36-cp36m-win32.whl", hash = "sha256:6ba744056423ef8d450cf627289166da65903885272055fb4b5e113137cfa14f"}, - {file = "coverage-4.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:af7ed8a8aa6957aac47b4268631fa1df984643f07ef00acd374e456364b373f5"}, - {file = "coverage-4.5.4-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:3a794ce50daee01c74a494919d5ebdc23d58873747fa0e288318728533a3e1ca"}, - {file = "coverage-4.5.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0be0f1ed45fc0c185cfd4ecc19a1d6532d72f86a2bac9de7e24541febad72650"}, - {file = "coverage-4.5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:eca2b7343524e7ba246cab8ff00cab47a2d6d54ada3b02772e908a45675722e2"}, - {file = "coverage-4.5.4-cp37-cp37m-win32.whl", hash = "sha256:93715dffbcd0678057f947f496484e906bf9509f5c1c38fc9ba3922893cda5f5"}, - {file = "coverage-4.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:23cc09ed395b03424d1ae30dcc292615c1372bfba7141eb85e11e50efaa6b351"}, - {file = "coverage-4.5.4-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:141f08ed3c4b1847015e2cd62ec06d35e67a3ac185c26f7635f4406b90afa9c5"}, - {file = "coverage-4.5.4.tar.gz", hash = "sha256:e07d9f1a23e9e93ab5c62902833bf3e4b1f65502927379148b6622686223125c"}, +python-versions = ">=3.7" +files = [ + {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, + {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83516205e254a0cb77d2d7bb3632ee019d93d9f4005de31dca0a8c3667d5bc04"}, + {file = "coverage-6.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af4fffaffc4067232253715065e30c5a7ec6faac36f8fc8d6f64263b15f74db0"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:97117225cdd992a9c2a5515db1f66b59db634f59d0679ca1fa3fe8da32749cae"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1170fa54185845505fbfa672f1c1ab175446c887cce8212c44149581cf2d466"}, + {file = "coverage-6.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:11b990d520ea75e7ee8dcab5bc908072aaada194a794db9f6d7d5cfd19661e5a"}, + {file = "coverage-6.5.0-cp310-cp310-win32.whl", hash = "sha256:5dbec3b9095749390c09ab7c89d314727f18800060d8d24e87f01fb9cfb40b32"}, + {file = "coverage-6.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:59f53f1dc5b656cafb1badd0feb428c1e7bc19b867479ff72f7a9dd9b479f10e"}, + {file = "coverage-6.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a5375e28c5191ac38cca59b38edd33ef4cc914732c916f2929029b4bfb50795"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ed2820d919351f4167e52425e096af41bfabacb1857186c1ea32ff9983ed75"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33a7da4376d5977fbf0a8ed91c4dffaaa8dbf0ddbf4c8eea500a2486d8bc4d7b"}, + {file = "coverage-6.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fb6cf131ac4070c9c5a3e21de0f7dc5a0fbe8bc77c9456ced896c12fcdad91"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a6b7d95969b8845250586f269e81e5dfdd8ff828ddeb8567a4a2eaa7313460c4"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1ef221513e6f68b69ee9e159506d583d31aa3567e0ae84eaad9d6ec1107dddaa"}, + {file = "coverage-6.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cca4435eebea7962a52bdb216dec27215d0df64cf27fc1dd538415f5d2b9da6b"}, + {file = "coverage-6.5.0-cp311-cp311-win32.whl", hash = "sha256:98e8a10b7a314f454d9eff4216a9a94d143a7ee65018dd12442e898ee2310578"}, + {file = "coverage-6.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc8ef5e043a2af066fa8cbfc6e708d58017024dc4345a1f9757b329a249f041b"}, + {file = "coverage-6.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4433b90fae13f86fafff0b326453dd42fc9a639a0d9e4eec4d366436d1a41b6d"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f05d88d9a80ad3cac6244d36dd89a3c00abc16371769f1340101d3cb899fc3"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94e2565443291bd778421856bc975d351738963071e9b8839ca1fc08b42d4bef"}, + {file = "coverage-6.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027018943386e7b942fa832372ebc120155fd970837489896099f5cfa2890f79"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:255758a1e3b61db372ec2736c8e2a1fdfaf563977eedbdf131de003ca5779b7d"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:851cf4ff24062c6aec510a454b2584f6e998cada52d4cb58c5e233d07172e50c"}, + {file = "coverage-6.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12adf310e4aafddc58afdb04d686795f33f4d7a6fa67a7a9d4ce7d6ae24d949f"}, + {file = "coverage-6.5.0-cp37-cp37m-win32.whl", hash = "sha256:b5604380f3415ba69de87a289a2b56687faa4fe04dbee0754bfcae433489316b"}, + {file = "coverage-6.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4a8dbc1f0fbb2ae3de73eb0bdbb914180c7abfbf258e90b311dcd4f585d44bd2"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d900bb429fdfd7f511f868cedd03a6bbb142f3f9118c09b99ef8dc9bf9643c3c"}, + {file = "coverage-6.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2198ea6fc548de52adc826f62cb18554caedfb1d26548c1b7c88d8f7faa8f6ba"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c4459b3de97b75e3bd6b7d4b7f0db13f17f504f3d13e2a7c623786289dd670e"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20c8ac5386253717e5ccc827caad43ed66fea0efe255727b1053a8154d952398"}, + {file = "coverage-6.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b07130585d54fe8dff3d97b93b0e20290de974dc8177c320aeaf23459219c0b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dbdb91cd8c048c2b09eb17713b0c12a54fbd587d79adcebad543bc0cd9a3410b"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:de3001a203182842a4630e7b8d1a2c7c07ec1b45d3084a83d5d227a3806f530f"}, + {file = "coverage-6.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e07f4a4a9b41583d6eabec04f8b68076ab3cd44c20bd29332c6572dda36f372e"}, + {file = "coverage-6.5.0-cp38-cp38-win32.whl", hash = "sha256:6d4817234349a80dbf03640cec6109cd90cba068330703fa65ddf56b60223a6d"}, + {file = "coverage-6.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:7ccf362abd726b0410bf8911c31fbf97f09f8f1061f8c1cf03dfc4b6372848f6"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:633713d70ad6bfc49b34ead4060531658dc6dfc9b3eb7d8a716d5873377ab745"}, + {file = "coverage-6.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:95203854f974e07af96358c0b261f1048d8e1083f2de9b1c565e1be4a3a48cfc"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9023e237f4c02ff739581ef35969c3739445fb059b060ca51771e69101efffe"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:265de0fa6778d07de30bcf4d9dc471c3dc4314a23a3c6603d356a3c9abc2dfcf"}, + {file = "coverage-6.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f830ed581b45b82451a40faabb89c84e1a998124ee4212d440e9c6cf70083e5"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7b6be138d61e458e18d8e6ddcddd36dd96215edfe5f1168de0b1b32635839b62"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42eafe6778551cf006a7c43153af1211c3aaab658d4d66fa5fcc021613d02518"}, + {file = "coverage-6.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:723e8130d4ecc8f56e9a611e73b31219595baa3bb252d539206f7bbbab6ffc1f"}, + {file = "coverage-6.5.0-cp39-cp39-win32.whl", hash = "sha256:d9ecf0829c6a62b9b573c7bb6d4dcd6ba8b6f80be9ba4fc7ed50bf4ac9aecd72"}, + {file = "coverage-6.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc2af30ed0d5ae0b1abdb4ebdce598eafd5b35397d4d75deb341a614d333d987"}, + {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, + {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, ] +[package.extras] +toml = ["tomli"] + [[package]] name = "cryptography" -version = "38.0.3" +version = "41.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false -python-versions = ">=3.6" -files = [ - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320"}, - {file = "cryptography-38.0.3-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c"}, - {file = "cryptography-38.0.3-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748"}, - {file = "cryptography-38.0.3-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146"}, - {file = "cryptography-38.0.3-cp36-abi3-win32.whl", hash = "sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0"}, - {file = "cryptography-38.0.3-cp36-abi3-win_amd64.whl", hash = "sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55"}, - {file = "cryptography-38.0.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249"}, - {file = "cryptography-38.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548"}, - {file = "cryptography-38.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a"}, - {file = "cryptography-38.0.3.tar.gz", hash = "sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd"}, +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, + {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, + {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, + {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, ] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] - -[[package]] -name = "dataclasses" -version = "0.8" -description = "A backport of the dataclasses module for Python 3.6" -category = "dev" -optional = false -python-versions = ">=3.6, <3.7" -files = [ - {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, - {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, -] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] name = "dill" -version = "0.3.4" -description = "serialize all of python" +version = "0.3.7" +description = "serialize all of Python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*" +python-versions = ">=3.7" files = [ - {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"}, - {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"}, + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, ] [package.extras] @@ -684,123 +780,127 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "docutils" -version = "0.17.1" +version = "0.19" description = "Docutils -- Python Documentation Utilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" files = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] +[package.extras] +test = ["pytest (>=6)"] + [[package]] name = "execnet" -version = "1.9.0" +version = "2.0.2" description = "execnet: rapid multi-Python deployment" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, - {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, + {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, + {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, ] [package.extras] -testing = ["pre-commit"] +testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "frozenlist" -version = "1.2.0" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" category = "dev" optional = false -python-versions = ">=3.6" -files = [ - {file = "frozenlist-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:977a1438d0e0d96573fd679d291a1542097ea9f4918a8b6494b06610dfeefbf9"}, - {file = "frozenlist-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8d86547a5e98d9edd47c432f7a14b0c5592624b496ae9880fb6332f34af1edc"}, - {file = "frozenlist-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:181754275d5d32487431a0a29add4f897968b7157204bc1eaaf0a0ce80c5ba7d"}, - {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5df31bb2b974f379d230a25943d9bf0d3bc666b4b0807394b131a28fca2b0e5f"}, - {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4766632cd8a68e4f10f156a12c9acd7b1609941525569dd3636d859d79279ed3"}, - {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16eef427c51cb1203a7c0ab59d1b8abccaba9a4f58c4bfca6ed278fc896dc193"}, - {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:01d79515ed5aa3d699b05f6bdcf1fe9087d61d6b53882aa599a10853f0479c6c"}, - {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:28e164722ea0df0cf6d48c4d5bdf3d19e87aaa6dfb39b0ba91153f224b912020"}, - {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e63ad0beef6ece06475d29f47d1f2f29727805376e09850ebf64f90777962792"}, - {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41de4db9b9501679cf7cddc16d07ac0f10ef7eb58c525a1c8cbff43022bddca4"}, - {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a9d84ee6427b65a81fc24e6ef589cb794009f5ca4150151251c062773e7ed2"}, - {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f5f3b2942c3b8b9bfe76b408bbaba3d3bb305ee3693e8b1d631fe0a0d4f93673"}, - {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c98d3c04701773ad60d9545cd96df94d955329efc7743fdb96422c4b669c633b"}, - {file = "frozenlist-1.2.0-cp310-cp310-win32.whl", hash = "sha256:72cfbeab7a920ea9e74b19aa0afe3b4ad9c89471e3badc985d08756efa9b813b"}, - {file = "frozenlist-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:11ff401951b5ac8c0701a804f503d72c048173208490c54ebb8d7bb7c07a6d00"}, - {file = "frozenlist-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b46f997d5ed6d222a863b02cdc9c299101ee27974d9bbb2fd1b3c8441311c408"}, - {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:351686ca020d1bcd238596b1fa5c8efcbc21bffda9d0efe237aaa60348421e2a"}, - {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfbaa08cf1452acad9cb1c1d7b89394a41e712f88df522cea1a0f296b57782a0"}, - {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ae2f5e9fa10805fb1c9adbfefaaecedd9e31849434be462c3960a0139ed729"}, - {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6790b8d96bbb74b7a6f4594b6f131bd23056c25f2aa5d816bd177d95245a30e3"}, - {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:41f62468af1bd4e4b42b5508a3fe8cc46a693f0cdd0ca2f443f51f207893d837"}, - {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:ec6cf345771cdb00791d271af9a0a6fbfc2b6dd44cb753f1eeaa256e21622adb"}, - {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:14a5cef795ae3e28fb504b73e797c1800e9249f950e1c964bb6bdc8d77871161"}, - {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8b54cdd2fda15467b9b0bfa78cee2ddf6dbb4585ef23a16e14926f4b076dfae4"}, - {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f025f1d6825725b09c0038775acab9ae94264453a696cc797ce20c0769a7b367"}, - {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:84e97f59211b5b9083a2e7a45abf91cfb441369e8bb6d1f5287382c1c526def3"}, - {file = "frozenlist-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:c5328ed53fdb0a73c8a50105306a3bc013e5ca36cca714ec4f7bd31d38d8a97f"}, - {file = "frozenlist-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9ade70aea559ca98f4b1b1e5650c45678052e76a8ab2f76d90f2ac64180215a2"}, - {file = "frozenlist-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0d3ffa8772464441b52489b985d46001e2853a3b082c655ec5fad9fb6a3d618"}, - {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3457f8cf86deb6ce1ba67e120f1b0128fcba1332a180722756597253c465fc1d"}, - {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a72eecf37eface331636951249d878750db84034927c997d47f7f78a573b72b"}, - {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:acc4614e8d1feb9f46dd829a8e771b8f5c4b1051365d02efb27a3229048ade8a"}, - {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:87521e32e18a2223311afc2492ef2d99946337da0779ddcda77b82ee7319df59"}, - {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b4c7665a17c3a5430edb663e4ad4e1ad457614d1b2f2b7f87052e2ef4fa45ca"}, - {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ed58803563a8c87cf4c0771366cf0ad1aa265b6b0ae54cbbb53013480c7ad74d"}, - {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa44c4740b4e23fcfa259e9dd52315d2b1770064cde9507457e4c4a65a04c397"}, - {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:2de5b931701257d50771a032bba4e448ff958076380b049fd36ed8738fdb375b"}, - {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6e105013fa84623c057a4381dc8ea0361f4d682c11f3816cc80f49a1f3bc17c6"}, - {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:705c184b77565955a99dc360f359e8249580c6b7eaa4dc0227caa861ef46b27a"}, - {file = "frozenlist-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:a37594ad6356e50073fe4f60aa4187b97d15329f2138124d252a5a19c8553ea4"}, - {file = "frozenlist-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:25b358aaa7dba5891b05968dd539f5856d69f522b6de0bf34e61f133e077c1a4"}, - {file = "frozenlist-1.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af2a51c8a381d76eabb76f228f565ed4c3701441ecec101dd18be70ebd483cfd"}, - {file = "frozenlist-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:82d22f6e6f2916e837c91c860140ef9947e31194c82aaeda843d6551cec92f19"}, - {file = "frozenlist-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cfe6fef507f8bac40f009c85c7eddfed88c1c0d38c75e72fe10476cef94e10f"}, - {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f602e380a5132880fa245c92030abb0fc6ff34e0c5500600366cedc6adb06a"}, - {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ad065b2ebd09f32511ff2be35c5dfafee6192978b5a1e9d279a5c6e121e3b03"}, - {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc93f5f62df3bdc1f677066327fc81f92b83644852a31c6aa9b32c2dde86ea7d"}, - {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:89fdfc84c6bf0bff2ff3170bb34ecba8a6911b260d318d377171429c4be18c73"}, - {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:47b2848e464883d0bbdcd9493c67443e5e695a84694efff0476f9059b4cb6257"}, - {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4f52d0732e56906f8ddea4bd856192984650282424049c956857fed43697ea43"}, - {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:16ef7dd5b7d17495404a2e7a49bac1bc13d6d20c16d11f4133c757dd94c4144c"}, - {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1cf63243bc5f5c19762943b0aa9e0d3fb3723d0c514d820a18a9b9a5ef864315"}, - {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:54a1e09ab7a69f843cd28fefd2bcaf23edb9e3a8d7680032c8968b8ac934587d"}, - {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:954b154a4533ef28bd3e83ffdf4eadf39deeda9e38fb8feaf066d6069885e034"}, - {file = "frozenlist-1.2.0-cp38-cp38-win32.whl", hash = "sha256:cb3957c39668d10e2b486acc85f94153520a23263b6401e8f59422ef65b9520d"}, - {file = "frozenlist-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a7c7cce70e41bc13d7d50f0e5dd175f14a4f1837a8549b0936ed0cbe6170bf9"}, - {file = "frozenlist-1.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4c457220468d734e3077580a3642b7f682f5fd9507f17ddf1029452450912cdc"}, - {file = "frozenlist-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e74f8b4d8677ebb4015ac01fcaf05f34e8a1f22775db1f304f497f2f88fdc697"}, - {file = "frozenlist-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fbd4844ff111449f3bbe20ba24fbb906b5b1c2384d0f3287c9f7da2354ce6d23"}, - {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0081a623c886197ff8de9e635528fd7e6a387dccef432149e25c13946cb0cd0"}, - {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b6e21e5770df2dea06cb7b6323fbc008b13c4a4e3b52cb54685276479ee7676"}, - {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:406aeb340613b4b559db78d86864485f68919b7141dec82aba24d1477fd2976f"}, - {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:878ebe074839d649a1cdb03a61077d05760624f36d196884a5cafb12290e187b"}, - {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1fef737fd1388f9b93bba8808c5f63058113c10f4e3c0763ced68431773f72f9"}, - {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a495c3d513573b0b3f935bfa887a85d9ae09f0627cf47cad17d0cc9b9ba5c38"}, - {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e7d0dd3e727c70c2680f5f09a0775525229809f1a35d8552b92ff10b2b14f2c2"}, - {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:66a518731a21a55b7d3e087b430f1956a36793acc15912e2878431c7aec54210"}, - {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:94728f97ddf603d23c8c3dd5cae2644fa12d33116e69f49b1644a71bb77b89ae"}, - {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c1e8e9033d34c2c9e186e58279879d78c94dd365068a3607af33f2bc99357a53"}, - {file = "frozenlist-1.2.0-cp39-cp39-win32.whl", hash = "sha256:83334e84a290a158c0c4cc4d22e8c7cfe0bba5b76d37f1c2509dabd22acafe15"}, - {file = "frozenlist-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:735f386ec522e384f511614c01d2ef9cf799f051353876b4c6fb93ef67a6d1ee"}, - {file = "frozenlist-1.2.0.tar.gz", hash = "sha256:68201be60ac56aff972dc18085800b6ee07973c49103a8aba669dee3d71079de"}, +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, ] [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.10" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, ] [package.dependencies] @@ -808,78 +908,64 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.20" -description = "Python Git Library" +version = "3.1.35" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.20-py3-none-any.whl", hash = "sha256:b1e1c269deab1b08ce65403cf14e10d2ef1f6c89e33ea7c5e5bb0222ea593b8a"}, - {file = "GitPython-3.1.20.tar.gz", hash = "sha256:df0e072a200703a65387b0cfdf0466e3bab729c0458cf6b7349d0e9877636519"}, + {file = "GitPython-3.1.35-py3-none-any.whl", hash = "sha256:c19b4292d7a1d3c0f653858db273ff8a6614100d1eb1528b014ec97286193c09"}, + {file = "GitPython-3.1.35.tar.gz", hash = "sha256:9cbefbd1789a5fe9bcf621bb34d3f441f3a90c8461d377f84eda73e721d9b06b"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} [[package]] name = "hypothesis" -version = "6.31.6" +version = "6.84.3" description = "A library for property-based testing" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "hypothesis-6.31.6-py3-none-any.whl", hash = "sha256:fbd31da5174f3da8d062017302071967b239a1b397d0e3181a44d43346bc6def"}, - {file = "hypothesis-6.31.6.tar.gz", hash = "sha256:d54be6a80b160ad5ea4209b01a0d72e31d910510ed7142fa9907861911800771"}, + {file = "hypothesis-6.84.3-py3-none-any.whl", hash = "sha256:4dd7de7a341a80c10d3e6beca12c084aab84c48ea270c1b9b8cee7e4aa5d7be2"}, + {file = "hypothesis-6.84.3.tar.gz", hash = "sha256:b4117f4138e81986cf62ad4e1410a021adeaa52e4b0326419da626cd7d3b6250"}, ] [package.dependencies] attrs = ">=19.2.0" +exceptiongroup = {version = ">=1.0.0", markers = "python_version < \"3.11\""} sortedcontainers = ">=2.1.0,<3.0.0" [package.extras] -all = ["backports.zoneinfo (>=0.2.1)", "black (>=19.10b0)", "click (>=7.0)", "django (>=2.2)", "dpcontracts (>=0.4)", "importlib-metadata (>=3.6)", "importlib-resources (>=3.3.0)", "lark-parser (>=0.6.5)", "libcst (>=0.3.16)", "numpy (>=1.9.0)", "pandas (>=0.25)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2021.5)"] +all = ["backports.zoneinfo (>=0.2.1)", "black (>=19.10b0)", "click (>=7.0)", "django (>=3.2)", "dpcontracts (>=0.4)", "lark (>=0.10.1)", "libcst (>=0.3.16)", "numpy (>=1.17.3)", "pandas (>=1.1)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2023.3)"] cli = ["black (>=19.10b0)", "click (>=7.0)", "rich (>=9.0.0)"] codemods = ["libcst (>=0.3.16)"] dateutil = ["python-dateutil (>=1.4)"] -django = ["django (>=2.2)"] +django = ["django (>=3.2)"] dpcontracts = ["dpcontracts (>=0.4)"] ghostwriter = ["black (>=19.10b0)"] -lark = ["lark-parser (>=0.6.5)"] -numpy = ["numpy (>=1.9.0)"] -pandas = ["pandas (>=0.25)"] +lark = ["lark (>=0.10.1)"] +numpy = ["numpy (>=1.17.3)"] +pandas = ["pandas (>=1.1)"] pytest = ["pytest (>=4.6)"] pytz = ["pytz (>=2014.1)"] redis = ["redis (>=3.0.0)"] -zoneinfo = ["backports.zoneinfo (>=0.2.1)", "importlib-resources (>=3.3.0)", "tzdata (>=2021.5)"] +zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2023.3)"] [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] - -[[package]] -name = "idna-ssl" -version = "1.1.0" -description = "Patch ssl.match_hostname for Unicode(idna) domains support" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "idna-ssl-1.1.0.tar.gz", hash = "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c"}, + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] -[package.dependencies] -idna = ">=2.0" - [[package]] name = "imagesize" version = "1.4.1" @@ -892,71 +978,6 @@ files = [ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] -[[package]] -name = "immutables" -version = "0.18" -description = "Immutable Collections" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "immutables-0.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d841dfa15b932bdad27f5149bce86b32d0dd8a29679ed61405677317b6893447"}, - {file = "immutables-0.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29a5886845cd0ca8263b721337750a895e28feee2f16694a526977a791909db5"}, - {file = "immutables-0.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e979a9225507e3cd830ea73ac68b69fe82f495313a891485800daa5b6567e05"}, - {file = "immutables-0.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9949f704b80d0e601587d0a3b1a0cc6ff5d49528f6dfc1c8a1476b2137bb925e"}, - {file = "immutables-0.18-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6c820c9bb5aac62b76de703384bb8bb706108be90c3def4a7f047f185a92bb"}, - {file = "immutables-0.18-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:03696193b276db3a9b619629685198886ddd7c4098c544bd8d0f87532c74120b"}, - {file = "immutables-0.18-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:798b4d6c388116effa7523591e4e39865292e4fa74e169b05a0759a16f604ce1"}, - {file = "immutables-0.18-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b3621256bc8058a7973f736b9e2c940e17133476265a0a83b8df8c0f446ca32f"}, - {file = "immutables-0.18-cp310-cp310-win32.whl", hash = "sha256:98f67bd36532582751dcc9021fdb60e7efc82e5717ae5927b84d0b86ea58fe12"}, - {file = "immutables-0.18-cp310-cp310-win_amd64.whl", hash = "sha256:69352b45a115808219feaf0bb7a551e9aa76c72684db93cd03f11474165f4569"}, - {file = "immutables-0.18-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6ee2d6f8816fce53fa89b6a1ba2d4a96b344bf584d6ed0b10a871b17fff46e49"}, - {file = "immutables-0.18-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13159cedb698fdd243d9f2a7469c1628e075a180fc02f865dd98322b92a14aaf"}, - {file = "immutables-0.18-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d72527fde329e3b566b67c954237be52b07d6e84ff23dcc1e94499755cacff6"}, - {file = "immutables-0.18-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53fccddd28cc3214aa48ca564702311c07eac069190dd890e097802c5d69b33a"}, - {file = "immutables-0.18-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a29e3aa0fe05fb2cc6b31039f448aa6206d7f0cdb660c98aa9be6d12070d6840"}, - {file = "immutables-0.18-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:ffced8535cc673fcfb411d28ba5744689a6978fa596c803725a76f43c1bda911"}, - {file = "immutables-0.18-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:9f17407491164beb689d426f7985f79ae9dfa69868653cfbdb95645f6bf05cb0"}, - {file = "immutables-0.18-cp36-cp36m-win32.whl", hash = "sha256:74456c579cfd53f883cdcc0700e3871648a3316767efc1adf8c723ad3d8addec"}, - {file = "immutables-0.18-cp36-cp36m-win_amd64.whl", hash = "sha256:e4c2110173649acf67bd763bbd2a9c3a863a1d20fd7f3db3493ce4e0fb04fae5"}, - {file = "immutables-0.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa5292630b08c874972931bac06ee381cb6fb7382d7be1856234d7bd4a8e676"}, - {file = "immutables-0.18-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc830a689a55e404f0e23d7d69e01c218fa8a0be54a6ca5df45b6fbfeeac648a"}, - {file = "immutables-0.18-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5caf9c670e6851e7f310716c7dcdf8705236d13056eda1fab3deaad5d7198468"}, - {file = "immutables-0.18-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:853d63f4a07b2ea2131ba0831aeec11f6a6ee5e290e8f175bf56842762d7412e"}, - {file = "immutables-0.18-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9a86dcca4bb406f80e7a18c233aec0e76a7530c456e24aa1e19a708a34f2aac1"}, - {file = "immutables-0.18-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6baf4dc11ba0e9f41a6cbde7ecaa7af9cb482559b92ba3254e3e37a518b1970e"}, - {file = "immutables-0.18-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:734ec4467dd15f9135ca5ecccc91e796a67d27c227e81554f9e06b1bb3b28d6d"}, - {file = "immutables-0.18-cp37-cp37m-win32.whl", hash = "sha256:f6edb73619aa0a5fe4a77d97dd9d39bfeef61a5afe71aa5bdceccf59b933999e"}, - {file = "immutables-0.18-cp37-cp37m-win_amd64.whl", hash = "sha256:fade8ccf7afbc1e7ea353159fa90cc04395f2f4f57658160d7a02f6aa60c4e77"}, - {file = "immutables-0.18-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8b650d779a46441dccd02e7ee8326dbd0dec633c6bd75e9fe13373a6b19570dd"}, - {file = "immutables-0.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1acbbc333f1643fd1ed21bcc3e09aad2ef6648478a0cae76a2ca5823764a7d3b"}, - {file = "immutables-0.18-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3bad4d43009fa61ea40d887e6fa89ae7c4e62dff5e4a878d60b76cf245720bb"}, - {file = "immutables-0.18-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e04b61ddffd4ccb4d7ab823b2e55dbb4ad47c37697e311fae4b98b3c023ab194"}, - {file = "immutables-0.18-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54577e46c5332d7390212040c084335b7d667504847ed2788428d44f20e595ce"}, - {file = "immutables-0.18-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1330f96eb6a3a11f5d02f30b2c6393ef30d01a79f7144d63d2a3e6ff05cb99db"}, - {file = "immutables-0.18-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1d6821d7718cf9f4a7b1d9e765fc22a9d1ae0fad3fabd8724b4e614d2a6e0b54"}, - {file = "immutables-0.18-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45bd862a5dfb952eaff4a9c2448712c5a550dd956575e23cbfc512010fb06c74"}, - {file = "immutables-0.18-cp38-cp38-win32.whl", hash = "sha256:989606e440492736112b471dcd80586e3d4a63bc6f8ff4f9d1d612e0f96cb683"}, - {file = "immutables-0.18-cp38-cp38-win_amd64.whl", hash = "sha256:ac9e05f846392e983fb59f74ed2334031b366251d16d24122e4c85f70fb6e2da"}, - {file = "immutables-0.18-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de1a091ab89b7ba50501a915a0fbdceb52b079c752f4f7c76d2060237774a714"}, - {file = "immutables-0.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d43b16b6adbe1327c6688e14b125cb3b940e748790b305de96c8d55668ac25f"}, - {file = "immutables-0.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f32b5933393e4cc204d8f9e7d9f503ec052e30f612090be0de0dd31b1464b35"}, - {file = "immutables-0.18-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525fe9001b5a96c325eec41677efaeb8c3610776e834ce7f31fbe3d33cc05252"}, - {file = "immutables-0.18-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11da4946e19f3b24a873b2ba2891cc226a89bb398561c62dfb966a9b6501a4a"}, - {file = "immutables-0.18-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:90da9dea0a1c0a907d511f124cd87fe090c0e30a951c3fe68bc9782ae4f2c77f"}, - {file = "immutables-0.18-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77bdc96dc24e32839557cde3785f8039a369c95529ff9179044b81d0ba4bd02c"}, - {file = "immutables-0.18-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:210efea163a704597cfdb2d30713d3c0963c30f0d997539c9ab5da40e3d6a886"}, - {file = "immutables-0.18-cp39-cp39-win32.whl", hash = "sha256:535616ad7ca1174a27ade637192c970bfedb0b0e0467e69ce415b40d7cf7ba0c"}, - {file = "immutables-0.18-cp39-cp39-win_amd64.whl", hash = "sha256:1338aad6fd69f11442adcbb3402a028c90f6e945682ddb8aba462a3827f2d427"}, - {file = "immutables-0.18.tar.gz", hash = "sha256:5336c7974084cce62f7e29aaff81a3c3f75e0fd0a23a2faeb986ae0ea08d8cf4"}, -] - -[package.dependencies] -typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} - -[package.extras] -test = ["flake8 (>=3.8.4,<3.9.0)", "mypy (==0.942)", "pycodestyle (>=2.6.0,<2.7.0)", "pytest (>=6.2.4,<6.3.0)"] - [[package]] name = "importlib-metadata" version = "1.7.0" @@ -976,58 +997,74 @@ zipp = ">=0.5" docs = ["rst.linker", "sphinx"] testing = ["importlib-resources (>=1.3)", "packaging", "pep517"] +[[package]] +name = "importlib-resources" +version = "5.0.7" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "importlib_resources-5.0.7-py3-none-any.whl", hash = "sha256:2238159eb743bd85304a16e0536048b3e991c531d1cd51c4a834d1ccf2829057"}, + {file = "importlib_resources-5.0.7.tar.gz", hash = "sha256:4df460394562b4581bb4e4087ad9447bd433148fba44241754ec3152499f1d1b"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] + [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "invoke" -version = "1.7.1" +version = "1.7.3" description = "Pythonic task execution" category = "dev" optional = false python-versions = "*" files = [ - {file = "invoke-1.7.1-py3-none-any.whl", hash = "sha256:2dc975b4f92be0c0a174ad2d063010c8a1fdb5e9389d69871001118b4fcac4fb"}, - {file = "invoke-1.7.1.tar.gz", hash = "sha256:7b6deaf585eee0a848205d0b8c0014b9bf6f287a8eb798818a642dff1df14b19"}, + {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, + {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, ] [[package]] name = "isort" -version = "5.10.1" +version = "5.12.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.8.0" files = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, ] [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile-deprecated-finder = ["pipreqs", "requirementslib"] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" -version = "3.0.3" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] [package.dependencies] @@ -1038,14 +1075,14 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jmespath" -version = "0.10.0" +version = "1.0.1" description = "JSON Matching Expressions" category = "dev" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" files = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] [[package]] @@ -1062,128 +1099,118 @@ files = [ [[package]] name = "lazy-object-proxy" -version = "1.7.1" +version = "1.9.0" description = "A fast and thorough lazy object proxy." category = "dev" optional = false -python-versions = ">=3.6" -files = [ - {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, - {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, ] [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -1217,125 +1244,127 @@ test = ["pytest (<5.4)", "pytest-cov"] [[package]] name = "multidict" -version = "5.2.0" +version = "6.0.4" description = "multidict implementation" category = "dev" optional = false -python-versions = ">=3.6" -files = [ - {file = "multidict-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3822c5894c72e3b35aae9909bef66ec83e44522faf767c0ad39e0e2de11d3b55"}, - {file = "multidict-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:28e6d883acd8674887d7edc896b91751dc2d8e87fbdca8359591a13872799e4e"}, - {file = "multidict-5.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b61f85101ef08cbbc37846ac0e43f027f7844f3fade9b7f6dd087178caedeee7"}, - {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9b668c065968c5979fe6b6fa6760bb6ab9aeb94b75b73c0a9c1acf6393ac3bf"}, - {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517d75522b7b18a3385726b54a081afd425d4f41144a5399e5abd97ccafdf36b"}, - {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b4ac3ba7a97b35a5ccf34f41b5a8642a01d1e55454b699e5e8e7a99b5a3acf5"}, - {file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:df23c83398715b26ab09574217ca21e14694917a0c857e356fd39e1c64f8283f"}, - {file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e58a9b5cc96e014ddf93c2227cbdeca94b56a7eb77300205d6e4001805391747"}, - {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f76440e480c3b2ca7f843ff8a48dc82446b86ed4930552d736c0bac507498a52"}, - {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cfde464ca4af42a629648c0b0d79b8f295cf5b695412451716531d6916461628"}, - {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0fed465af2e0eb6357ba95795d003ac0bdb546305cc2366b1fc8f0ad67cc3fda"}, - {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:b70913cbf2e14275013be98a06ef4b412329fe7b4f83d64eb70dce8269ed1e1a"}, - {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5635bcf1b75f0f6ef3c8a1ad07b500104a971e38d3683167b9454cb6465ac86"}, - {file = "multidict-5.2.0-cp310-cp310-win32.whl", hash = "sha256:77f0fb7200cc7dedda7a60912f2059086e29ff67cefbc58d2506638c1a9132d7"}, - {file = "multidict-5.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:9416cf11bcd73c861267e88aea71e9fcc35302b3943e45e1dbb4317f91a4b34f"}, - {file = "multidict-5.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd77c8f3cba815aa69cb97ee2b2ef385c7c12ada9c734b0f3b32e26bb88bbf1d"}, - {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ec9aea6223adf46999f22e2c0ab6cf33f5914be604a404f658386a8f1fba37"}, - {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5283c0a00f48e8cafcecadebfa0ed1dac8b39e295c7248c44c665c16dc1138b"}, - {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f79c19c6420962eb17c7e48878a03053b7ccd7b69f389d5831c0a4a7f1ac0a1"}, - {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4a67f1080123de76e4e97a18d10350df6a7182e243312426d508712e99988d4"}, - {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:94b117e27efd8e08b4046c57461d5a114d26b40824995a2eb58372b94f9fca02"}, - {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2e77282fd1d677c313ffcaddfec236bf23f273c4fba7cdf198108f5940ae10f5"}, - {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:116347c63ba049c1ea56e157fa8aa6edaf5e92925c9b64f3da7769bdfa012858"}, - {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:dc3a866cf6c13d59a01878cd806f219340f3e82eed514485e094321f24900677"}, - {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac42181292099d91217a82e3fa3ce0e0ddf3a74fd891b7c2b347a7f5aa0edded"}, - {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:f0bb0973f42ffcb5e3537548e0767079420aefd94ba990b61cf7bb8d47f4916d"}, - {file = "multidict-5.2.0-cp36-cp36m-win32.whl", hash = "sha256:ea21d4d5104b4f840b91d9dc8cbc832aba9612121eaba503e54eaab1ad140eb9"}, - {file = "multidict-5.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:e6453f3cbeb78440747096f239d282cc57a2997a16b5197c9bc839099e1633d0"}, - {file = "multidict-5.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3def943bfd5f1c47d51fd324df1e806d8da1f8e105cc7f1c76a1daf0f7e17b0"}, - {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35591729668a303a02b06e8dba0eb8140c4a1bfd4c4b3209a436a02a5ac1de11"}, - {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8cacda0b679ebc25624d5de66c705bc53dcc7c6f02a7fb0f3ca5e227d80422"}, - {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:baf1856fab8212bf35230c019cde7c641887e3fc08cadd39d32a421a30151ea3"}, - {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a43616aec0f0d53c411582c451f5d3e1123a68cc7b3475d6f7d97a626f8ff90d"}, - {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25cbd39a9029b409167aa0a20d8a17f502d43f2efebfe9e3ac019fe6796c59ac"}, - {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a2cbcfbea6dc776782a444db819c8b78afe4db597211298dd8b2222f73e9cd0"}, - {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d2d7d1fff8e09d99354c04c3fd5b560fb04639fd45926b34e27cfdec678a704"}, - {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a37e9a68349f6abe24130846e2f1d2e38f7ddab30b81b754e5a1fde32f782b23"}, - {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:637c1896497ff19e1ee27c1c2c2ddaa9f2d134bbb5e0c52254361ea20486418d"}, - {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9815765f9dcda04921ba467957be543423e5ec6a1136135d84f2ae092c50d87b"}, - {file = "multidict-5.2.0-cp37-cp37m-win32.whl", hash = "sha256:8b911d74acdc1fe2941e59b4f1a278a330e9c34c6c8ca1ee21264c51ec9b67ef"}, - {file = "multidict-5.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:380b868f55f63d048a25931a1632818f90e4be71d2081c2338fcf656d299949a"}, - {file = "multidict-5.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e7d81ce5744757d2f05fc41896e3b2ae0458464b14b5a2c1e87a6a9d69aefaa8"}, - {file = "multidict-5.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d1d55cdf706ddc62822d394d1df53573d32a7a07d4f099470d3cb9323b721b6"}, - {file = "multidict-5.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4771d0d0ac9d9fe9e24e33bed482a13dfc1256d008d101485fe460359476065"}, - {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7d57ea65744d249427793c042094c4016789eb2562576fb831870f9c878d9e"}, - {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdd68778f96216596218b4e8882944d24a634d984ee1a5a049b300377878fa7c"}, - {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecc99bce8ee42dcad15848c7885197d26841cb24fa2ee6e89d23b8993c871c64"}, - {file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:067150fad08e6f2dd91a650c7a49ba65085303fcc3decbd64a57dc13a2733031"}, - {file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78c106b2b506b4d895ddc801ff509f941119394b89c9115580014127414e6c2d"}, - {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6c4fa1ec16e01e292315ba76eb1d012c025b99d22896bd14a66628b245e3e01"}, - {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b227345e4186809d31f22087d0265655114af7cda442ecaf72246275865bebe4"}, - {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:06560fbdcf22c9387100979e65b26fba0816c162b888cb65b845d3def7a54c9b"}, - {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7878b61c867fb2df7a95e44b316f88d5a3742390c99dfba6c557a21b30180cac"}, - {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:246145bff76cc4b19310f0ad28bd0769b940c2a49fc601b86bfd150cbd72bb22"}, - {file = "multidict-5.2.0-cp38-cp38-win32.whl", hash = "sha256:c30ac9f562106cd9e8071c23949a067b10211917fdcb75b4718cf5775356a940"}, - {file = "multidict-5.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:f19001e790013ed580abfde2a4465388950728861b52f0da73e8e8a9418533c0"}, - {file = "multidict-5.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c1ff762e2ee126e6f1258650ac641e2b8e1f3d927a925aafcfde943b77a36d24"}, - {file = "multidict-5.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd6c9c50bf2ad3f0448edaa1a3b55b2e6866ef8feca5d8dbec10ec7c94371d21"}, - {file = "multidict-5.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc66d4016f6e50ed36fb39cd287a3878ffcebfa90008535c62e0e90a7ab713ae"}, - {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9acb76d5f3dd9421874923da2ed1e76041cb51b9337fd7f507edde1d86535d6"}, - {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfc924a7e946dd3c6360e50e8f750d51e3ef5395c95dc054bc9eab0f70df4f9c"}, - {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32fdba7333eb2351fee2596b756d730d62b5827d5e1ab2f84e6cbb287cc67fe0"}, - {file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b9aad49466b8d828b96b9e3630006234879c8d3e2b0a9d99219b3121bc5cdb17"}, - {file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:93de39267c4c676c9ebb2057e98a8138bade0d806aad4d864322eee0803140a0"}, - {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9bef5cff994ca3026fcc90680e326d1a19df9841c5e3d224076407cc21471a1"}, - {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5f841c4f14331fd1e36cbf3336ed7be2cb2a8f110ce40ea253e5573387db7621"}, - {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:38ba256ee9b310da6a1a0f013ef4e422fca30a685bcbec86a969bd520504e341"}, - {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3bc3b1621b979621cee9f7b09f024ec76ec03cc365e638126a056317470bde1b"}, - {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ee908c070020d682e9b42c8f621e8bb10c767d04416e2ebe44e37d0f44d9ad5"}, - {file = "multidict-5.2.0-cp39-cp39-win32.whl", hash = "sha256:1c7976cd1c157fa7ba5456ae5d31ccdf1479680dc9b8d8aa28afabc370df42b8"}, - {file = "multidict-5.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:c9631c642e08b9fff1c6255487e62971d8b8e821808ddd013d8ac058087591ac"}, - {file = "multidict-5.2.0.tar.gz", hash = "sha256:0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce"}, +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] [[package]] name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] name = "netutils" -version = "1.2.0" +version = "1.6.0" description = "Common helper functions useful in network automation." category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "netutils-1.2.0-py3-none-any.whl", hash = "sha256:23c2ca960544ac6674263063a3580fe3d9d94d5898512df468298659c7eff7e3"}, - {file = "netutils-1.2.0.tar.gz", hash = "sha256:a661326a46352208ea465f0305831f042f7943289e4cbc3e085c23c07682d24b"}, + {file = "netutils-1.6.0-py3-none-any.whl", hash = "sha256:e755e6141d0968f1deeb61693a4023f4f5fe1f0dde25d94ac1008f8191d8d237"}, + {file = "netutils-1.6.0.tar.gz", hash = "sha256:bd2fa691e172fe9d5c9e6fc5e2593316eb7fd2c36450454894ed13b274763d70"}, ] +[package.extras] +optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] + [[package]] name = "packaging" -version = "21.3" +version = "23.1" description = "Core utilities for Python packages" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - [[package]] name = "parameterized" version = "0.8.1" @@ -1353,71 +1382,68 @@ dev = ["jinja2"] [[package]] name = "pathspec" -version = "0.9.0" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" files = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] name = "pbr" -version = "5.10.0" +version = "5.11.1" description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-5.10.0-py2.py3-none-any.whl", hash = "sha256:da3e18aac0a3c003e9eea1a81bd23e5a3a75d745670dcf736317b7d966887fdf"}, - {file = "pbr-5.10.0.tar.gz", hash = "sha256:cfcc4ff8e698256fc17ea3ff796478b050852585aa5bae79ecd05b2ab7b39b9a"}, + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, ] [[package]] name = "perky" -version = "0.5.5" +version = "0.9.2" description = "A simple, Pythonic file format. Same interface as the" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "perky-0.5.5-py3-none-any.whl", hash = "sha256:29857b816d4d02bfb9cb875f07424af66b93c06d9e610943b25b2d50b75888e4"}, - {file = "perky-0.5.5.tar.gz", hash = "sha256:7998a8131fd2313ce948e27e290e49764837d99dd6133e2ee88f05e12561aaa1"}, + {file = "perky-0.9.2-py3-none-any.whl", hash = "sha256:bd1a3e2ebeedc611dcba6e01d6bf3fab872782e606bee4acbdceae7b19877192"}, + {file = "perky-0.9.2.tar.gz", hash = "sha256:02e5ebe84c5beaff6c8254497c75793b7dbaca903941c82035958ddb1bb66178"}, ] [[package]] name = "platformdirs" -version = "2.4.0" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "3.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, - {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] @@ -1448,52 +1474,52 @@ files = [ [[package]] name = "pydantic" -version = "1.9.2" +version = "1.10.12" description = "Data validation and settings management using python type hints" category = "dev" optional = false -python-versions = ">=3.6.1" -files = [ - {file = "pydantic-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c9e04a6cdb7a363d7cb3ccf0efea51e0abb48e180c0d31dca8d247967d85c6e"}, - {file = "pydantic-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafe841be1103f340a24977f61dee76172e4ae5f647ab9e7fd1e1fca51524f08"}, - {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afacf6d2a41ed91fc631bade88b1d319c51ab5418870802cedb590b709c5ae3c"}, - {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ee0d69b2a5b341fc7927e92cae7ddcfd95e624dfc4870b32a85568bd65e6131"}, - {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ff68fc85355532ea77559ede81f35fff79a6a5543477e168ab3a381887caea76"}, - {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0f5e142ef8217019e3eef6ae1b6b55f09a7a15972958d44fbd228214cede567"}, - {file = "pydantic-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:615661bfc37e82ac677543704437ff737418e4ea04bef9cf11c6d27346606044"}, - {file = "pydantic-1.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:328558c9f2eed77bd8fffad3cef39dbbe3edc7044517f4625a769d45d4cf7555"}, - {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd446bdb7755c3a94e56d7bdfd3ee92396070efa8ef3a34fab9579fe6aa1d84"}, - {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0b214e57623a535936005797567231a12d0da0c29711eb3514bc2b3cd008d0f"}, - {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d8ce3fb0841763a89322ea0432f1f59a2d3feae07a63ea2c958b2315e1ae8adb"}, - {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b34ba24f3e2d0b39b43f0ca62008f7ba962cff51efa56e64ee25c4af6eed987b"}, - {file = "pydantic-1.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:84d76ecc908d917f4684b354a39fd885d69dd0491be175f3465fe4b59811c001"}, - {file = "pydantic-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4de71c718c9756d679420c69f216776c2e977459f77e8f679a4a961dc7304a56"}, - {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5803ad846cdd1ed0d97eb00292b870c29c1f03732a010e66908ff48a762f20e4"}, - {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8c5360a0297a713b4123608a7909e6869e1b56d0e96eb0d792c27585d40757f"}, - {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:cdb4272678db803ddf94caa4f94f8672e9a46bae4a44f167095e4d06fec12979"}, - {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:19b5686387ea0d1ea52ecc4cffb71abb21702c5e5b2ac626fd4dbaa0834aa49d"}, - {file = "pydantic-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e0b4fb13ad4db4058a7c3c80e2569adbd810c25e6ca3bbd8b2a9cc2cc871d7"}, - {file = "pydantic-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91089b2e281713f3893cd01d8e576771cd5bfdfbff5d0ed95969f47ef6d676c3"}, - {file = "pydantic-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e631c70c9280e3129f071635b81207cad85e6c08e253539467e4ead0e5b219aa"}, - {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b3946f87e5cef3ba2e7bd3a4eb5a20385fe36521d6cc1ebf3c08a6697c6cfb3"}, - {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5565a49effe38d51882cb7bac18bda013cdb34d80ac336428e8908f0b72499b0"}, - {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd67cb2c2d9602ad159389c29e4ca964b86fa2f35c2faef54c3eb28b4efd36c8"}, - {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4aafd4e55e8ad5bd1b19572ea2df546ccace7945853832bb99422a79c70ce9b8"}, - {file = "pydantic-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:d70916235d478404a3fa8c997b003b5f33aeac4686ac1baa767234a0f8ac2326"}, - {file = "pydantic-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ca86b525264daa5f6b192f216a0d1e860b7383e3da1c65a1908f9c02f42801"}, - {file = "pydantic-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44"}, - {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e78578f0c7481c850d1c969aca9a65405887003484d24f6110458fb02cca7747"}, - {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5da164119602212a3fe7e3bc08911a89db4710ae51444b4224c2382fd09ad453"}, - {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ead3cd020d526f75b4188e0a8d71c0dbbe1b4b6b5dc0ea775a93aca16256aeb"}, - {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7d0f183b305629765910eaad707800d2f47c6ac5bcfb8c6397abdc30b69eeb15"}, - {file = "pydantic-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1a68f4f65a9ee64b6ccccb5bf7e17db07caebd2730109cb8a95863cfa9c4e55"}, - {file = "pydantic-1.9.2-py3-none-any.whl", hash = "sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e"}, - {file = "pydantic-1.9.2.tar.gz", hash = "sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d"}, +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, + {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, + {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, + {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, + {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, + {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, + {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, + {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, + {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, ] [package.dependencies] -dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} -typing-extensions = ">=3.7.4.3" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -1501,14 +1527,14 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pygments" -version = "2.13.0" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -1516,61 +1542,49 @@ plugins = ["importlib-metadata"] [[package]] name = "pylint" -version = "2.13.9" +version = "2.17.5" description = "python code static checker" category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" files = [ - {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, - {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, + {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"}, + {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"}, ] [package.dependencies] -astroid = ">=2.11.5,<=2.12.0-dev0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -dill = ">=0.2" +astroid = ">=2.15.6,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -testutil = ["gitpython (>3)"] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] [[package]] name = "pynautobot" -version = "1.1.2" +version = "2.0.0rc2" description = "Nautobot API client library" category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7,<4.0" files = [ - {file = "pynautobot-1.1.2-py3-none-any.whl", hash = "sha256:f79c7d0aa7a413d0c5e82e0de2142041c88f34a9515381a1c1b27dc888eb69ca"}, - {file = "pynautobot-1.1.2.tar.gz", hash = "sha256:e599b1901ce24749217905d81f8c3ee281bf93375449e6180818cc708b3d850c"}, + {file = "pynautobot-2.0.0rc2-py3-none-any.whl", hash = "sha256:2f3f5ece11be8b897524428d0b352985302c0b6528b33ffab24573f148b02c3b"}, + {file = "pynautobot-2.0.0rc2.tar.gz", hash = "sha256:252b9e0a9c7bd6782991ec467d65f4dfe1d8f5118c926f9c53be8156e7b4a2be"}, ] [package.dependencies] -requests = ">=2.20.0,<3.0.0" - -[package.extras] -docs = ["Sphinx (>=3.5.1,<4.0.0)"] - -[[package]] -name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +requests = ">=2.30.0,<3.0.0" +urllib3 = ">=1.21.1,<1.27" [[package]] name = "pytest" @@ -1588,7 +1602,6 @@ files = [ atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" @@ -1600,14 +1613,14 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-forked" -version = "1.4.0" +version = "1.6.0" description = "run tests in isolated forked subprocesses" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, - {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, + {file = "pytest-forked-1.6.0.tar.gz", hash = "sha256:4dafd46a9a600f65d822b8f605133ecf5b3e1941ebb3588e943b4e3eb71a5a3f"}, + {file = "pytest_forked-1.6.0-py3-none-any.whl", hash = "sha256:810958f66a91afb1a1e2ae83089d8dc1cd2437ac96b12963042fbb9fb4d16af0"}, ] [package.dependencies] @@ -1616,14 +1629,14 @@ pytest = ">=3.10" [[package]] name = "pytest-mock" -version = "3.6.1" +version = "3.11.1" description = "Thin-wrapper around the mock package for easier use with pytest" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, - {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, + {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"}, + {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"}, ] [package.dependencies] @@ -1649,124 +1662,188 @@ pytest = ">=2.5.2,<7" [[package]] name = "pytest-xdist" -version = "2.5.0" -description = "pytest xdist plugin for distributed testing and loop-on-failing modes" +version = "3.3.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"}, - {file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"}, + {file = "pytest-xdist-3.3.1.tar.gz", hash = "sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93"}, + {file = "pytest_xdist-3.3.1-py3-none-any.whl", hash = "sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2"}, ] [package.dependencies] execnet = ">=1.1" pytest = ">=6.2.0" -pytest-forked = "*" [package.extras] psutil = ["psutil (>=3.0)"] setproctitle = ["setproctitle"] testing = ["filelock"] -[[package]] -name = "pytz" -version = "2022.2.1" -description = "World timezone definitions, modern and historical" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"}, - {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"}, -] - [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {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_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"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "requests" -version = "2.27.1" +version = "2.31.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "resolvelib" +version = "1.0.1" +description = "Resolve abstract dependencies into concrete ones" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf"}, + {file = "resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309"}, +] + +[package.extras] +examples = ["html5lib", "packaging", "pygraphviz", "requests"] +lint = ["black", "flake8", "isort", "mypy", "types-requests"] +release = ["build", "towncrier", "twine"] +test = ["commentjson", "packaging", "pytest"] + +[[package]] +name = "rich" +version = "12.6.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "dev" +optional = false +python-versions = ">=3.6.3,<4.0.0" +files = [ + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, +] + +[package.dependencies] +commonmark = ">=0.9.0,<0.10.0" +pygments = ">=2.6.0,<3.0.0" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<5)"] +jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [[package]] name = "rstcheck" -version = "3.5.0" +version = "6.1.2" description = "Checks syntax of reStructuredText and code blocks nested within it" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7,<4.0" +files = [ + {file = "rstcheck-6.1.2-py3-none-any.whl", hash = "sha256:4aaa46e0debc179f849807c453fa384fd2b75167faf5b1274115730805fab529"}, + {file = "rstcheck-6.1.2.tar.gz", hash = "sha256:f9cb07a72ef9a81d1e32187eae29b00a89421ccba1bde0b1652a08ed0923f61b"}, +] + +[package.dependencies] +rstcheck-core = ">=1.0.2,<2.0.0" +typer = {version = ">=0.4.1,<0.8", extras = ["all"]} + +[package.extras] +docs = ["m2r2 (>=0.3.2)", "sphinx", "sphinx-autobuild (==2021.3.14)", "sphinx-click (>=4.0.3,<5.0.0)", "sphinx-rtd-dark-mode (>=1.2.4,<2.0.0)", "sphinx-rtd-theme (<1)", "sphinxcontrib-spelling (>=7.3)"] +sphinx = ["sphinx"] +testing = ["coverage-conditional-plugin (>=0.5)", "coverage[toml] (>=6.0)", "pytest (>=7.2)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.0)", "pytest-sugar (>=0.9.5)"] +toml = ["tomli"] + +[[package]] +name = "rstcheck-core" +version = "1.0.3" +description = "Checks syntax of reStructuredText and code blocks nested within it" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" files = [ - {file = "rstcheck-3.5.0-py3-none-any.whl", hash = "sha256:30c36768c4bd617a85ab93c31facaf410582e53803fde624845eb00c1430070c"}, - {file = "rstcheck-3.5.0.tar.gz", hash = "sha256:d4b035300b7d898403544f38c3a4980171ce85f487d25e188347bbafb6ee58c0"}, + {file = "rstcheck_core-1.0.3-py3-none-any.whl", hash = "sha256:d75d7df8f15b58e8aafe322d6fb6ef1ac8d12bb563089b0696948a00ee7f601a"}, + {file = "rstcheck_core-1.0.3.tar.gz", hash = "sha256:add19c9a1b97d9087f4b463b49c12cd8a9c03689a255e99089c70a2692f16369"}, ] [package.dependencies] -docutils = ">=0.7" +docutils = ">=0.7,<0.20" +pydantic = ">=1.2,<2.0" +types-docutils = ">=0.18,<0.20" + +[package.extras] +docs = ["m2r2 (>=0.3.2)", "sphinx (>=4.0,<6.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-autodoc-typehints (>=1.15)", "sphinx-rtd-dark-mode (>=1.2.4,<2.0.0)", "sphinx-rtd-theme (<1)", "sphinxcontrib-apidoc (>=0.3)", "sphinxcontrib-spelling (>=7.3)"] +sphinx = ["sphinx (>=4.0,<6.0)"] +testing = ["coverage-conditional-plugin (>=0.5)", "coverage[toml] (>=6.0)", "pytest (>=6.0)", "pytest-cov (>=3.0)", "pytest-mock (>=3.7)", "pytest-randomly (>=3.0)", "pytest-sugar (>=0.9.5)"] +toml = ["tomli (>=2.0,<3.0)"] [[package]] name = "semantic-version" @@ -1786,19 +1863,20 @@ doc = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "setuptools" -version = "59.6.0" +version = "68.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "setuptools-59.6.0-py3-none-any.whl", hash = "sha256:4ce92f1e1f8f01233ee9952c04f6b81d1e02939d6e1b488428154974a4d0783e"}, - {file = "setuptools-59.6.0.tar.gz", hash = "sha256:22c7348c6d2976a52632c67f7ab0cdf40147db7789f9aed18734643fe9cf3373"}, + {file = "setuptools-68.2.0-py3-none-any.whl", hash = "sha256:af3d5949030c3f493f550876b2fd1dd5ec66689c4ee5d5344f009746f71fd5a8"}, + {file = "setuptools-68.2.0.tar.gz", hash = "sha256:00478ca80aeebeecb2f288d3206b0de568df5cd2b8fada1209843cc9a8d88a48"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=8.2)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-inline-tabs", "sphinxcontrib-towncrier"] -testing = ["flake8-2020", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "paver", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy", "pytest-virtualenv (>=1.2.7)", "pytest-xdist", "sphinx", "virtualenv (>=13.0.0)", "wheel"] +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-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "sh" @@ -1811,6 +1889,18 @@ files = [ {file = "sh-1.14.3.tar.gz", hash = "sha256:e4045b6c732d9ce75d571c79f5ac2234edd9ae4f5fa9d59b09705082bdca18c7"}, ] +[[package]] +name = "shellingham" +version = "1.5.3" +description = "Tool to Detect Surrounding Shell" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.3-py2.py3-none-any.whl", hash = "sha256:419c6a164770c9c7cfcaeddfacb3d31ac7a8db0b0f3e9c1287679359734107e9"}, + {file = "shellingham-1.5.3.tar.gz", hash = "sha256:cb4a6fec583535bc6da17b647dd2330cf7ef30239e05d547d99ae3705fd0f7f8"}, +] + [[package]] name = "six" version = "1.16.0" @@ -1861,21 +1951,21 @@ files = [ [[package]] name = "sphinx" -version = "4.3.2" +version = "3.5.3" description = "Python documentation generator" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.5" files = [ - {file = "Sphinx-4.3.2-py3-none-any.whl", hash = "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851"}, - {file = "Sphinx-4.3.2.tar.gz", hash = "sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c"}, + {file = "Sphinx-3.5.3-py3-none-any.whl", hash = "sha256:3f01732296465648da43dec8fb40dc451ba79eb3e2cc5c6d79005fd98197107d"}, + {file = "Sphinx-3.5.3.tar.gz", hash = "sha256:ce9c228456131bab09a3d7d10ae58474de562a6f79abb3dc811ae401cf8c1abc"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=1.3" colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" +docutils = ">=0.12" imagesize = "*" Jinja2 = ">=2.3" packaging = "*" @@ -1885,45 +1975,44 @@ setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-htmlhelp = "*" sphinxcontrib-jsmath = "*" sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" +sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.920)", "types-pkg-resources", "types-requests", "types-typed-ast"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.800)"] test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] name = "sphinx-rtd-theme" -version = "1.0.0" +version = "0.5.1" description = "Read the Docs theme for Sphinx" category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = "*" files = [ - {file = "sphinx_rtd_theme-1.0.0-py2.py3-none-any.whl", hash = "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8"}, - {file = "sphinx_rtd_theme-1.0.0.tar.gz", hash = "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"}, + {file = "sphinx_rtd_theme-0.5.1-py2.py3-none-any.whl", hash = "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"}, + {file = "sphinx_rtd_theme-0.5.1.tar.gz", hash = "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5"}, ] [package.dependencies] -docutils = "<0.18" -sphinx = ">=1.6" +sphinx = "*" [package.extras] dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client"] [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, ] [package.extras] @@ -1948,14 +2037,14 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.0" +version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, ] [package.extras] @@ -2011,18 +2100,17 @@ test = ["pytest"] [[package]] name = "stevedore" -version = "3.5.0" +version = "5.1.0" description = "Manage dynamic plugins for Python applications" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"}, - {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"}, + {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, + {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, ] [package.dependencies] -importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] @@ -2039,14 +2127,26 @@ files = [ [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.1" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.7" files = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, ] [[package]] @@ -2065,61 +2165,63 @@ files = [ six = "*" [[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "typer" +version = "0.7.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, + {file = "typer-0.7.0-py3-none-any.whl", hash = "sha256:b5e704f4e48ec263de1c0b3a2387cd405a13767d2f907f44c1a08cbad96f606d"}, + {file = "typer-0.7.0.tar.gz", hash = "sha256:ff797846578a9f2a201b53442aedeb543319466870fbe1c701eab66dd7681165"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +colorama = {version = ">=0.4.3,<0.5.0", optional = true, markers = "extra == \"all\""} +rich = {version = ">=10.11.0,<13.0.0", optional = true, markers = "extra == \"all\""} +shellingham = {version = ">=1.3.0,<2.0.0", optional = true, markers = "extra == \"all\""} + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + +[[package]] +name = "types-docutils" +version = "0.19.1.9" +description = "Typing stubs for docutils" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "types-docutils-0.19.1.9.tar.gz", hash = "sha256:1d029567e67c52992fd42aa968778bc10a5e445c8450fc751d672d6f50330a4a"}, + {file = "types_docutils-0.19.1.9-py3-none-any.whl", hash = "sha256:556fb7ee19248aa482caa142a830c940b776b0f8c7577a98abe0977574546a1d"}, ] [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] name = "urllib3" -version = "1.26.12" +version = "1.26.16" 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.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, ] [package.extras] @@ -2129,182 +2231,194 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "wrapt" -version = "1.14.1" +version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, ] [[package]] name = "yarl" -version = "1.7.2" +version = "1.9.2" description = "Yet another URL library" category = "dev" optional = false -python-versions = ">=3.6" -files = [ - {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, - {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, - {file = "yarl-1.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05"}, - {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523"}, - {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63"}, - {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98"}, - {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125"}, - {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e"}, - {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d"}, - {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23"}, - {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245"}, - {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739"}, - {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72"}, - {file = "yarl-1.7.2-cp310-cp310-win32.whl", hash = "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c"}, - {file = "yarl-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265"}, - {file = "yarl-1.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d"}, - {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656"}, - {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed"}, - {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee"}, - {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c"}, - {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92"}, - {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d"}, - {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b"}, - {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c"}, - {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa"}, - {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d"}, - {file = "yarl-1.7.2-cp36-cp36m-win32.whl", hash = "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1"}, - {file = "yarl-1.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913"}, - {file = "yarl-1.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63"}, - {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4"}, - {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba"}, - {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41"}, - {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e"}, - {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332"}, - {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52"}, - {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185"}, - {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986"}, - {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4"}, - {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b"}, - {file = "yarl-1.7.2-cp37-cp37m-win32.whl", hash = "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1"}, - {file = "yarl-1.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271"}, - {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576"}, - {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d"}, - {file = "yarl-1.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8"}, - {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d"}, - {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6"}, - {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a"}, - {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1"}, - {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0"}, - {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6"}, - {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832"}, - {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"}, - {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8"}, - {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b"}, - {file = "yarl-1.7.2-cp38-cp38-win32.whl", hash = "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef"}, - {file = "yarl-1.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f"}, - {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0"}, - {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1"}, - {file = "yarl-1.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3"}, - {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746"}, - {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de"}, - {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda"}, - {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b"}, - {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794"}, - {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac"}, - {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec"}, - {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe"}, - {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8"}, - {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8"}, - {file = "yarl-1.7.2-cp39-cp39-win32.whl", hash = "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d"}, - {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, - {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [[package]] name = "zipp" -version = "3.6.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, - {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["func-timeout", "jaraco.itertools", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] +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-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" -python-versions = "^3.6.2" -content-hash = "cb16ae4e8d748088f8d79b5f60af74d66a5a19bf3d660568d36aeaab35f2a76f" +python-versions = "^3.9" +content-hash = "efb9a6b323d785c4de952362faa12a2a6261a872be54af93f149a9521e6b2005" diff --git a/pyproject.toml b/pyproject.toml index cc28a1b4..789700b7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,19 +1,19 @@ [tool.poetry] name = "nautobot_ansible_modules" -version = "4.5.0" +version = "5.0.0" description = "Ansible collection to interact with Nautobot's API" authors = ["Network to Code =1.0.0"] diff --git a/tasks.py b/tasks.py index 2a3ddf07..6cebec42 100644 --- a/tasks.py +++ b/tasks.py @@ -24,9 +24,9 @@ def is_truthy(arg): namespace.configure( { "nautobot_ansible": { - "nautobot_ver": "1.5", + "nautobot_ver": "2.0.0", "project_name": "nautobot_ansible", - "python_ver": "3.7", + "python_ver": "3.9", "local": False, "compose_dir": os.path.join(os.path.dirname(__file__), "development"), "compose_files": ["docker-compose.yml"], @@ -238,7 +238,7 @@ def integration(context): destroy(context) start(context) context.run( - "docker-compose up --build --force-recreate --quiet-pull --exit-code-from integration integration", + "docker-compose up --build --force-recreate --exit-code-from integration integration", env={"PYTHON_VER": context["nautobot_ansible"]["python_ver"]}, ) diff --git a/tests/integration/entrypoint.sh b/tests/integration/entrypoint.sh index 8b261755..63b549d7 100755 --- a/tests/integration/entrypoint.sh +++ b/tests/integration/entrypoint.sh @@ -32,11 +32,7 @@ function main { echo "# Running..." # shellcheck disable=SC2086 - if [[ "${NAUTOBOT_VER:-}" == "1.3" ]]; then - ansible-test integration $ANSIBLE_INTEGRATION_ARGS --coverage --python "$PYTHON_VERSION" inventory "$@" - else - ansible-test integration $ANSIBLE_INTEGRATION_ARGS --coverage --python "$PYTHON_VERSION" inventory-1.4 "$@" - fi + ansible-test integration $ANSIBLE_INTEGRATION_ARGS --coverage --python "$PYTHON_VERSION" inventory "$@" ansible-test integration $ANSIBLE_INTEGRATION_ARGS --coverage --python "$PYTHON_VERSION" regression-latest "$@" ansible-test integration $ANSIBLE_INTEGRATION_ARGS --coverage --python "$PYTHON_VERSION" latest "$@" ansible-test coverage report diff --git a/tests/integration/integration_config.tmpl.yml b/tests/integration/integration_config.tmpl.yml index 85fab605..577e31d6 100644 --- a/tests/integration/integration_config.tmpl.yml +++ b/tests/integration/integration_config.tmpl.yml @@ -1,4 +1,4 @@ --- nautobot_url: ${NAUTOBOT_URL:-"http://nautobot:8000"} nautobot_token: ${NAUTOBOT_TOKEN:-"0123456789abcdef0123456789abcdef01234567"} -nautobot_version: ${NAUTOBOT_VER:-"1.3"} +nautobot_version: ${NAUTOBOT_VER:-"2.0"} diff --git a/tests/integration/nautobot-populate.py b/tests/integration/nautobot-populate.py index c2552ec2..37b426d0 100755 --- a/tests/integration/nautobot-populate.py +++ b/tests/integration/nautobot-populate.py @@ -13,7 +13,7 @@ # os.environ["INTEGRATION_TESTS"] -# Set nb variable to connect to Nautobot and use the veriable in future calls +# Set nb variable to connect to Nautobot and use the variable in future calls nb_host = os.getenv("NAUTOBOT_URL", "http://nautobot:8000") nb_token = os.getenv("NAUTOBOT_TOKEN", "0123456789abcdef0123456789abcdef01234567") nb = pynautobot.api(nb_host, nb_token) @@ -47,164 +47,187 @@ def make_nautobot_calls(endpoint, payload): create_tags = make_nautobot_calls( nb.extras.tags, [ - {"name": "First", "slug": "first"}, - {"name": "Second", "slug": "second"}, - {"name": "Third", "slug": "third"}, - {"name": "Schnozzberry", "slug": "schnozzberry"}, - {"name": "Lookup", "slug": "lookup"}, - {"name": "Nolookup", "slug": "nolookup"}, - {"name": "tagA", "slug": "taga"}, - {"name": "tagB", "slug": "tagb"}, - {"name": "tagC", "slug": "tagc"}, - {"name": "Updated", "slug": "updated"}, + {"name": "First", "content_types": ["dcim.device", "ipam.routetarget"]}, + {"name": "Second", "content_types": ["dcim.device", "ipam.routetarget"]}, + {"name": "Third", "content_types": ["dcim.device"]}, + { + "name": "Schnozzberry", + "content_types": [ + "dcim.device", + "dcim.rack", + "ipam.ipaddress", + "ipam.prefix", + "ipam.service", + "ipam.vlan", + "ipam.vrf", + "dcim.devicebay", + "dcim.inventoryitem", + "virtualization.virtualmachine", + "virtualization.cluster", + "virtualization.vminterface", + ], + }, + {"name": "Lookup", "content_types": ["dcim.device"]}, + {"name": "Nolookup", "content_types": ["dcim.device"]}, + {"name": "tagA", "content_types": ["dcim.device", "tenancy.tenant"]}, + {"name": "tagB", "content_types": ["dcim.device", "tenancy.tenant"]}, + {"name": "tagC", "content_types": ["dcim.device", "tenancy.tenant"]}, + {"name": "Updated", "content_types": ["dcim.device", "ipam.ipaddress"]}, ], ) # ORDER OF OPERATIONS FOR THE MOST PART # Create TENANT GROUPS -tenant_groups = [{"name": "Test Tenant Group", "slug": "test-tenant-group"}] +tenant_groups = [{"name": "Test Tenant Group"}] created_tenant_groups = make_nautobot_calls(nb.tenancy.tenant_groups, tenant_groups) -test_tenant_group = nb.tenancy.tenant_groups.get(slug="test-tenant-group") +test_tenant_group = nb.tenancy.tenant_groups.get(name="Test Tenant Group") # Create TENANTS -tenants = [{"name": "Test Tenant", "slug": "test-tenant", "group": test_tenant_group.id}] +tenants = [{"name": "Test Tenant", "tenant_group": test_tenant_group.id}] created_tenants = make_nautobot_calls(nb.tenancy.tenants, tenants) # Test Tenant to be used later on -test_tenant = nb.tenancy.tenants.get(slug="test-tenant") - - -# Create Regions -regions = [ - {"name": "Test Region", "slug": "test-region"}, - {"name": "Parent Region", "slug": "parent-region"}, - {"name": "Other Region", "slug": "other-region"}, +test_tenant = nb.tenancy.tenants.get(name="Test Tenant") + +# Create location types +location_content_types = [ + "dcim.device", + "dcim.rack", + "dcim.rackgroup", + "dcim.powerpanel", + "ipam.prefix", + "ipam.vlangroup", + "ipam.vlan", + "virtualization.cluster", + "circuits.circuittermination", ] -created_regions = make_nautobot_calls(nb.dcim.regions, regions) -# Region variables to be used later on -parent_region = nb.dcim.regions.get(slug="parent-region") -test_region = nb.dcim.regions.get(slug="test-region") +location_types = [{"name": "My Parent Location Type", "content_types": location_content_types, "nestable": True}] +created_location_types = make_nautobot_calls(nb.dcim.location_types, location_types) +parent_location_type = nb.dcim.location_types.get(name="My Parent Location Type") -# Create relationship between regions -test_region.parent = parent_region -test_region.save() +# Create child location types +child_location_types = [ + { + "name": "My Child Location Type", + "content_types": location_content_types, + "nestable": True, + "parent": parent_location_type.id, + } +] +created_child_location_types = make_nautobot_calls(nb.dcim.location_types, child_location_types) +child_location_type = nb.dcim.location_types.get(name="My Child Location Type") +# Create locations +parent_location_attrs = [ + {"name": "Parent Test Location", "location_type": parent_location_type.id, "tenant": test_tenant.id, "status": {"name": "Active"}}, +] +make_nautobot_calls(nb.dcim.locations, parent_location_attrs) -# Create SITES and register variables -sites = [ - {"name": "Test Site", "slug": "test-site", "tenant": test_tenant.id, "region": test_region.id, "status": "active"}, - {"name": "Test Site2", "slug": "test-site2", "status": "active"}, +# Location variables to be used later on +location_parent = nb.dcim.locations.get(name="Parent Test Location") +child_location_attrs = [ + {"name": "Child Test Location", "location_type": child_location_type.id, "parent": location_parent.id, "status": {"name": "Active"}}, ] -created_sites = make_nautobot_calls(nb.dcim.sites, sites) -# Site variables to be used later on -test_site = nb.dcim.sites.get(slug="test-site") -test_site2 = nb.dcim.sites.get(slug="test-site2") - -# Locations are only available in Nautobot 1.4+ -if nautobot_version >= version.parse("1.4"): - # Create location types - location_types = [{"name": "My Parent Location Type", "slug": "my-parent-location-type", "nestable": True}] - created_location_types = make_nautobot_calls(nb.dcim.location_types, location_types) - parent_location_type = nb.dcim.location_types.get(slug="my-parent-location-type") - - # Create child location types - child_location_types = [ - { - "name": "My Child Location Type", - "slug": "my-child-location-type", - "nestable": True, - "parent": parent_location_type.id, - } - ] - created_child_location_types = make_nautobot_calls(nb.dcim.location_types, child_location_types) +make_nautobot_calls(nb.dcim.locations, child_location_attrs) +location_child = nb.dcim.locations.get(name="Child Test Location") +child_child_location_attrs = [ + {"name": "Child-Child Test Location", "location_type": child_location_type.id, "parent": location_child.id, "status": {"name": "Active"}}, +] +make_nautobot_calls(nb.dcim.locations, child_child_location_attrs) +location_child_child = nb.dcim.locations.get(name="Child-Child Test Location") # Create power panel -power_panels = [{"name": "Test Power Panel", "site": test_site.id}] +power_panels = [{"name": "Test Power Panel", "location": location_parent.id}] created_power_panels = make_nautobot_calls(nb.dcim.power_panels, power_panels) # Create VRFs -vrfs = [{"name": "Test VRF", "rd": "1:1"}] +vrfs = [{"name": "Test VRF", "rd": "1:1", "namespace": {"name": "Global"}}] created_vrfs = make_nautobot_calls(nb.ipam.vrfs, vrfs) +# Create namespace +namespaces = [{"name": "Private"}] +created_namespaces = make_nautobot_calls(nb.ipam.namespaces, namespaces) # Create PREFIXES prefixes = [ - {"prefix": "192.168.100.0/24", "site": test_site2.id, "status": "active"}, - {"prefix": "10.10.0.0/16", "status": "active"}, + {"prefix": "192.168.0.0/16", "location": location_parent.id, "status": {"name": "Active"}, "namespace": {"name": "Global"}}, + {"prefix": "10.0.0.0/8", "status": {"name": "Active"}, "namespace": {"name": "Global"}}, + {"prefix": "10.10.0.0/16", "status": {"name": "Active"}, "namespace": {"name": "Global"}}, + {"prefix": "172.16.0.0/12", "status": {"name": "Active"}, "namespace": {"name": "Global"}}, + {"prefix": "172.16.0.0/12", "status": {"name": "Active"}, "namespace": {"name": "Private"}}, + {"prefix": "2001::1:0/64", "status": {"name": "Active"}, "namespace": {"name": "Global"}}, ] created_prefixes = make_nautobot_calls(nb.ipam.prefixes, prefixes) # Create VLAN GROUPS vlan_groups = [ - {"name": "Test Vlan Group", "slug": "test-vlan-group", "site": test_site.id, "tenant": test_tenant.id}, - {"name": "Test Vlan Group 2", "slug": "test-vlan-group-2", "site": test_site.id, "tenant": test_tenant.id}, + {"name": "Test Vlan Group", "location": location_child.id, "tenant": test_tenant.id}, + {"name": "Test Vlan Group 2", "location": location_child.id, "tenant": test_tenant.id}, ] created_vlan_groups = make_nautobot_calls(nb.ipam.vlan_groups, vlan_groups) # VLAN Group variables to be used later on -test_vlan_group = nb.ipam.vlan_groups.get(slug="test-vlan-group") +test_vlan_group = nb.ipam.vlan_groups.get(name="Test Vlan Group") # Create VLANS vlans = [ - {"name": "Wireless", "vid": 100, "site": test_site.id, "status": "active"}, - {"name": "Data", "vid": 200, "site": test_site.id, "status": "active"}, - {"name": "VoIP", "vid": 300, "site": test_site.id, "status": "active"}, + {"name": "Wireless", "vid": 100, "location": location_child.id, "status": {"name": "Active"}}, + {"name": "Data", "vid": 200, "location": location_child.id, "status": {"name": "Active"}}, + {"name": "VoIP", "vid": 300, "location": location_child.id, "status": {"name": "Active"}}, { "name": "Test VLAN", "vid": 400, - "site": test_site.id, + "location": location_child.id, "tenant": test_tenant.id, - "group": test_vlan_group.id, - "status": "active", + "vlan_group": test_vlan_group.id, + "status": {"name": "Active"}, }, ] created_vlans = make_nautobot_calls(nb.ipam.vlans, vlans) # Create IPAM Roles -ipam_roles = [{"name": "Network of care", "slug": "network-of-care"}] -create_ipam_roles = make_nautobot_calls(nb.ipam.roles, ipam_roles) +ipam_roles = [{"name": "Network of care", "content_types": ["ipam.prefix", "ipam.vlan"]}] +create_ipam_roles = make_nautobot_calls(nb.extras.roles, ipam_roles) # Create Manufacturers manufacturers = [ - {"name": "Cisco", "slug": "cisco"}, - {"name": "Arista", "slug": "arista"}, - {"name": "Test Manufactuer", "slug": "test-manufacturer"}, + {"name": "Cisco"}, + {"name": "Arista"}, + {"name": "Test Manufacturer"}, ] created_manufacturers = make_nautobot_calls(nb.dcim.manufacturers, manufacturers) # Manufacturer variables to be used later on -cisco_manu = nb.dcim.manufacturers.get(slug="cisco") -arista_manu = nb.dcim.manufacturers.get(slug="arista") +cisco_manu = nb.dcim.manufacturers.get(name="Cisco") +arista_manu = nb.dcim.manufacturers.get(name="Arista") # Create Device Types device_types = [ - {"model": "Cisco Test", "slug": "cisco-test", "manufacturer": cisco_manu.id}, - {"model": "Arista Test", "slug": "arista-test", "manufacturer": arista_manu.id}, + {"model": "Cisco Test", "manufacturer": cisco_manu.id}, + {"model": "Arista Test", "manufacturer": arista_manu.id}, { "model": "Nexus Parent", - "slug": "nexus-parent", "u_height": 0, "manufacturer": cisco_manu.id, "subdevice_role": "parent", }, { "model": "Nexus Child", - "slug": "nexus-child", "u_height": 0, "manufacturer": cisco_manu.id, "subdevice_role": "child", }, - {"model": "1841", "slug": "1841", "manufacturer": cisco_manu.id}, + {"model": "1841", "manufacturer": cisco_manu.id}, ] created_device_types = make_nautobot_calls(nb.dcim.device_types, device_types) # Device type variables to be used later on -cisco_test = nb.dcim.device_types.get(slug="cisco-test") -arista_test = nb.dcim.device_types.get(slug="arista-test") -nexus_parent = nb.dcim.device_types.get(slug="nexus-parent") -nexus_child = nb.dcim.device_types.get(slug="nexus-child") +cisco_test = nb.dcim.device_types.get(model="Cisco Test") +arista_test = nb.dcim.device_types.get(model="Arista Test") +nexus_parent = nb.dcim.device_types.get(model="Nexus Parent") +nexus_child = nb.dcim.device_types.get(model="Nexus Child") # Create Rear Port Template rear_port_templates = [{"name": "Test Rear Port Template", "device_type": cisco_test.id, "type": "bnc", "positions": 5}] @@ -212,41 +235,41 @@ def make_nautobot_calls(endpoint, payload): # Create Device Roles device_roles = [ - {"name": "Core Switch", "slug": "core-switch", "color": "aa1409", "vm_role": False}, - {"name": "Test VM Role", "slug": "test-vm-role", "color": "e91e63", "vm_role": True}, - {"name": "Test VM Role 1", "slug": "test-vm-role-1", "color": "e91e65", "vm_role": True}, + {"name": "Core Switch", "color": "aa1409", "vm_role": False, "content_types": ["dcim.device"]}, + {"name": "Test VM Role", "color": "e91e63", "vm_role": True, "content_types": ["virtualization.virtualmachine"]}, + {"name": "Test VM Role 1", "color": "e91e65", "vm_role": True, "content_types": ["dcim.device", "virtualization.virtualmachine"]}, ] -created_device_roles = make_nautobot_calls(nb.dcim.device_roles, device_roles) +created_device_roles = make_nautobot_calls(nb.extras.roles, device_roles) # Device role variables to be used later on -core_switch = nb.dcim.device_roles.get(slug="core-switch") +core_switch = nb.extras.roles.get(name="Core Switch") # Create Rack Groups rack_groups = [ - {"name": "Test Rack Group", "slug": "test-rack-group", "site": test_site.id}, - {"name": "Parent Rack Group", "slug": "parent-rack-group", "site": test_site.id}, + {"name": "Parent Rack Group", "location": location_child.id}, + {"name": "Child Rack Group", "location": location_child_child.id}, ] created_rack_groups = make_nautobot_calls(nb.dcim.rack_groups, rack_groups) -rack_group1 = nb.dcim.rack_groups.get(slug="test-rack-group") -rack_group2 = nb.dcim.rack_groups.get(slug="parent-rack-group") +rack_group_parent = nb.dcim.rack_groups.get(name="Parent Rack Group") +rack_group_child = nb.dcim.rack_groups.get(name="Child Rack Group") # Create Rack Group Parent relationship -rack_group1.parent = rack_group2.id -rack_group1.save() +rack_group_child.parent = rack_group_parent.id +rack_group_child.save() # Create Rack Roles -rack_roles = [{"name": "Test Rack Role", "slug": "test-rack-role", "color": "4287f5"}] -created_rack_roles = make_nautobot_calls(nb.dcim.rack_roles, rack_roles) -rack_role1 = nb.dcim.rack_roles.get(slug="test-rack-role") +rack_roles = [{"name": "Test Rack Role", "color": "4287f5", "content_types": ["dcim.rack"]}] +created_rack_roles = make_nautobot_calls(nb.extras.roles, rack_roles) +rack_role1 = nb.extras.roles.get(name="Test Rack Role") # Create Racks racks = [ - {"name": "Test Rack Site 2", "site": test_site2.id, "role": rack_role1.id, "status": "active"}, - {"name": "Test Rack", "site": test_site.id, "group": rack_group1.id, "status": "active"}, + {"name": "Sub Test Rack", "location": location_child_child.id, "rack_group": rack_group_child.id, "status": {"name": "Active"}}, + {"name": "Main Test Rack", "location": location_child.id, "rack_group": rack_group_parent.id, "role": rack_role1.id, "status": {"name": "Active"}}, ] created_racks = make_nautobot_calls(nb.dcim.racks, racks) -test_rack = nb.dcim.racks.get(name="Test Rack") # racks don't have slugs -test_rack_site2 = nb.dcim.racks.get(name="Test Rack Site 2") +main_test_rack = nb.dcim.racks.get(name="Main Test Rack") +sub_test_rack = nb.dcim.racks.get(name="Sub Test Rack") # Create Devices @@ -254,41 +277,41 @@ def make_nautobot_calls(endpoint, payload): { "name": "test100", "device_type": cisco_test.id, - "device_role": core_switch.id, - "site": test_site.id, + "role": core_switch.id, + "location": location_child.id, "tenant": test_tenant.id, - "local_context_data": {"ntp_servers": ["pool.ntp.org"]}, - "status": "active", + "local_config_context_data": {"ntp_servers": ["pool.ntp.org"]}, + "status": {"name": "Active"}, }, { "name": "TestDeviceR1", "device_type": cisco_test.id, - "device_role": core_switch.id, - "site": test_site.id, - "rack": test_rack.id, - "status": "active", + "role": core_switch.id, + "location": location_child_child.id, + "rack": sub_test_rack.id, + "status": {"name": "Active"}, }, { "name": "R1-Device", "device_type": cisco_test.id, - "device_role": core_switch.id, - "site": test_site2.id, - "rack": test_rack_site2.id, - "status": "active", + "role": core_switch.id, + "location": location_child.id, + "rack": main_test_rack.id, + "status": {"name": "Active"}, }, { "name": "Test Nexus One", "device_type": nexus_parent.id, - "device_role": core_switch.id, - "site": test_site.id, - "status": "active", + "role": core_switch.id, + "location": location_child.id, + "status": {"name": "Active"}, }, { "name": "Test Nexus Child One", "device_type": nexus_child.id, - "device_role": core_switch.id, - "site": test_site.id, - "status": "active", + "role": core_switch.id, + "location": location_child.id, + "status": {"name": "Active"}, }, ] created_devices = make_nautobot_calls(nb.dcim.devices, devices) @@ -319,15 +342,17 @@ def make_nautobot_calls(endpoint, payload): nexus_child.update({"virtual_chassis": vc.id, "vc_position": 2}) nexus.update({"vc_position": 0}) nexus_interfaces = [ - {"device": nexus.id, "name": "Ethernet1/1", "type": "1000base-t"}, - {"device": nexus_child.id, "name": "Ethernet2/1", "type": "1000base-t"}, + {"device": nexus.id, "name": "Ethernet1/1", "type": "1000base-t", "status": {"name": "Active"}}, + {"device": nexus_child.id, "name": "Ethernet2/1", "type": "1000base-t", "status": {"name": "Active"}}, ] created_nexus_interfaces = make_nautobot_calls(nb.dcim.interfaces, nexus_interfaces) # Create Interfaces dev_interfaces = [ - {"name": "GigabitEthernet1", "device": test100.id, "type": "1000base-t"}, - {"name": "GigabitEthernet2", "device": test100.id, "type": "1000base-t"}, + {"name": "GigabitEthernet1", "device": test100.id, "type": "1000base-t", "status": {"name": "Active"}}, + {"name": "GigabitEthernet2", "device": test100.id, "type": "1000base-t", "status": {"name": "Active"}}, + {"name": "GigabitEthernet3", "device": test100.id, "type": "1000base-t", "status": {"name": "Active"}}, + {"name": "GigabitEthernet4", "device": test100.id, "type": "1000base-t", "status": {"name": "Active"}}, ] created_interfaces = make_nautobot_calls(nb.dcim.interfaces, dev_interfaces) nexus_eth1 = nb.dcim.interfaces.get(device_id=nexus.id, name="Ethernet1/1") @@ -342,60 +367,81 @@ def make_nautobot_calls(endpoint, payload): ip_addresses = [ { "address": "172.16.180.1/24", - "assigned_object_type": "dcim.interface", - "assigned_object_id": test100_gi1.id, - "status": "active", + "namespace": {"name": "Global"}, + "status": {"name": "Active"}, }, { "address": "2001::1:1/64", - "assigned_object_type": "dcim.interface", - "assigned_object_id": test100_gi2.id, - "status": "active", + "namespace": {"name": "Global"}, + "status": {"name": "Active"}, }, { "address": "172.16.180.11/24", "dns_name": "nexus.example.com", - "assigned_object_type": "dcim.interface", - "assigned_object_id": nexus_eth1.id, - "status": "active", + "namespace": {"name": "Global"}, + "status": {"name": "Active"}, }, { "address": "172.16.180.12/24", - "assigned_object_type": "dcim.interface", - "assigned_object_id": nexus_child_eth1.id, + "namespace": {"name": "Global"}, "dns_name": "nexus.example.com", - "status": "active", + "status": {"name": "Active"}, }, - {"address": "172.16.180.254/24", "status": "active"}, + {"address": "172.16.180.254/24", "namespace": {"name": "Global"}, "status": {"name": "Active"}}, + {"address": "10.100.0.1/32", "namespace": {"name": "Global"}, "status": {"name": "Active"}}, + {"address": "10.100.10.1/32", "namespace": {"name": "Global"}, "status": {"name": "Active"}}, ] created_ip_addresses = make_nautobot_calls(nb.ipam.ip_addresses, ip_addresses) -# Grab first two IPs -ip1 = nb.ipam.ip_addresses.get(address="172.16.180.1/24", interface_id=test100_gi1.id) -ip2 = nb.ipam.ip_addresses.get(address="2001::1:1/64", interface_id=test100_gi2.id) +# Grab IPs +ip1 = nb.ipam.ip_addresses.get(address="172.16.180.1/24") +ip2 = nb.ipam.ip_addresses.get(address="2001::1:1/64") +ip3 = nb.ipam.ip_addresses.get(address="172.16.180.11/24") +ip4 = nb.ipam.ip_addresses.get(address="172.16.180.12/24") + +# Assign IP to interfaces +ip_to_intf = [ + { + "ip_address": ip1.id, + "interface": test100_gi1.id, + }, + { + "ip_address": ip2.id, + "interface": test100_gi2.id, + }, + { + "ip_address": ip3.id, + "interface": nexus_eth1.id, + }, + { + "ip_address": ip4.id, + "interface": nexus_child_eth1.id, + }, +] +created_ip_to_intf = make_nautobot_calls(nb.ipam.ip_address_to_interface, ip_to_intf) # Assign Primary IP -nexus_eth1_ip = nb.ipam.ip_addresses.get(address="172.16.180.11/24", interface_id=nexus_eth1.id) +nexus_eth1_ip = nb.ipam.ip_addresses.get(address="172.16.180.11/24", interfaces=[nexus_eth1.id]) nexus.update({"primary_ip4": nexus_eth1_ip}) # Create RIRs -rirs = [{"name": "Example RIR", "slug": "example-rir"}] +rirs = [{"name": "Example RIR"}] created_rirs = make_nautobot_calls(nb.ipam.rirs, rirs) # Create Cluster Group -cluster_groups = [{"name": "Test Cluster Group", "slug": "test-cluster-group"}] +cluster_groups = [{"name": "Test Cluster Group"}] created_cluster_groups = make_nautobot_calls(nb.virtualization.cluster_groups, cluster_groups) -test_cluster_group = nb.virtualization.cluster_groups.get(slug="test-cluster-group") +test_cluster_group = nb.virtualization.cluster_groups.get(name="Test Cluster Group") # Create Cluster Type -cluster_types = [{"name": "Test Cluster Type", "slug": "test-cluster-type"}] +cluster_types = [{"name": "Test Cluster Type"}] created_cluster_types = make_nautobot_calls(nb.virtualization.cluster_types, cluster_types) -test_cluster_type = nb.virtualization.cluster_types.get(slug="test-cluster-type") +test_cluster_type = nb.virtualization.cluster_types.get(name="Test Cluster Type") # Create Cluster clusters = [ - {"name": "Test Cluster", "type": test_cluster_type.id, "group": test_cluster_group.id, "site": test_site.id}, - {"name": "Test Cluster 2", "type": test_cluster_type.id}, + {"name": "Test Cluster", "cluster_type": test_cluster_type.id, "cluster_group": test_cluster_group.id, "location": location_child.id}, + {"name": "Test Cluster 2", "cluster_type": test_cluster_type.id}, ] created_clusters = make_nautobot_calls(nb.virtualization.clusters, clusters) test_cluster = nb.virtualization.clusters.get(name="Test Cluster") @@ -403,12 +449,12 @@ def make_nautobot_calls(endpoint, payload): # Create Virtual Machine virtual_machines = [ - {"name": "test100-vm", "cluster": test_cluster.id, "status": "active"}, - {"name": "test101-vm", "cluster": test_cluster.id, "status": "active"}, - {"name": "test102-vm", "cluster": test_cluster.id, "status": "active"}, - {"name": "test103-vm", "cluster": test_cluster.id, "status": "active"}, - {"name": "test104-vm", "cluster": test_cluster2.id, "status": "active"}, - {"name": "Test VM With Spaces", "cluster": test_cluster2.id, "status": "active"}, + {"name": "test100-vm", "cluster": test_cluster.id, "status": {"name": "Active"}}, + {"name": "test101-vm", "cluster": test_cluster.id, "status": {"name": "Active"}}, + {"name": "test102-vm", "cluster": test_cluster.id, "status": {"name": "Active"}}, + {"name": "test103-vm", "cluster": test_cluster.id, "status": {"name": "Active"}}, + {"name": "test104-vm", "cluster": test_cluster2.id, "status": {"name": "Active"}}, + {"name": "Test VM With Spaces", "cluster": test_cluster2.id, "status": {"name": "Active"}}, ] created_virtual_machines = make_nautobot_calls(nb.virtualization.virtual_machines, virtual_machines) test100_vm = nb.virtualization.virtual_machines.get(name="test100-vm") @@ -418,20 +464,20 @@ def make_nautobot_calls(endpoint, payload): # Create Virtual Machine Interfaces virtual_machines_intfs = [ # Create test100-vm intfs - {"name": "Eth0", "virtual_machine": test100_vm.id}, - {"name": "Eth1", "virtual_machine": test100_vm.id}, - {"name": "Eth2", "virtual_machine": test100_vm.id}, - {"name": "Eth3", "virtual_machine": test100_vm.id}, - {"name": "Eth4", "virtual_machine": test100_vm.id}, + {"name": "Eth0", "virtual_machine": test100_vm.id, "status": {"name": "Active"}}, + {"name": "Eth1", "virtual_machine": test100_vm.id, "status": {"name": "Active"}}, + {"name": "Eth2", "virtual_machine": test100_vm.id, "status": {"name": "Active"}}, + {"name": "Eth3", "virtual_machine": test100_vm.id, "status": {"name": "Active"}}, + {"name": "Eth4", "virtual_machine": test100_vm.id, "status": {"name": "Active"}}, # Create test101-vm intfs - {"name": "Eth0", "virtual_machine": test101_vm.id}, - {"name": "Eth1", "virtual_machine": test101_vm.id}, - {"name": "Eth2", "virtual_machine": test101_vm.id}, - {"name": "Eth3", "virtual_machine": test101_vm.id}, - {"name": "Eth4", "virtual_machine": test101_vm.id}, + {"name": "Eth0", "virtual_machine": test101_vm.id, "status": {"name": "Active"}}, + {"name": "Eth1", "virtual_machine": test101_vm.id, "status": {"name": "Active"}}, + {"name": "Eth2", "virtual_machine": test101_vm.id, "status": {"name": "Active"}}, + {"name": "Eth3", "virtual_machine": test101_vm.id, "status": {"name": "Active"}}, + {"name": "Eth4", "virtual_machine": test101_vm.id, "status": {"name": "Active"}}, # Create Test VM With Spaces intfs - {"name": "Eth0", "virtual_machine": test_spaces_vm.id}, - {"name": "Eth1", "virtual_machine": test_spaces_vm.id}, + {"name": "Eth0", "virtual_machine": test_spaces_vm.id, "status": {"name": "Active"}}, + {"name": "Eth1", "virtual_machine": test_spaces_vm.id, "status": {"name": "Active"}}, ] created_virtual_machines_intfs = make_nautobot_calls(nb.virtualization.interfaces, virtual_machines_intfs) @@ -439,7 +485,7 @@ def make_nautobot_calls(endpoint, payload): # Create Services services = [ {"device": test100.id, "name": "ssh", "ports": [22], "protocol": "tcp"}, - {"device": test100.id, "name": "http", "ports": [80], "protocol": "tcp", "ipaddresses": [ip1.id, ip2.id]}, + {"device": test100.id, "name": "http", "ports": [80], "protocol": "tcp", "ip_addresses": [ip1.id, ip2.id]}, {"device": nexus.id, "name": "telnet", "ports": [23], "protocol": "tcp"}, {"virtual_machine": test_spaces_vm.id, "name": "ssh", "ports": [22], "protocol": "tcp"}, ] @@ -448,29 +494,29 @@ def make_nautobot_calls(endpoint, payload): # Create Circuit Provider -providers = [{"name": "Test Provider", "slug": "test-provider"}] +providers = [{"name": "Test Provider"}] created_providers = make_nautobot_calls(nb.circuits.providers, providers) -test_provider = nb.circuits.providers.get(slug="test-provider") +test_provider = nb.circuits.providers.get(name="Test Provider") # Create Provider Networks provider_networks = [{"name": "Test Provider Network", "provider": test_provider.id}] created_provider_networks = make_nautobot_calls(nb.circuits.provider_networks, provider_networks) # Create Circuit Type -circuit_types = [{"name": "Test Circuit Type", "slug": "test-circuit-type"}] +circuit_types = [{"name": "Test Circuit Type"}] created_circuit_types = make_nautobot_calls(nb.circuits.circuit_types, circuit_types) -test_circuit_type = nb.circuits.circuit_types.get(slug="test-circuit-type") +test_circuit_type = nb.circuits.circuit_types.get(name="Test Circuit Type") # Create Circuit circuits = [ - {"cid": "Test Circuit", "provider": test_provider.id, "type": test_circuit_type.id, "status": "active"}, - {"cid": "Test Circuit Two", "provider": test_provider.id, "type": test_circuit_type.id, "status": "active"}, + {"cid": "Test Circuit", "provider": test_provider.id, "circuit_type": test_circuit_type.id, "status": {"name": "Active"}}, + {"cid": "Test Circuit Two", "provider": test_provider.id, "circuit_type": test_circuit_type.id, "status": {"name": "Active"}}, ] created_circuits = make_nautobot_calls(nb.circuits.circuits, circuits) test_circuit_two = nb.circuits.circuits.get(cid="Test Circuit Two") # Create Circuit Termination -circuit_terms = [{"circuit": test_circuit_two.id, "term_side": "A", "port_speed": 10000, "site": test_site.id}] +circuit_terms = [{"circuit": test_circuit_two.id, "term_side": "A", "port_speed": 10000, "location": location_parent.id}] created_circuit_terms = make_nautobot_calls(nb.circuits.circuit_terminations, circuit_terms) route_targets = [ @@ -483,8 +529,8 @@ def make_nautobot_calls(endpoint, payload): # Create Relationship relationships = [ { - "name": "VLAN to Device", - "slug": "vlan-to-device", + "label": "VLAN to Device", + "key": "vlan_to_device", "type": "one-to-one", "source_type": "ipam.vlan", "destination_type": "dcim.device", diff --git a/tests/integration/targets/inventory-1.4/.gitignore b/tests/integration/targets/inventory-1.4/.gitignore deleted file mode 100644 index df76504d..00000000 --- a/tests/integration/targets/inventory-1.4/.gitignore +++ /dev/null @@ -1 +0,0 @@ -runme_config \ No newline at end of file diff --git a/tests/integration/targets/inventory-1.4/aliases b/tests/integration/targets/inventory-1.4/aliases deleted file mode 100644 index a3a2089b..00000000 --- a/tests/integration/targets/inventory-1.4/aliases +++ /dev/null @@ -1 +0,0 @@ -# https://docs.ansible.com/ansible/devel/dev_guide/testing/sanity/integration-aliases.html diff --git a/tests/integration/targets/inventory-1.4/compare_inventory_json.py b/tests/integration/targets/inventory-1.4/compare_inventory_json.py deleted file mode 100755 index 6cd9f4f2..00000000 --- a/tests/integration/targets/inventory-1.4/compare_inventory_json.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env python - -# Inspired by community.aws collection script_inventory_ec2 test -# https://github.com/ansible-collections/community.aws/blob/master/tests/integration/targets/script_inventory_ec2/inventory_diff.py - -from __future__ import absolute_import, division, print_function - -__metaclass__ = type - -import sys -import json -import argparse -from jsondiff import diff -from operator import itemgetter - -# Nautobot includes "created" and "last_updated" times on objects. These end up in the interfaces objects that are included verbatim from the Nautobot API. -# "url" may be different if local tests use a different host/port -# Remove these from files saved in git as test data -KEYS_REMOVE = frozenset(["created", "id", "last_updated", "rack_id", "url", "notes_url"]) - -# Ignore these when performing diffs as they will be different for each test run -KEYS_IGNORE = frozenset() - - -def all_keys_to_ignore(): - keys = KEYS_REMOVE.union(KEYS_IGNORE) - - return keys - - -# Assume the object will not be recursive, as it originally came from JSON -def remove_keys(obj, keys): - - if isinstance(obj, dict): - keys_to_remove = keys.intersection(obj.keys()) - for key in keys_to_remove: - del obj[key] - - for (key, value) in obj.items(): - remove_keys(value, keys) - - elif isinstance(obj, list): - # Iterate over temporary copy, as we may remove items - for item in obj[:]: - if isinstance(item, str) and item in keys: - # List contains a string that we want to remove - # eg. a group name in list of groups - obj.remove(item) - remove_keys(item, keys) - - -def sort_hostvar_arrays(obj): - meta = obj.get("_meta") - if not meta: - return - - hostvars = meta.get("hostvars") - if not hostvars: - return - - for hostname, host in hostvars.items(): - interfaces = host.get("interfaces") - if interfaces: - host["interfaces"] = sorted(interfaces, key=itemgetter("name")) - - services = host.get("services") - if services: - host["services"] = sorted(services, key=itemgetter("name")) - - -def read_json(filename): - with open(filename, "r") as f: - return json.loads(f.read()) - - -def write_json(filename, data): - with open(filename, "w") as f: - json.dump(data, f, indent=4) - - -def main(): - parser = argparse.ArgumentParser(description="Diff Ansible inventory JSON output") - parser.add_argument( - "filename_a", - metavar="ORIGINAL.json", - type=str, - help="Original json to test against", - ) - parser.add_argument( - "filename_b", - metavar="NEW.json", - type=str, - help="Newly generated json to compare against original", - ) - parser.add_argument( - "--write", - action="store_true", - help=( - "When comparing files, various keys are removed. " - "This option will not compare the files, and instead writes ORIGINAL.json to NEW.json after removing these keys. " - "This is used to clean the test json files before saving to the git repo. " - "For example, this removes dates. " - ), - ) - parser.add_argument( - "--nautobot-version", - metavar="VERSION", - type=str, - help=( - "Apply comparison specific to Nautobot version. " - "For example, rack_groups arrays will only contain a single item in v2.7, so are ignored in the comparison." - ), - ) - - args = parser.parse_args() - - data_a = read_json(args.filename_a) - - if args.write: - # When writing test data, only remove "remove_keys" that will change on every git commit. - # This makes diffs more easily readable to ensure changes to test data look correct. - remove_keys(data_a, KEYS_REMOVE) - sort_hostvar_arrays(data_a) - write_json(args.filename_b, data_a) - - else: - data_b = read_json(args.filename_b) - - # Ignore keys that we don't want to diff, in addition to the ones removed that change on every commit - keys = all_keys_to_ignore() - remove_keys(data_a, keys) - remove_keys(data_b, keys) - - sort_hostvar_arrays(data_a) - sort_hostvar_arrays(data_b) - - # Perform the diff - # syntax='symmetric' will produce output that prints both the before and after as "$insert" and "$delete" - # marshal=True removes any special types, allowing to be dumped as json - result = diff(data_a, data_b, marshal=True, syntax="symmetric") - - if result: - # Dictionary is not empty - print differences - print(json.dumps(result, sort_keys=True, indent=4)) - sys.exit(1) - else: - # Success, no differences - sys.exit(0) - - -if __name__ == "__main__": - main() diff --git a/tests/integration/targets/inventory-1.4/files/test-inventory.json b/tests/integration/targets/inventory-1.4/files/test-inventory.json deleted file mode 100644 index ba7a7884..00000000 --- a/tests/integration/targets/inventory-1.4/files/test-inventory.json +++ /dev/null @@ -1,1093 +0,0 @@ -{ - "_meta": { - "hostvars": { - "R1-Device": { - "config_context": {}, - "custom_fields": {}, - "device_type": "cisco-test", - "interfaces": [], - "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack Site 2", - "rack_groups": [], - "rack_role": "test-rack-role", - "regions": [], - "role": "core-switch", - "services": [], - "site": "test-site2", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "Test Nexus One": { - "ansible_host": "172.16.180.11", - "config_context": {}, - "custom_fields": {}, - "device_type": "nexus-parent", - "dns_name": "nexus.example.com", - "interfaces": [ - { - "bridge": null, - "cable": null, - "cable_peer": null, - "cable_peer_type": null, - "connected_endpoint": null, - "connected_endpoint_reachable": null, - "connected_endpoint_type": null, - "count_ipaddresses": 1, - "custom_fields": {}, - "description": "", - "device": { - "display": "Test Nexus Child One", - "id": "826c7412-355a-428a-aa0c-5f8de7e52278", - "name": "Test Nexus Child One", - "url": "http://nautobot:8000/api/dcim/devices/826c7412-355a-428a-aa0c-5f8de7e52278/" - }, - "display": "Ethernet2/1", - "enabled": true, - "id": "fd6c659e-ef94-46f1-8abd-cbf37dba2489", - "ip_addresses": [ - { - "address": "172.16.180.12/24", - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "display": "172.16.180.12/24", - "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, - "id": "189c61fc-a377-42e9-9741-624937e47831", - "last_updated": "2022-08-28T23:33:11.884357Z", - "nat_inside": null, - "nat_outside": null, - "notes_url": "http://nautobot:8000/api/ipam/ip-addresses/189c61fc-a377-42e9-9741-624937e47831/notes/", - "role": null, - "status": { - "label": "Active", - "value": "active" - }, - "tags": [], - "tenant": null, - "url": "http://nautobot:8000/api/ipam/ip-addresses/189c61fc-a377-42e9-9741-624937e47831/", - "vrf": null - } - ], - "label": "", - "lag": null, - "mac_address": null, - "mgmt_only": false, - "mode": null, - "mtu": null, - "name": "Ethernet2/1", - "notes_url": "http://nautobot:8000/api/dcim/interfaces/fd6c659e-ef94-46f1-8abd-cbf37dba2489/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "type": { - "label": "1000BASE-T (1GE)", - "value": "1000base-t" - }, - "untagged_vlan": null, - "url": "http://nautobot:8000/api/dcim/interfaces/fd6c659e-ef94-46f1-8abd-cbf37dba2489/" - }, - { - "bridge": null, - "cable": null, - "cable_peer": null, - "cable_peer_type": null, - "connected_endpoint": null, - "connected_endpoint_reachable": null, - "connected_endpoint_type": null, - "count_ipaddresses": 1, - "custom_fields": {}, - "description": "", - "device": { - "display": "Test Nexus One", - "id": "c24cb495-e40c-4d37-94e5-4d8295e57a5d", - "name": "Test Nexus One", - "url": "http://nautobot:8000/api/dcim/devices/c24cb495-e40c-4d37-94e5-4d8295e57a5d/" - }, - "display": "Ethernet1/1", - "enabled": true, - "id": "cd26d821-d853-42e9-a7ff-5673685dd8ca", - "ip_addresses": [ - { - "address": "172.16.180.11/24", - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "display": "172.16.180.11/24", - "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, - "id": "e5c6bb9b-3def-4ec4-ab17-24e37a171474", - "last_updated": "2022-08-28T23:33:11.855930Z", - "nat_inside": null, - "nat_outside": null, - "notes_url": "http://nautobot:8000/api/ipam/ip-addresses/e5c6bb9b-3def-4ec4-ab17-24e37a171474/notes/", - "role": null, - "status": { - "label": "Active", - "value": "active" - }, - "tags": [], - "tenant": null, - "url": "http://nautobot:8000/api/ipam/ip-addresses/e5c6bb9b-3def-4ec4-ab17-24e37a171474/", - "vrf": null - } - ], - "label": "", - "lag": null, - "mac_address": null, - "mgmt_only": false, - "mode": null, - "mtu": null, - "name": "Ethernet1/1", - "notes_url": "http://nautobot:8000/api/dcim/interfaces/cd26d821-d853-42e9-a7ff-5673685dd8ca/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "type": { - "label": "1000BASE-T (1GE)", - "value": "1000base-t" - }, - "untagged_vlan": null, - "url": "http://nautobot:8000/api/dcim/interfaces/cd26d821-d853-42e9-a7ff-5673685dd8ca/" - } - ], - "is_virtual": false, - "manufacturer": "cisco", - "primary_ip4": "172.16.180.11", - "regions": [ - "test-region", - "parent-region" - ], - "role": "core-switch", - "services": [ - { - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "device": { - "display": "Test Nexus One", - "id": "c24cb495-e40c-4d37-94e5-4d8295e57a5d", - "name": "Test Nexus One", - "url": "http://nautobot:8000/api/dcim/devices/c24cb495-e40c-4d37-94e5-4d8295e57a5d/" - }, - "display": "telnet (TCP/23)", - "id": "48bde449-b83e-4ba6-873d-7ad148244c65", - "ipaddresses": [], - "last_updated": "2022-08-28T23:33:24.456719Z", - "name": "telnet", - "notes_url": "http://nautobot:8000/api/ipam/services/48bde449-b83e-4ba6-873d-7ad148244c65/notes/", - "ports": [ - 23 - ], - "protocol": { - "label": "TCP", - "value": "tcp" - }, - "tags": [], - "url": "http://nautobot:8000/api/ipam/services/48bde449-b83e-4ba6-873d-7ad148244c65/", - "virtual_machine": null - } - ], - "site": "test-site", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "Test VM With Spaces": { - "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", - "config_context": {}, - "custom_fields": {}, - "interfaces": [ - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth0", - "enabled": true, - "id": "0267a81f-5d99-46bc-a185-18b5eb844af7", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth0", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/0267a81f-5d99-46bc-a185-18b5eb844af7/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/0267a81f-5d99-46bc-a185-18b5eb844af7/", - "virtual_machine": { - "display": "Test VM With Spaces", - "id": "f27d1706-c951-41b8-bcdb-d14ebba937a8", - "name": "Test VM With Spaces", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/f27d1706-c951-41b8-bcdb-d14ebba937a8/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth1", - "enabled": true, - "id": "68c14c1b-f74e-485c-9efb-fd84424ca49b", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth1", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/68c14c1b-f74e-485c-9efb-fd84424ca49b/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/68c14c1b-f74e-485c-9efb-fd84424ca49b/", - "virtual_machine": { - "display": "Test VM With Spaces", - "id": "f27d1706-c951-41b8-bcdb-d14ebba937a8", - "name": "Test VM With Spaces", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/f27d1706-c951-41b8-bcdb-d14ebba937a8/" - } - } - ], - "is_virtual": true, - "regions": [], - "services": [ - { - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "device": null, - "display": "ssh (TCP/22)", - "id": "50c766b7-5b72-464f-afbc-559578da01b2", - "ipaddresses": [], - "last_updated": "2022-08-28T23:33:24.486357Z", - "name": "ssh", - "notes_url": "http://nautobot:8000/api/ipam/services/50c766b7-5b72-464f-afbc-559578da01b2/notes/", - "ports": [ - 22 - ], - "protocol": { - "label": "TCP", - "value": "tcp" - }, - "tags": [], - "url": "http://nautobot:8000/api/ipam/services/50c766b7-5b72-464f-afbc-559578da01b2/", - "virtual_machine": { - "display": "Test VM With Spaces", - "id": "f27d1706-c951-41b8-bcdb-d14ebba937a8", - "name": "Test VM With Spaces", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/f27d1706-c951-41b8-bcdb-d14ebba937a8/" - } - } - ], - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "TestDeviceR1": { - "config_context": {}, - "custom_fields": {}, - "device_type": "cisco-test", - "interfaces": [], - "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack", - "rack_groups": [ - "test-rack-group", - "parent-rack-group" - ], - "regions": [ - "test-region", - "parent-region" - ], - "role": "core-switch", - "services": [], - "site": "test-site", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "test100": { - "config_context": { - "ntp_servers": [ - "pool.ntp.org" - ] - }, - "custom_fields": {}, - "device_type": "cisco-test", - "interfaces": [ - { - "bridge": null, - "cable": null, - "cable_peer": null, - "cable_peer_type": null, - "connected_endpoint": null, - "connected_endpoint_reachable": null, - "connected_endpoint_type": null, - "count_ipaddresses": 1, - "custom_fields": {}, - "description": "", - "device": { - "display": "test100", - "id": "b4c68cb5-55aa-4227-98c5-ca6b25131f08", - "name": "test100", - "url": "http://nautobot:8000/api/dcim/devices/b4c68cb5-55aa-4227-98c5-ca6b25131f08/" - }, - "display": "GigabitEthernet1", - "enabled": true, - "id": "544a82b1-9eb9-4c01-aea1-f4688add868a", - "ip_addresses": [ - { - "address": "172.16.180.1/24", - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "display": "172.16.180.1/24", - "dns_name": "", - "family": { - "label": "IPv4", - "value": 4 - }, - "id": "dc329d10-8339-4364-acb3-e915fe3cca64", - "last_updated": "2022-08-28T23:33:11.795106Z", - "nat_inside": null, - "nat_outside": null, - "notes_url": "http://nautobot:8000/api/ipam/ip-addresses/dc329d10-8339-4364-acb3-e915fe3cca64/notes/", - "role": null, - "status": { - "label": "Active", - "value": "active" - }, - "tags": [], - "tenant": null, - "url": "http://nautobot:8000/api/ipam/ip-addresses/dc329d10-8339-4364-acb3-e915fe3cca64/", - "vrf": null - } - ], - "label": "", - "lag": null, - "mac_address": null, - "mgmt_only": false, - "mode": null, - "mtu": null, - "name": "GigabitEthernet1", - "notes_url": "http://nautobot:8000/api/dcim/interfaces/544a82b1-9eb9-4c01-aea1-f4688add868a/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "type": { - "label": "1000BASE-T (1GE)", - "value": "1000base-t" - }, - "untagged_vlan": null, - "url": "http://nautobot:8000/api/dcim/interfaces/544a82b1-9eb9-4c01-aea1-f4688add868a/" - }, - { - "bridge": null, - "cable": null, - "cable_peer": null, - "cable_peer_type": null, - "connected_endpoint": null, - "connected_endpoint_reachable": null, - "connected_endpoint_type": null, - "count_ipaddresses": 1, - "custom_fields": {}, - "description": "", - "device": { - "display": "test100", - "id": "b4c68cb5-55aa-4227-98c5-ca6b25131f08", - "name": "test100", - "url": "http://nautobot:8000/api/dcim/devices/b4c68cb5-55aa-4227-98c5-ca6b25131f08/" - }, - "display": "GigabitEthernet2", - "enabled": true, - "id": "6c10dbed-bf8a-4a57-982f-c599b4282d17", - "ip_addresses": [ - { - "address": "2001::1:1/64", - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "display": "2001::1:1/64", - "dns_name": "", - "family": { - "label": "IPv6", - "value": 6 - }, - "id": "237072d8-c4c6-480d-9ec1-7afd4078953b", - "last_updated": "2022-08-28T23:33:11.826990Z", - "nat_inside": null, - "nat_outside": null, - "notes_url": "http://nautobot:8000/api/ipam/ip-addresses/237072d8-c4c6-480d-9ec1-7afd4078953b/notes/", - "role": null, - "status": { - "label": "Active", - "value": "active" - }, - "tags": [], - "tenant": null, - "url": "http://nautobot:8000/api/ipam/ip-addresses/237072d8-c4c6-480d-9ec1-7afd4078953b/", - "vrf": null - } - ], - "label": "", - "lag": null, - "mac_address": null, - "mgmt_only": false, - "mode": null, - "mtu": null, - "name": "GigabitEthernet2", - "notes_url": "http://nautobot:8000/api/dcim/interfaces/6c10dbed-bf8a-4a57-982f-c599b4282d17/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "type": { - "label": "1000BASE-T (1GE)", - "value": "1000base-t" - }, - "untagged_vlan": null, - "url": "http://nautobot:8000/api/dcim/interfaces/6c10dbed-bf8a-4a57-982f-c599b4282d17/" - } - ], - "is_virtual": false, - "local_context_data": { - "ntp_servers": [ - "pool.ntp.org" - ] - }, - "manufacturer": "cisco", - "regions": [ - "test-region", - "parent-region" - ], - "role": "core-switch", - "services": [ - { - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "device": { - "display": "test100", - "id": "b4c68cb5-55aa-4227-98c5-ca6b25131f08", - "name": "test100", - "url": "http://nautobot:8000/api/dcim/devices/b4c68cb5-55aa-4227-98c5-ca6b25131f08/" - }, - "display": "ssh (TCP/22)", - "id": "9e15c6e8-5d6f-4e8b-a0c7-648b8a4f59e5", - "ipaddresses": [], - "last_updated": "2022-08-28T23:33:24.351724Z", - "name": "ssh", - "notes_url": "http://nautobot:8000/api/ipam/services/9e15c6e8-5d6f-4e8b-a0c7-648b8a4f59e5/notes/", - "ports": [ - 22 - ], - "protocol": { - "label": "TCP", - "value": "tcp" - }, - "tags": [], - "url": "http://nautobot:8000/api/ipam/services/9e15c6e8-5d6f-4e8b-a0c7-648b8a4f59e5/", - "virtual_machine": null - }, - { - "created": "2022-08-28", - "custom_fields": {}, - "description": "", - "device": { - "display": "test100", - "id": "b4c68cb5-55aa-4227-98c5-ca6b25131f08", - "name": "test100", - "url": "http://nautobot:8000/api/dcim/devices/b4c68cb5-55aa-4227-98c5-ca6b25131f08/" - }, - "display": "http (TCP/80)", - "id": "77753d00-67f6-45a9-b925-0670a77e588e", - "ipaddresses": [ - { - "address": "2001::1:1/64", - "display": "2001::1:1/64", - "family": 6, - "id": "237072d8-c4c6-480d-9ec1-7afd4078953b", - "url": "http://nautobot:8000/api/ipam/ip-addresses/237072d8-c4c6-480d-9ec1-7afd4078953b/" - }, - { - "address": "172.16.180.1/24", - "display": "172.16.180.1/24", - "family": 4, - "id": "dc329d10-8339-4364-acb3-e915fe3cca64", - "url": "http://nautobot:8000/api/ipam/ip-addresses/dc329d10-8339-4364-acb3-e915fe3cca64/" - } - ], - "last_updated": "2022-08-28T23:33:24.387974Z", - "name": "http", - "notes_url": "http://nautobot:8000/api/ipam/services/77753d00-67f6-45a9-b925-0670a77e588e/notes/", - "ports": [ - 80 - ], - "protocol": { - "label": "TCP", - "value": "tcp" - }, - "tags": [], - "url": "http://nautobot:8000/api/ipam/services/77753d00-67f6-45a9-b925-0670a77e588e/", - "virtual_machine": null - } - ], - "site": "test-site", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [], - "tenant": "test-tenant", - "tenant_group": "test-tenant-group" - }, - "test100-vm": { - "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", - "config_context": {}, - "custom_fields": {}, - "interfaces": [ - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth0", - "enabled": true, - "id": "d4599190-22b6-4a45-b4fe-8b5d8aa703e4", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth0", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/d4599190-22b6-4a45-b4fe-8b5d8aa703e4/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/d4599190-22b6-4a45-b4fe-8b5d8aa703e4/", - "virtual_machine": { - "display": "test100-vm", - "id": "e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93", - "name": "test100-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth1", - "enabled": true, - "id": "63f64464-d41d-4096-acab-5ff6836d8835", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth1", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/63f64464-d41d-4096-acab-5ff6836d8835/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/63f64464-d41d-4096-acab-5ff6836d8835/", - "virtual_machine": { - "display": "test100-vm", - "id": "e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93", - "name": "test100-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth2", - "enabled": true, - "id": "3b7b8f11-e385-43db-8623-0f0cc0074915", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth2", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/3b7b8f11-e385-43db-8623-0f0cc0074915/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/3b7b8f11-e385-43db-8623-0f0cc0074915/", - "virtual_machine": { - "display": "test100-vm", - "id": "e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93", - "name": "test100-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth3", - "enabled": true, - "id": "748b1ca3-c44d-4a06-8ca9-ebb9cc381991", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth3", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/748b1ca3-c44d-4a06-8ca9-ebb9cc381991/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/748b1ca3-c44d-4a06-8ca9-ebb9cc381991/", - "virtual_machine": { - "display": "test100-vm", - "id": "e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93", - "name": "test100-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth4", - "enabled": true, - "id": "98448048-9bff-4743-a906-5c9ea00f35da", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth4", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/98448048-9bff-4743-a906-5c9ea00f35da/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/98448048-9bff-4743-a906-5c9ea00f35da/", - "virtual_machine": { - "display": "test100-vm", - "id": "e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93", - "name": "test100-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/e8c5ca06-b80f-4ef4-b3c1-24f28a74ad93/" - } - } - ], - "is_virtual": true, - "regions": [ - "test-region", - "parent-region" - ], - "services": [], - "site": "test-site", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "test101-vm": { - "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", - "config_context": {}, - "custom_fields": {}, - "interfaces": [ - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth0", - "enabled": true, - "id": "8fe7f17c-ab17-423b-a754-f1c152cd2224", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth0", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/8fe7f17c-ab17-423b-a754-f1c152cd2224/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/8fe7f17c-ab17-423b-a754-f1c152cd2224/", - "virtual_machine": { - "display": "test101-vm", - "id": "13d6b3d1-9a9c-448b-b4dd-7aa22459da3b", - "name": "test101-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/13d6b3d1-9a9c-448b-b4dd-7aa22459da3b/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth1", - "enabled": true, - "id": "62daab82-fafb-4391-8ca1-87ebf484d9cc", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth1", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/62daab82-fafb-4391-8ca1-87ebf484d9cc/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/62daab82-fafb-4391-8ca1-87ebf484d9cc/", - "virtual_machine": { - "display": "test101-vm", - "id": "13d6b3d1-9a9c-448b-b4dd-7aa22459da3b", - "name": "test101-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/13d6b3d1-9a9c-448b-b4dd-7aa22459da3b/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth2", - "enabled": true, - "id": "b33b7a3c-8789-436a-8306-4412da75fe33", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth2", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/b33b7a3c-8789-436a-8306-4412da75fe33/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/b33b7a3c-8789-436a-8306-4412da75fe33/", - "virtual_machine": { - "display": "test101-vm", - "id": "13d6b3d1-9a9c-448b-b4dd-7aa22459da3b", - "name": "test101-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/13d6b3d1-9a9c-448b-b4dd-7aa22459da3b/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth3", - "enabled": true, - "id": "5f4bc783-bfa1-4d4c-aa3b-b50f0d411dcc", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth3", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/5f4bc783-bfa1-4d4c-aa3b-b50f0d411dcc/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/5f4bc783-bfa1-4d4c-aa3b-b50f0d411dcc/", - "virtual_machine": { - "display": "test101-vm", - "id": "13d6b3d1-9a9c-448b-b4dd-7aa22459da3b", - "name": "test101-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/13d6b3d1-9a9c-448b-b4dd-7aa22459da3b/" - } - }, - { - "bridge": null, - "custom_fields": {}, - "description": "", - "display": "Eth4", - "enabled": true, - "id": "fef883f1-ef61-433f-a15c-97ee8777deea", - "ip_addresses": [], - "mac_address": null, - "mode": null, - "mtu": null, - "name": "Eth4", - "notes_url": "http://nautobot:8000/api/virtualization/interfaces/fef883f1-ef61-433f-a15c-97ee8777deea/notes/", - "parent_interface": null, - "tagged_vlans": [], - "tags": [], - "untagged_vlan": null, - "url": "http://nautobot:8000/api/virtualization/interfaces/fef883f1-ef61-433f-a15c-97ee8777deea/", - "virtual_machine": { - "display": "test101-vm", - "id": "13d6b3d1-9a9c-448b-b4dd-7aa22459da3b", - "name": "test101-vm", - "url": "http://nautobot:8000/api/virtualization/virtual-machines/13d6b3d1-9a9c-448b-b4dd-7aa22459da3b/" - } - } - ], - "is_virtual": true, - "regions": [ - "test-region", - "parent-region" - ], - "services": [], - "site": "test-site", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "test102-vm": { - "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", - "config_context": {}, - "custom_fields": {}, - "interfaces": [], - "is_virtual": true, - "regions": [ - "test-region", - "parent-region" - ], - "services": [], - "site": "test-site", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "test103-vm": { - "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", - "config_context": {}, - "custom_fields": {}, - "interfaces": [], - "is_virtual": true, - "regions": [ - "test-region", - "parent-region" - ], - "services": [], - "site": "test-site", - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - }, - "test104-vm": { - "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", - "config_context": {}, - "custom_fields": {}, - "interfaces": [], - "is_virtual": true, - "regions": [], - "services": [], - "status": { - "label": "Active", - "value": "active" - }, - "tags": [] - } - } - }, - "all": { - "children": [ - "cluster_Test_Cluster", - "cluster_Test_Cluster_2", - "cluster_group_test_cluster_group", - "cluster_type_test_cluster_type", - "device_type_cisco_test", - "device_type_nexus_parent", - "is_virtual", - "manufacturer_cisco", - "rack_Test_Rack", - "rack_Test_Rack_Site_2", - "rack_group_parent_rack_group", - "rack_group_test_rack_group", - "rack_role_test_rack_role", - "region_other_region", - "region_parent_region", - "role_core_switch", - "service_http", - "service_ssh", - "service_telnet", - "site_test_site2", - "status_active", - "tenant_test_tenant", - "ungrouped" - ] - }, - "cluster_Test_Cluster": { - "hosts": [ - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" - ] - }, - "cluster_Test_Cluster_2": { - "hosts": [ - "Test VM With Spaces", - "test104-vm" - ] - }, - "cluster_group_test_cluster_group": { - "hosts": [ - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" - ] - }, - "cluster_type_test_cluster_type": { - "hosts": [ - "Test VM With Spaces", - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm", - "test104-vm" - ] - }, - "device_type_cisco_test": { - "hosts": [ - "R1-Device", - "TestDeviceR1", - "test100" - ] - }, - "device_type_nexus_parent": { - "hosts": [ - "Test Nexus One" - ] - }, - "is_virtual": { - "hosts": [ - "Test VM With Spaces", - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm", - "test104-vm" - ] - }, - "manufacturer_cisco": { - "hosts": [ - "R1-Device", - "Test Nexus One", - "TestDeviceR1", - "test100" - ] - }, - "rack_Test_Rack": { - "hosts": [ - "TestDeviceR1" - ] - }, - "rack_Test_Rack_Site_2": { - "hosts": [ - "R1-Device" - ] - }, - "rack_group_parent_rack_group": { - "hosts": [ - "TestDeviceR1" - ] - }, - "rack_group_test_rack_group": { - "hosts": [ - "TestDeviceR1" - ] - }, - "rack_role_test_rack_role": { - "hosts": [ - "R1-Device" - ] - }, - "region_parent_region": { - "children": [ - "region_test_region" - ] - }, - "region_test_region": { - "children": [ - "site_test_site" - ] - }, - "role_core_switch": { - "hosts": [ - "R1-Device", - "Test Nexus One", - "TestDeviceR1", - "test100" - ] - }, - "service_http": { - "hosts": [ - "test100" - ] - }, - "service_ssh": { - "hosts": [ - "Test VM With Spaces", - "test100" - ] - }, - "service_telnet": { - "hosts": [ - "Test Nexus One" - ] - }, - "site_test_site": { - "hosts": [ - "Test Nexus One", - "TestDeviceR1", - "test100", - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" - ] - }, - "site_test_site2": { - "hosts": [ - "R1-Device" - ] - }, - "status_active": { - "hosts": [ - "R1-Device", - "Test Nexus One", - "Test VM With Spaces", - "TestDeviceR1", - "test100", - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm", - "test104-vm" - ] - }, - "tenant_test_tenant": { - "hosts": [ - "test100" - ] - } -} \ No newline at end of file diff --git a/tests/integration/targets/inventory-1.4/files/test-inventory.yml b/tests/integration/targets/inventory-1.4/files/test-inventory.yml deleted file mode 100644 index 4954836f..00000000 --- a/tests/integration/targets/inventory-1.4/files/test-inventory.yml +++ /dev/null @@ -1,28 +0,0 @@ -plugin: networktocode.nautobot.inventory -api_endpoint: "http://nautobot:8000" -token: "0123456789abcdef0123456789abcdef01234567" -validate_certs: False - -config_context: True -plurals: False -interfaces: True -services: True - -group_by: - - site - - tenant - - rack - - rack_group - - rack_role - - tag - - role - - device_type - - manufacturer - - platform - - region - - cluster - - cluster_group - - cluster_type - - is_virtual - - services - - status diff --git a/tests/integration/targets/inventory-1.4/runme.sh b/tests/integration/targets/inventory-1.4/runme.sh deleted file mode 100755 index ad146d6f..00000000 --- a/tests/integration/targets/inventory-1.4/runme.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bash - -set -o xtrace # Print commands as they're run -set -o errexit # abort on nonzero exitstatus -set -o nounset # abort on unbound variable -set -o pipefail # don't hide errors within pipes - -# Directory of this script -SCRIPT_DIR="$( dirname "${BASH_SOURCE[0]}" )" -RUNME_CONFIG="$SCRIPT_DIR/runme_config" -INVENTORIES_DIR="$SCRIPT_DIR/files" - -# Load runme_config, if exists - the only way to pass environment when run through ansible-test -if [[ -f "$RUNME_CONFIG" ]] -then - source "$RUNME_CONFIG" -fi - -declare -a COMPARE_OPTIONS # empty array - -# OUTPUT_DIR is set by ansible-test -# OUTPUT_INVENTORY_JSON is only set if running hacking/update_test_inventories.sh to update the test diff data -if [[ -n "${OUTPUT_INVENTORY_JSON:-}" ]] -then - OUTPUT_DIR="$OUTPUT_INVENTORY_JSON" - - # Clean up JSON fields we don't want to store and compare against in tests (creation times, etc.) - COMPARE_OPTIONS+=(--write) -fi - -echo OUTPUT_DIR="$OUTPUT_DIR" - -inventory () { - if [[ -n "${OUTPUT_INVENTORY_JSON:-}" ]] - then - # Running for the purpose of updating test data - ansible-inventory "$@" - else - # Running inside ansible-test - # Run through python.py just to make sure we've definitely got the coverage environment set up - # Just running ansible-inventory directly may not actually find the right one in PATH - python.py "$(command -v ansible-inventory)" "$@" - fi -} - - -RESULT=0 - -for INVENTORY in "$INVENTORIES_DIR"/*.yml -do - NAME="$(basename "$INVENTORY")" - NAME_WITHOUT_EXTENSION="${NAME%.yml}" - - OUTPUT_JSON="$OUTPUT_DIR/$NAME_WITHOUT_EXTENSION.json" - inventory -vvvv --list --inventory "$INVENTORY" --output="$OUTPUT_JSON" - - # Compare the output - if ! "$SCRIPT_DIR/compare_inventory_json.py" "${COMPARE_OPTIONS[@]}" "$INVENTORIES_DIR/$NAME_WITHOUT_EXTENSION.json" "$OUTPUT_JSON" - then - # Returned non-zero status - RESULT=1 - fi - -done - -exit $RESULT diff --git a/tests/integration/targets/inventory-1.4/runme_config.template b/tests/integration/targets/inventory-1.4/runme_config.template deleted file mode 100644 index 7865d774..00000000 --- a/tests/integration/targets/inventory-1.4/runme_config.template +++ /dev/null @@ -1,6 +0,0 @@ -# runme_config is source'd by runme.sh to set environment variables used to modify the test against different versions of Nautobot. -# .travis.yml uses render_config.sh to generate it from runme_config.template -# There is no other way to pass environment variables to a runme.sh integration test. -# (integration_config.yml files are only helpful to ansible yaml-based tests) - -export PYNAUTOBOT_VERSION=${VERSION} diff --git a/tests/integration/targets/inventory/compare_inventory_json.py b/tests/integration/targets/inventory/compare_inventory_json.py index b6eac903..3216e328 100755 --- a/tests/integration/targets/inventory/compare_inventory_json.py +++ b/tests/integration/targets/inventory/compare_inventory_json.py @@ -16,10 +16,10 @@ # Nautobot includes "created" and "last_updated" times on objects. These end up in the interfaces objects that are included verbatim from the Nautobot API. # "url" may be different if local tests use a different host/port # Remove these from files saved in git as test data -KEYS_REMOVE = frozenset(["created", "id", "last_updated", "rack_id", "url"]) +KEYS_REMOVE = frozenset(["created", "id", "last_updated", "rack_id", "url", "notes_url"]) # Ignore these when performing diffs as they will be different for each test run -KEYS_IGNORE = frozenset() +KEYS_IGNORE = frozenset(["natural_slug"]) def all_keys_to_ignore(): @@ -30,13 +30,12 @@ def all_keys_to_ignore(): # Assume the object will not be recursive, as it originally came from JSON def remove_keys(obj, keys): - if isinstance(obj, dict): keys_to_remove = keys.intersection(obj.keys()) for key in keys_to_remove: del obj[key] - for (key, value) in obj.items(): + for key, value in obj.items(): remove_keys(value, keys) elif isinstance(obj, list): @@ -68,6 +67,14 @@ def sort_hostvar_arrays(obj): host["services"] = sorted(services, key=itemgetter("name")) +def sort_groups(obj): + for group_name, group in obj.items(): + if group.get("children"): + group["children"] = sorted(group["children"]) + elif group.get("hosts"): + group["hosts"] = sorted(group["hosts"]) + + def read_json(filename): with open(filename, "r") as f: return json.loads(f.read()) @@ -121,6 +128,7 @@ def main(): # This makes diffs more easily readable to ensure changes to test data look correct. remove_keys(data_a, KEYS_REMOVE) sort_hostvar_arrays(data_a) + sort_groups(data_a) write_json(args.filename_b, data_a) else: @@ -134,6 +142,9 @@ def main(): sort_hostvar_arrays(data_a) sort_hostvar_arrays(data_b) + sort_groups(data_a) + sort_groups(data_b) + # Perform the diff # syntax='symmetric' will produce output that prints both the before and after as "$insert" and "$delete" # marshal=True removes any special types, allowing to be dumped as json diff --git a/tests/integration/targets/inventory/files/test-inventory-legacy.json b/tests/integration/targets/inventory/files/test-inventory-legacy.json index a7705f6f..1dcf9527 100644 --- a/tests/integration/targets/inventory/files/test-inventory-legacy.json +++ b/tests/integration/targets/inventory/files/test-inventory-legacy.json @@ -4,31 +4,39 @@ "R1-Device": { "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "is_virtual": false, "local_context_data": [ null ], + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" + ], + "rack_groups": [ + "Parent Rack Group" ], - "rack_groups": [], - "rack_role": "test-rack-role", + "rack_role": "Test Rack Role", "racks": [ - "Test Rack Site 2" + "Main Test Rack" ], - "regions": [], "services": [], - "sites": [ - "test-site2" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, @@ -36,34 +44,78 @@ "ansible_host": "172.16.180.11", "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "nexus-parent" + "Nexus Parent" ], "is_virtual": false, "local_context_data": [ null ], + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], "primary_ip4": "172.16.180.11", - "regions": [ - "test-region", - "parent-region" - ], "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus One", - "name": "Test Nexus One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus One", + "natural_slug": "test-nexus-one__child-test-location_parent-test-location_9171", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": { + "object_type": "ipam.ipaddress" + }, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 0, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "telnet (TCP/23)", - "ipaddresses": [], + "ip_addresses": [], "name": "telnet", + "natural_slug": "telnet____test-nexus-one__child-test-location_parent-test-location_758f", + "object_type": "ipam.service", "ports": [ 23 ], @@ -75,32 +127,36 @@ "virtual_machine": null } ], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test VM With Spaces": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "is_virtual": true, "local_context_data": [ null ], - "regions": [], + "locations": [], "services": [ { "custom_fields": {}, "description": "", "device": null, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh_test-cluster-2__test-vm-with-spaces_2cf8", + "object_type": "ipam.service", "ports": [ 22 ], @@ -110,60 +166,91 @@ }, "tags": [], "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null } } ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "TestDeviceR1": { "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "is_virtual": false, "local_context_data": [ null ], + "location": "Child-Child Test Location", + "locations": [ + "Child-Child Test Location", + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], "rack_groups": [ - "test-rack-group", - "parent-rack-group" + "Child Rack Group", + "Parent Rack Group" ], "racks": [ - "Test Rack" - ], - "regions": [ - "test-region", - "parent-region" + "Sub Test Rack" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test100": { "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "is_virtual": false, "local_context_data": [ @@ -173,35 +260,129 @@ ] } ], - "manufacturers": [ - "cisco" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "regions": [ - "test-region", - "parent-region" + "manufacturers": [ + "Cisco" ], "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "http (TCP/80)", - "ipaddresses": [ - { - "address": "2001::1:1/64", - "display": "2001::1:1/64", - "family": 6 - }, + "ip_addresses": [ { "address": "172.16.180.1/24", + "custom_fields": {}, + "description": "", "display": "172.16.180.1/24", - "family": 4 + "dns_name": "", + "host": "172.16.180.1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 4, + "mask_length": 24, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-1_57e3", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] + }, + { + "address": "2001::1:1/64", + "custom_fields": {}, + "description": "", + "display": "2001::1:1/64", + "dns_name": "", + "host": "2001::1:1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 6, + "mask_length": 64, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_2001-1-1_6117", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] } ], "name": "http", + "natural_slug": "http____test100_test-tenant_child-test-location_parent-test-location_a068", + "object_type": "ipam.service", "ports": [ 80 ], @@ -216,12 +397,57 @@ "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh____test100_test-tenant_child-test-location_parent-test-location_aac7", + "object_type": "ipam.service", "ports": [ 22 ], @@ -233,124 +459,143 @@ "virtual_machine": null } ], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], - "tenant_group": "test-tenant-group", + "tenant_group": "Test Tenant Group", "tenants": [ - "test-tenant" + "Test Tenant" ] }, "test100-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test101-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test102-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test103-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test104-vm": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "is_virtual": true, "local_context_data": [ null ], - "regions": [], + "locations": [], "services": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] } diff --git a/tests/integration/targets/inventory/files/test-inventory-options-flatten.json b/tests/integration/targets/inventory/files/test-inventory-options-flatten.json index 2d432c63..cc1fcbe9 100644 --- a/tests/integration/targets/inventory/files/test-inventory-options-flatten.json +++ b/tests/integration/targets/inventory/files/test-inventory-options-flatten.json @@ -1,69 +1,97 @@ { - "Test_Cluster": { - "hosts": [ - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" - ] - }, - "Test_Cluster_2": { - "hosts": [ - "Test VM With Spaces", - "test104-vm" - ] - }, - "Test_Rack": { - "hosts": [ - "TestDeviceR1" - ] - }, - "Test_Rack_Site_2": { - "hosts": [ - "R1-Device" - ] - }, "_meta": { "hostvars": { "R1-Device": { - "device_type": "cisco-test", + "device_type": "Cisco Test", "interfaces": [], "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack Site 2", - "rack_groups": [], - "rack_role": "test-rack-role", - "regions": [], - "role": "core-switch", + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], + "manufacturer": "Cisco", + "rack": "Main Test Rack", + "rack_groups": [ + "Parent Rack Group" + ], + "rack_role": "Test Rack Role", + "role": "Core Switch", "services": [], - "site": "test-site2", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test Nexus One": { "ansible_host": "172.16.180.11", - "device_type": "nexus-parent", + "device_type": "Nexus Parent", "dns_name": "nexus.example.com", "interfaces": [ { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus One", - "name": "Test Nexus One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus One", + "natural_slug": "test-nexus-one__child-test-location_parent-test-location_9171", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": { + "object_type": "ipam.ipaddress" + }, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 0, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "Ethernet1/1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.11/24", @@ -71,20 +99,67 @@ "description": "", "display": "172.16.180.11/24", "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.11", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-11_59b6", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -94,30 +169,83 @@ "mode": null, "mtu": null, "name": "Ethernet1/1", + "natural_slug": "ethernet1-1_test-nexus-one__child-test-location_parent-test-location_a314", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null }, { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus Child One", - "name": "Test Nexus Child One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus Child One", + "natural_slug": "test-nexus-child-one__child-test-location_parent-test-location_d562", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 2, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "Ethernet2/1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.12/24", @@ -125,20 +253,67 @@ "description": "", "display": "172.16.180.12/24", "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.12", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-12_f322", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -148,34 +323,91 @@ "mode": null, "mtu": null, "name": "Ethernet2/1", + "natural_slug": "ethernet2-1_test-nexus-child-one__child-test-location_parent-test-location_be66", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null } ], "is_virtual": false, - "manufacturer": "cisco", - "primary_ip4": "172.16.180.11", - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "role": "core-switch", + "manufacturer": "Cisco", + "primary_ip4": "172.16.180.11", + "role": "Core Switch", "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus One", - "name": "Test Nexus One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus One", + "natural_slug": "test-nexus-one__child-test-location_parent-test-location_9171", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": { + "object_type": "ipam.ipaddress" + }, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 0, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "telnet (TCP/23)", - "ipaddresses": [], + "ip_addresses": [], "name": "telnet", + "natural_slug": "telnet____test-nexus-one__child-test-location_parent-test-location_758f", + "object_type": "ipam.service", "ports": [ 23 ], @@ -187,18 +419,24 @@ "virtual_machine": null } ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test VM With Spaces": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -207,15 +445,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster-2__test-vm-with-spaces_eth0_0a6c", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -224,25 +499,62 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster-2__test-vm-with-spaces_eth1_45be", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, - "regions": [], + "locations": [], "services": [ { "custom_fields": {}, "description": "", "device": null, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh_test-cluster-2__test-vm-with-spaces_2cf8", + "object_type": "ipam.service", "ports": [ 22 ], @@ -252,59 +564,136 @@ }, "tags": [], "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null } } ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "TestDeviceR1": { - "device_type": "cisco-test", + "device_type": "Cisco Test", "interfaces": [], "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack", - "rack_groups": [ - "test-rack-group", - "parent-rack-group" + "location": "Child-Child Test Location", + "locations": [ + "Child-Child Test Location", + "Child Test Location", + "Parent Test Location" ], - "regions": [ - "test-region", - "parent-region" + "manufacturer": "Cisco", + "rack": "Sub Test Rack", + "rack_groups": [ + "Child Rack Group", + "Parent Rack Group" ], - "role": "core-switch", + "role": "Core Switch", "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test100": { - "device_type": "cisco-test", + "device_type": "Cisco Test", "interfaces": [ { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "GigabitEthernet1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.1/24", @@ -312,20 +701,67 @@ "description": "", "display": "172.16.180.1/24", "dns_name": "", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.1", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-1_57e3", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -335,30 +771,87 @@ "mode": null, "mtu": null, "name": "GigabitEthernet1", + "natural_slug": "gigabitethernet1_test100_test-tenant_child-test-location_parent-test-location_0bc5", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null }, { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "GigabitEthernet2", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "2001::1:1/64", @@ -366,20 +859,67 @@ "description": "", "display": "2001::1:1/64", "dns_name": "", - "family": { - "label": "IPv6", - "value": 6 - }, + "host": "2001::1:1", + "ip_version": 6, + "mask_length": 64, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_2001-1-1_6117", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "2001::ffff:ffff:ffff:ffff", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "2001::/64", + "ip_version": 6, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_2001_64_8659", + "network": "2001::", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "2001::/64", + "prefix_length": 64, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -389,47 +929,337 @@ "mode": null, "mtu": null, "name": "GigabitEthernet2", + "natural_slug": "gigabitethernet2_test100_test-tenant_child-test-location_parent-test-location_be95", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tagged_vlans": [], + "tags": [], + "type": { + "label": "1000BASE-T (1GE)", + "value": "1000base-t" + }, + "untagged_vlan": null, + "vrf": null + }, + { + "bridge": null, + "cable": null, + "cable_peer": null, + "cable_peer_type": null, + "connected_endpoint": null, + "connected_endpoint_reachable": null, + "connected_endpoint_type": null, + "custom_fields": {}, + "description": "", + "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, + "display": "test100", + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null + }, + "display": "GigabitEthernet3", + "enabled": true, + "ip_address_count": 0, + "ip_addresses": [], + "label": "", + "lag": null, + "mac_address": null, + "mgmt_only": false, + "mode": null, + "mtu": null, + "name": "GigabitEthernet3", + "natural_slug": "gigabitethernet3_test100_test-tenant_child-test-location_parent-test-location_135e", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null + }, + { + "bridge": null, + "cable": null, + "cable_peer": null, + "cable_peer_type": null, + "connected_endpoint": null, + "connected_endpoint_reachable": null, + "connected_endpoint_type": null, + "custom_fields": {}, + "description": "", + "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, + "display": "test100", + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null + }, + "display": "GigabitEthernet4", + "enabled": true, + "ip_address_count": 0, + "ip_addresses": [], + "label": "", + "lag": null, + "mac_address": null, + "mgmt_only": false, + "mode": null, + "mtu": null, + "name": "GigabitEthernet4", + "natural_slug": "gigabitethernet4_test100_test-tenant_child-test-location_parent-test-location_5982", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tagged_vlans": [], + "tags": [], + "type": { + "label": "1000BASE-T (1GE)", + "value": "1000base-t" + }, + "untagged_vlan": null, + "vrf": null } ], "is_virtual": false, - "manufacturer": "cisco", + "local_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], + "manufacturer": "Cisco", "ntp_servers": [ "pool.ntp.org" ], - "regions": [ - "test-region", - "parent-region" - ], - "role": "core-switch", + "role": "Core Switch", "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "http (TCP/80)", - "ipaddresses": [ - { - "address": "2001::1:1/64", - "display": "2001::1:1/64", - "family": 6 - }, + "ip_addresses": [ { "address": "172.16.180.1/24", + "custom_fields": {}, + "description": "", "display": "172.16.180.1/24", - "family": 4 + "dns_name": "", + "host": "172.16.180.1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 4, + "mask_length": 24, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-1_57e3", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] + }, + { + "address": "2001::1:1/64", + "custom_fields": {}, + "description": "", + "display": "2001::1:1/64", + "dns_name": "", + "host": "2001::1:1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 6, + "mask_length": 64, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_2001-1-1_6117", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] } ], "name": "http", + "natural_slug": "http____test100_test-tenant_child-test-location_parent-test-location_a068", + "object_type": "ipam.service", "ports": [ 80 ], @@ -444,12 +1274,57 @@ "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh____test100_test-tenant_child-test-location_parent-test-location_aac7", + "object_type": "ipam.service", "ports": [ 22 ], @@ -461,21 +1336,27 @@ "virtual_machine": null } ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], - "tenant": "test-tenant", - "tenant_group": "test-tenant-group" + "tenant": "Test Tenant", + "tenant_group": "Test Tenant Group" }, "test100-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -484,15 +1365,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster__test100-vm_eth0_7ee5", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -501,15 +1419,52 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster__test100-vm_eth1_4371", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth2", "enabled": true, @@ -518,15 +1473,52 @@ "mode": null, "mtu": null, "name": "Eth2", + "natural_slug": "test-cluster__test100-vm_eth2_f824", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth3", "enabled": true, @@ -535,15 +1527,52 @@ "mode": null, "mtu": null, "name": "Eth3", + "natural_slug": "test-cluster__test100-vm_eth3_3bb5", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth4", "enabled": true, @@ -552,34 +1581,76 @@ "mode": null, "mtu": null, "name": "Eth4", + "natural_slug": "test-cluster__test100-vm_eth4_0ba2", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test101-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -588,15 +1659,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster__test101-vm_eth0_87dc", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -605,15 +1713,52 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster__test101-vm_eth1_9cfb", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth2", "enabled": true, @@ -622,15 +1767,52 @@ "mode": null, "mtu": null, "name": "Eth2", + "natural_slug": "test-cluster__test101-vm_eth2_8aee", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth3", "enabled": true, @@ -639,15 +1821,52 @@ "mode": null, "mtu": null, "name": "Eth3", + "natural_slug": "test-cluster__test101-vm_eth3_4f29", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth4", "enabled": true, @@ -656,74 +1875,129 @@ "mode": null, "mtu": null, "name": "Eth4", + "natural_slug": "test-cluster__test101-vm_eth4_d390", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test102-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "interfaces": [], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test103-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "interfaces": [], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test104-vm": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "interfaces": [], "is_virtual": true, - "regions": [], + "locations": [], "services": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] } @@ -745,29 +2019,51 @@ }, "all": { "children": [ - "Test_Cluster", - "Test_Cluster_2", - "Test_Rack", - "Test_Rack_Site_2", "active", + "child_child_test_location", + "child_rack_group", + "child_test_location", "cisco", "cisco_test", "core_switch", "is_virtual", + "main_test_rack", "nexus_parent", - "other_region", "parent_rack_group", - "parent_region", + "parent_test_location", + "sub_test_rack", + "test_cluster", + "test_cluster_2", "test_cluster_group", "test_cluster_type", - "test_rack_group", "test_rack_role", - "test_site2", "test_tenant", "test_tenant_group", "ungrouped" ] }, + "child_child_test_location": { + "hosts": [ + "TestDeviceR1" + ] + }, + "child_rack_group": { + "hosts": [ + "TestDeviceR1" + ] + }, + "child_test_location": { + "hosts": [ + "R1-Device", + "Test Nexus One", + "TestDeviceR1", + "test100", + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" + ] + }, "cisco": { "hosts": [ "R1-Device", @@ -801,6 +2097,11 @@ "test104-vm" ] }, + "main_test_rack": { + "hosts": [ + "R1-Device" + ] + }, "nexus_parent": { "hosts": [ "Test Nexus One" @@ -808,59 +2109,60 @@ }, "parent_rack_group": { "hosts": [ + "R1-Device", "TestDeviceR1" ] }, - "parent_region": { - "children": [ - "test_region" - ] - }, - "test_cluster_group": { + "parent_test_location": { "hosts": [ + "R1-Device", + "Test Nexus One", + "TestDeviceR1", + "test100", "test100-vm", "test101-vm", "test102-vm", "test103-vm" ] }, - "test_cluster_type": { + "sub_test_rack": { + "hosts": [ + "TestDeviceR1" + ] + }, + "test_cluster": { "hosts": [ - "Test VM With Spaces", "test100-vm", "test101-vm", "test102-vm", - "test103-vm", - "test104-vm" + "test103-vm" ] }, - "test_rack_group": { + "test_cluster_2": { "hosts": [ - "TestDeviceR1" + "Test VM With Spaces", + "test104-vm" ] }, - "test_rack_role": { + "test_cluster_group": { "hosts": [ - "R1-Device" - ] - }, - "test_region": { - "children": [ - "test_site" + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" ] }, - "test_site": { + "test_cluster_type": { "hosts": [ - "Test Nexus One", - "TestDeviceR1", - "test100", + "Test VM With Spaces", "test100-vm", "test101-vm", "test102-vm", - "test103-vm" + "test103-vm", + "test104-vm" ] }, - "test_site2": { + "test_rack_role": { "hosts": [ "R1-Device" ] diff --git a/tests/integration/targets/inventory/files/test-inventory-options-flatten.yml b/tests/integration/targets/inventory/files/test-inventory-options-flatten.yml index b92ca5d5..7f59c25e 100644 --- a/tests/integration/targets/inventory/files/test-inventory-options-flatten.yml +++ b/tests/integration/targets/inventory/files/test-inventory-options-flatten.yml @@ -21,7 +21,7 @@ max_uri_length: 0 group_names_raw: True group_by: - - site + - location - tenant - tenant_group - rack @@ -32,7 +32,6 @@ group_by: - device_type - manufacturer - platform - - region - cluster - cluster_group - cluster_type diff --git a/tests/integration/targets/inventory/files/test-inventory-options.json b/tests/integration/targets/inventory/files/test-inventory-options.json index 6eb233df..f4e7bba2 100644 --- a/tests/integration/targets/inventory/files/test-inventory-options.json +++ b/tests/integration/targets/inventory/files/test-inventory-options.json @@ -1,108 +1,110 @@ { - "Test_Cluster": { - "hosts": [ - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" - ] - }, - "Test_Cluster_2": { - "hosts": [ - "Test VM With Spaces", - "test104-vm" - ] - }, - "Test_Rack": { - "hosts": [ - "TestDeviceR1" - ] - }, - "Test_Rack_Site_2": { - "hosts": [ - "R1-Device" - ] - }, "_meta": { "hostvars": { "R1-Device": { "custom_fields": {}, - "device_type": "cisco-test", + "device_type": "Cisco Test", "display": "R1-Device", "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack Site 2", - "rack_groups": [], - "rack_role": "test-rack-role", - "regions": [], - "role": "core-switch", - "site": "test-site2", + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], + "manufacturer": "Cisco", + "rack": "Main Test Rack", + "rack_groups": [ + "Parent Rack Group" + ], + "rack_role": "Test Rack Role", + "role": "Core Switch", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test VM With Spaces": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "display": "Test VM With Spaces", "is_virtual": true, - "regions": [], + "locations": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "TestDeviceR1": { "custom_fields": {}, - "device_type": "cisco-test", + "device_type": "Cisco Test", "display": "TestDeviceR1", "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack", - "rack_groups": [ - "test-rack-group", - "parent-rack-group" + "location": "Child-Child Test Location", + "locations": [ + "Child-Child Test Location", + "Child Test Location", + "Parent Test Location" ], - "regions": [ - "test-region", - "parent-region" + "manufacturer": "Cisco", + "rack": "Sub Test Rack", + "rack_groups": [ + "Child Rack Group", + "Parent Rack Group" ], - "role": "core-switch", - "site": "test-site", + "role": "Core Switch", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "VC1": { "ansible_host": "nexus.example.com", "custom_fields": {}, - "device_type": "nexus-parent", + "device_type": "Nexus Parent", "display": "Test Nexus One", "dns_name": "nexus.example.com", "is_virtual": false, - "manufacturer": "cisco", - "primary_ip4": "172.16.180.11", - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "role": "core-switch", - "site": "test-site", + "manufacturer": "Cisco", + "primary_ip4": "172.16.180.11", + "role": "Core Switch", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test100": { "custom_fields": {}, - "device_type": "cisco-test", + "device_type": "Cisco Test", "display": "test100", "is_virtual": false, "local_context_data": { @@ -110,103 +112,133 @@ "pool.ntp.org" ] }, - "manufacturer": "cisco", - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "role": "core-switch", - "site": "test-site", + "manufacturer": "Cisco", + "role": "Core Switch", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], - "tenant": "test-tenant", - "tenant_group": "test-tenant-group" + "tenant": "Test Tenant", + "tenant_group": "Test Tenant Group" }, "test100-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "display": "test100-vm", "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test101-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "display": "test101-vm", "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test102-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "display": "test102-vm", "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test103-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "display": "test103-vm", "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test104-vm": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "custom_fields": {}, "display": "test104-vm", "is_virtual": true, - "regions": [], + "locations": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] } @@ -228,29 +260,51 @@ }, "all": { "children": [ - "Test_Cluster", - "Test_Cluster_2", - "Test_Rack", - "Test_Rack_Site_2", "active", + "child_child_test_location", + "child_rack_group", + "child_test_location", "cisco", "cisco_test", "core_switch", "is_virtual", "jinja_test_group", + "main_test_rack", "nexus_parent", - "other_region", "parent_rack_group", - "parent_region", + "parent_test_location", + "sub_test_rack", + "test_cluster", + "test_cluster_2", "test_cluster_group", "test_cluster_type", - "test_rack_group", "test_rack_role", - "test_site2", "test_tenant", "ungrouped" ] }, + "child_child_test_location": { + "hosts": [ + "TestDeviceR1" + ] + }, + "child_rack_group": { + "hosts": [ + "TestDeviceR1" + ] + }, + "child_test_location": { + "hosts": [ + "R1-Device", + "TestDeviceR1", + "VC1", + "test100", + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" + ] + }, "cisco": { "hosts": [ "R1-Device", @@ -290,6 +344,11 @@ "TestDeviceR1" ] }, + "main_test_rack": { + "hosts": [ + "R1-Device" + ] + }, "nexus_parent": { "hosts": [ "VC1" @@ -297,59 +356,60 @@ }, "parent_rack_group": { "hosts": [ + "R1-Device", "TestDeviceR1" ] }, - "parent_region": { - "children": [ - "test_region" - ] - }, - "test_cluster_group": { + "parent_test_location": { "hosts": [ + "R1-Device", + "TestDeviceR1", + "VC1", + "test100", "test100-vm", "test101-vm", "test102-vm", "test103-vm" ] }, - "test_cluster_type": { + "sub_test_rack": { + "hosts": [ + "TestDeviceR1" + ] + }, + "test_cluster": { "hosts": [ - "Test VM With Spaces", "test100-vm", "test101-vm", "test102-vm", - "test103-vm", - "test104-vm" + "test103-vm" ] }, - "test_rack_group": { + "test_cluster_2": { "hosts": [ - "TestDeviceR1" + "Test VM With Spaces", + "test104-vm" ] }, - "test_rack_role": { + "test_cluster_group": { "hosts": [ - "R1-Device" - ] - }, - "test_region": { - "children": [ - "test_site" + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" ] }, - "test_site": { + "test_cluster_type": { "hosts": [ - "TestDeviceR1", - "VC1", - "test100", + "Test VM With Spaces", "test100-vm", "test101-vm", "test102-vm", - "test103-vm" + "test103-vm", + "test104-vm" ] }, - "test_site2": { + "test_rack_role": { "hosts": [ "R1-Device" ] diff --git a/tests/integration/targets/inventory/files/test-inventory-options.yml b/tests/integration/targets/inventory/files/test-inventory-options.yml index d863c3f1..50875085 100644 --- a/tests/integration/targets/inventory/files/test-inventory-options.yml +++ b/tests/integration/targets/inventory/files/test-inventory-options.yml @@ -20,7 +20,7 @@ dns_name: True ansible_host_dns_name: True group_by: - - site + - location - tenant - rack - rack_group @@ -30,7 +30,6 @@ group_by: - device_type - manufacturer - platform - - region - cluster - cluster_group - cluster_type @@ -40,10 +39,10 @@ group_by: query_filters: device_query_filters: - - role: core-switch + - role: "Core Switch" vm_query_filters: - - cluster_type: test-cluster-type + - cluster_type: "Test Cluster Type" # See Constructed for details # https://docs.ansible.com/ansible/latest/plugins/inventory/constructed.html diff --git a/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.json b/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.json index 903d60f5..20b98fcf 100644 --- a/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.json +++ b/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.json @@ -1,142 +1,138 @@ { - "Test_Cluster": { - "hosts": [ - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" - ] - }, - "Test_Cluster_2": { - "hosts": [ - "Test VM With Spaces", - "test104-vm" - ] - }, - "Test_Rack": { - "hosts": [ - "TestDeviceR1" - ] - }, - "Test_Rack_Site_2": { - "hosts": [ - "R1-Device" - ] - }, "_meta": { "hostvars": { "R1-Device": { "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "is_virtual": false, "local_context_data": [ null ], + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], - "rack_groups": [], - "rack_role": "test-rack-role", - "racks": [ - "Test Rack Site 2" + "rack_groups": [ + "Parent Rack Group" ], - "regions": [], - "sites": [ - "test-site2" + "rack_role": "Test Rack Role", + "racks": [ + "Main Test Rack" ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test Nexus One": { "ansible_host": "172.16.180.11", "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "nexus-parent" + "Nexus Parent" ], "is_virtual": false, "local_context_data": [ null ], + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], "primary_ip4": "172.16.180.11", - "regions": [ - "test-region", - "parent-region" - ], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test VM With Spaces": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "is_virtual": true, "local_context_data": [ null ], - "regions": [], + "locations": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "TestDeviceR1": { "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "is_virtual": false, "local_context_data": [ null ], + "location": "Child-Child Test Location", + "locations": [ + "Child-Child Test Location", + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], "rack_groups": [ - "test-rack-group", - "parent-rack-group" + "Child Rack Group", + "Parent Rack Group" ], "racks": [ - "Test Rack" - ], - "regions": [ - "test-region", - "parent-region" - ], - "sites": [ - "test-site" + "Sub Test Rack" ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test100": { "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "is_virtual": false, "local_context_data": [ @@ -146,124 +142,144 @@ ] } ], + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], "ntp_servers": [ "pool.ntp.org" ], - "regions": [ - "test-region", - "parent-region" - ], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], - "tenant_group": "test-tenant-group", + "tenant_group": "Test Tenant Group", "tenants": [ - "test-tenant" + "Test Tenant" ] }, "test100-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" - ], - "sites": [ - "test-site" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test101-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" - ], - "sites": [ - "test-site" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test102-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" - ], - "sites": [ - "test-site" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test103-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" - ], - "sites": [ - "test-site" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test104-vm": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "is_virtual": true, "local_context_data": [ null ], - "regions": [], + "locations": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] } @@ -285,28 +301,51 @@ }, "all": { "children": [ - "Test_Cluster", - "Test_Cluster_2", - "Test_Rack", - "Test_Rack_Site_2", "active", + "child_rack_group", "cisco", "cisco_test", "core_switch", "is_virtual", + "main_test_rack", "nexus_parent", - "other_region", "parent_rack_group", - "parent_region", + "parent_test_location", + "sub_test_rack", + "test_cluster", + "test_cluster_2", "test_cluster_group", "test_cluster_type", - "test_rack_group", "test_rack_role", - "test_site2", "test_tenant", "ungrouped" ] }, + "child_child_test_location": { + "hosts": [ + "TestDeviceR1" + ] + }, + "child_rack_group": { + "hosts": [ + "TestDeviceR1" + ] + }, + "child_test_location": { + "children": [ + "child_child_test_location" + ], + "hosts": [ + "R1-Device", + "test100", + "TestDeviceR1", + "Test Nexus One", + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" + ] + }, "cisco": { "hosts": [ "R1-Device", @@ -340,6 +379,11 @@ "test104-vm" ] }, + "main_test_rack": { + "hosts": [ + "R1-Device" + ] + }, "nexus_parent": { "hosts": [ "Test Nexus One" @@ -347,59 +391,63 @@ }, "parent_rack_group": { "hosts": [ + "R1-Device", "TestDeviceR1" ] }, - "parent_region": { + "parent_test_location": { "children": [ - "test_region" - ] - }, - "test_cluster_group": { + "child_test_location" + ], "hosts": [ + "R1-Device", + "test100", + "TestDeviceR1", + "Test Nexus One", "test100-vm", "test101-vm", "test102-vm", "test103-vm" ] }, - "test_cluster_type": { + "sub_test_rack": { + "hosts": [ + "TestDeviceR1" + ] + }, + "test_cluster": { "hosts": [ - "Test VM With Spaces", "test100-vm", "test101-vm", "test102-vm", - "test103-vm", - "test104-vm" + "test103-vm" ] }, - "test_rack_group": { + "test_cluster_2": { "hosts": [ - "TestDeviceR1" + "Test VM With Spaces", + "test104-vm" ] }, - "test_rack_role": { + "test_cluster_group": { "hosts": [ - "R1-Device" - ] - }, - "test_region": { - "children": [ - "test_site" + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" ] }, - "test_site": { + "test_cluster_type": { "hosts": [ - "Test Nexus One", - "TestDeviceR1", - "test100", + "Test VM With Spaces", "test100-vm", "test101-vm", "test102-vm", - "test103-vm" + "test103-vm", + "test104-vm" ] }, - "test_site2": { + "test_rack_role": { "hosts": [ "R1-Device" ] diff --git a/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.yml b/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.yml index ec4b06c3..0ee90ad3 100644 --- a/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.yml +++ b/tests/integration/targets/inventory/files/test-inventory-plurals-flatten.yml @@ -13,7 +13,7 @@ fetch_all: True group_names_raw: True group_by: - - sites + - locations - tenants - racks - rack_group @@ -23,7 +23,6 @@ group_by: - device_types - manufacturers - platforms - - region - cluster - cluster_group - cluster_type diff --git a/tests/integration/targets/inventory/files/test-inventory-plurals.json b/tests/integration/targets/inventory/files/test-inventory-plurals.json index b31698c9..b274079c 100644 --- a/tests/integration/targets/inventory/files/test-inventory-plurals.json +++ b/tests/integration/targets/inventory/files/test-inventory-plurals.json @@ -7,32 +7,40 @@ ], "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "interfaces": [], "is_virtual": false, "local_context_data": [ null ], + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" + ], + "rack_groups": [ + "Parent Rack Group" ], - "rack_groups": [], - "rack_role": "test-rack-role", + "rack_role": "Test Rack Role", "racks": [ - "Test Rack Site 2" + "Main Test Rack" ], - "regions": [], "services": [], - "sites": [ - "test-site2" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, @@ -43,29 +51,71 @@ ], "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "nexus-parent" + "Nexus Parent" ], "dns_name": "nexus.example.com", "interfaces": [ { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus One", - "name": "Test Nexus One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus One", + "natural_slug": "test-nexus-one__child-test-location_parent-test-location_9171", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": { + "object_type": "ipam.ipaddress" + }, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 0, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "Ethernet1/1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.11/24", @@ -73,20 +123,67 @@ "description": "", "display": "172.16.180.11/24", "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.11", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-11_59b6", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -96,30 +193,83 @@ "mode": null, "mtu": null, "name": "Ethernet1/1", + "natural_slug": "ethernet1-1_test-nexus-one__child-test-location_parent-test-location_a314", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null }, { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus Child One", - "name": "Test Nexus Child One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus Child One", + "natural_slug": "test-nexus-child-one__child-test-location_parent-test-location_d562", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 2, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "Ethernet2/1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.12/24", @@ -127,20 +277,67 @@ "description": "", "display": "172.16.180.12/24", "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.12", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-12_f322", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -150,38 +347,95 @@ "mode": null, "mtu": null, "name": "Ethernet2/1", + "natural_slug": "ethernet2-1_test-nexus-child-one__child-test-location_parent-test-location_be66", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null } ], "is_virtual": false, "local_context_data": [ null ], + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], "primary_ip4": "172.16.180.11", - "regions": [ - "test-region", - "parent-region" - ], "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus One", - "name": "Test Nexus One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus One", + "natural_slug": "test-nexus-one__child-test-location_parent-test-location_9171", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": { + "object_type": "ipam.ipaddress" + }, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 0, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "telnet (TCP/23)", - "ipaddresses": [], + "ip_addresses": [], "name": "telnet", + "natural_slug": "telnet____test-nexus-one__child-test-location_parent-test-location_758f", + "object_type": "ipam.service", "ports": [ 23 ], @@ -193,24 +447,28 @@ "virtual_machine": null } ], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test VM With Spaces": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "config_context": [ {} ], "custom_fields": {}, "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -219,15 +477,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster-2__test-vm-with-spaces_eth0_0a6c", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -236,28 +531,65 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster-2__test-vm-with-spaces_eth1_45be", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, "local_context_data": [ null ], - "regions": [], + "locations": [], "services": [ { "custom_fields": {}, "description": "", "device": null, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh_test-cluster-2__test-vm-with-spaces_2cf8", + "object_type": "ipam.service", "ports": [ 22 ], @@ -267,14 +599,41 @@ }, "tags": [], "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null } } ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, @@ -284,37 +643,41 @@ ], "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "interfaces": [], "is_virtual": false, "local_context_data": [ null ], + "location": "Child-Child Test Location", + "locations": [ + "Child-Child Test Location", + "Child Test Location", + "Parent Test Location" + ], "manufacturers": [ - "cisco" + "Cisco" ], "rack_groups": [ - "test-rack-group", - "parent-rack-group" + "Child Rack Group", + "Parent Rack Group" ], "racks": [ - "Test Rack" - ], - "regions": [ - "test-region", - "parent-region" + "Sub Test Rack" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, @@ -328,28 +691,72 @@ ], "custom_fields": {}, "device_roles": [ - "core-switch" + "Core Switch" ], "device_types": [ - "cisco-test" + "Cisco Test" ], "interfaces": [ { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "GigabitEthernet1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.1/24", @@ -357,20 +764,67 @@ "description": "", "display": "172.16.180.1/24", "dns_name": "", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.1", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-1_57e3", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -380,30 +834,87 @@ "mode": null, "mtu": null, "name": "GigabitEthernet1", + "natural_slug": "gigabitethernet1_test100_test-tenant_child-test-location_parent-test-location_0bc5", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null }, { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "GigabitEthernet2", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "2001::1:1/64", @@ -411,20 +922,67 @@ "description": "", "display": "2001::1:1/64", "dns_name": "", - "family": { - "label": "IPv6", - "value": 6 - }, + "host": "2001::1:1", + "ip_version": 6, + "mask_length": 64, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_2001-1-1_6117", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "2001::ffff:ffff:ffff:ffff", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "2001::/64", + "ip_version": 6, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_2001_64_8659", + "network": "2001::", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "2001::/64", + "prefix_length": 64, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -434,13 +992,204 @@ "mode": null, "mtu": null, "name": "GigabitEthernet2", + "natural_slug": "gigabitethernet2_test100_test-tenant_child-test-location_parent-test-location_be95", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tagged_vlans": [], + "tags": [], + "type": { + "label": "1000BASE-T (1GE)", + "value": "1000base-t" + }, + "untagged_vlan": null, + "vrf": null + }, + { + "bridge": null, + "cable": null, + "cable_peer": null, + "cable_peer_type": null, + "connected_endpoint": null, + "connected_endpoint_reachable": null, + "connected_endpoint_type": null, + "custom_fields": {}, + "description": "", + "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, + "display": "test100", + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null + }, + "display": "GigabitEthernet3", + "enabled": true, + "ip_address_count": 0, + "ip_addresses": [], + "label": "", + "lag": null, + "mac_address": null, + "mgmt_only": false, + "mode": null, + "mtu": null, + "name": "GigabitEthernet3", + "natural_slug": "gigabitethernet3_test100_test-tenant_child-test-location_parent-test-location_135e", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null + }, + { + "bridge": null, + "cable": null, + "cable_peer": null, + "cable_peer_type": null, + "connected_endpoint": null, + "connected_endpoint_reachable": null, + "connected_endpoint_type": null, + "custom_fields": {}, + "description": "", + "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, + "display": "test100", + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null + }, + "display": "GigabitEthernet4", + "enabled": true, + "ip_address_count": 0, + "ip_addresses": [], + "label": "", + "lag": null, + "mac_address": null, + "mgmt_only": false, + "mode": null, + "mtu": null, + "name": "GigabitEthernet4", + "natural_slug": "gigabitethernet4_test100_test-tenant_child-test-location_parent-test-location_5982", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tagged_vlans": [], + "tags": [], + "type": { + "label": "1000BASE-T (1GE)", + "value": "1000base-t" + }, + "untagged_vlan": null, + "vrf": null } ], "is_virtual": false, @@ -451,35 +1200,129 @@ ] } ], - "manufacturers": [ - "cisco" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "regions": [ - "test-region", - "parent-region" + "manufacturers": [ + "Cisco" ], "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "http (TCP/80)", - "ipaddresses": [ - { - "address": "2001::1:1/64", - "display": "2001::1:1/64", - "family": 6 - }, + "ip_addresses": [ { "address": "172.16.180.1/24", + "custom_fields": {}, + "description": "", "display": "172.16.180.1/24", - "family": 4 + "dns_name": "", + "host": "172.16.180.1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 4, + "mask_length": 24, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-1_57e3", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] + }, + { + "address": "2001::1:1/64", + "custom_fields": {}, + "description": "", + "display": "2001::1:1/64", + "dns_name": "", + "host": "2001::1:1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 6, + "mask_length": 64, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_2001-1-1_6117", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] } ], "name": "http", + "natural_slug": "http____test100_test-tenant_child-test-location_parent-test-location_a068", + "object_type": "ipam.service", "ports": [ 80 ], @@ -494,12 +1337,57 @@ "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh____test100_test-tenant_child-test-location_parent-test-location_aac7", + "object_type": "ipam.service", "ports": [ 22 ], @@ -511,29 +1399,33 @@ "virtual_machine": null } ], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], - "tenant_group": "test-tenant-group", + "tenant_group": "Test Tenant Group", "tenants": [ - "test-tenant" + "Test Tenant" ] }, "test100-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": [ {} ], "custom_fields": {}, "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -542,15 +1434,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster__test100-vm_eth0_7ee5", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -559,15 +1488,52 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster__test100-vm_eth1_4371", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth2", "enabled": true, @@ -576,15 +1542,52 @@ "mode": null, "mtu": null, "name": "Eth2", + "natural_slug": "test-cluster__test100-vm_eth2_f824", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth3", "enabled": true, @@ -593,15 +1596,52 @@ "mode": null, "mtu": null, "name": "Eth3", + "natural_slug": "test-cluster__test100-vm_eth3_3bb5", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth4", "enabled": true, @@ -610,43 +1650,83 @@ "mode": null, "mtu": null, "name": "Eth4", + "natural_slug": "test-cluster__test100-vm_eth4_0ba2", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test101-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": [ {} ], "custom_fields": {}, "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -655,15 +1735,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster__test101-vm_eth0_87dc", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -672,15 +1789,52 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster__test101-vm_eth1_9cfb", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth2", "enabled": true, @@ -689,15 +1843,52 @@ "mode": null, "mtu": null, "name": "Eth2", + "natural_slug": "test-cluster__test101-vm_eth2_8aee", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth3", "enabled": true, @@ -706,15 +1897,52 @@ "mode": null, "mtu": null, "name": "Eth3", + "natural_slug": "test-cluster__test101-vm_eth3_4f29", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth4", "enabled": true, @@ -723,37 +1951,75 @@ "mode": null, "mtu": null, "name": "Eth4", + "natural_slug": "test-cluster__test101-vm_eth4_d390", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test102-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": [ {} ], @@ -763,24 +2029,27 @@ "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test103-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": [ {} ], @@ -790,23 +2059,26 @@ "local_context_data": [ null ], - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "sites": [ - "test-site" - ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test104-vm": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "config_context": [ {} ], @@ -816,11 +2088,16 @@ "local_context_data": [ null ], - "regions": [], + "locations": [], "services": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] } @@ -828,30 +2105,31 @@ }, "all": { "children": [ - "cluster_Test_Cluster", - "cluster_Test_Cluster_2", "cluster_group_test_cluster_group", + "cluster_test_cluster", + "cluster_test_cluster_2", "cluster_type_test_cluster_type", "device_roles_core_switch", "device_types_cisco_test", "device_types_nexus_parent", "is_virtual", + "location_parent_test_location", + "locations_child_child_test_location", + "locations_child_test_location", + "locations_parent_test_location", "manufacturers_cisco", + "rack_group_child_rack_group", "rack_group_parent_rack_group", - "rack_group_test_rack_group", "rack_role_test_rack_role", - "racks_Test_Rack", - "racks_Test_Rack_Site_2", - "region_other_region", - "region_parent_region", - "sites_test_site2", + "racks_main_test_rack", + "racks_sub_test_rack", "status_active", "tenant_group_test_tenant_group", "tenants_test_tenant", "ungrouped" ] }, - "cluster_Test_Cluster": { + "cluster_group_test_cluster_group": { "hosts": [ "test100-vm", "test101-vm", @@ -859,13 +2137,7 @@ "test103-vm" ] }, - "cluster_Test_Cluster_2": { - "hosts": [ - "Test VM With Spaces", - "test104-vm" - ] - }, - "cluster_group_test_cluster_group": { + "cluster_test_cluster": { "hosts": [ "test100-vm", "test101-vm", @@ -873,6 +2145,12 @@ "test103-vm" ] }, + "cluster_test_cluster_2": { + "hosts": [ + "Test VM With Spaces", + "test104-vm" + ] + }, "cluster_type_test_cluster_type": { "hosts": [ "Test VM With Spaces", @@ -913,63 +2191,77 @@ "test104-vm" ] }, - "manufacturers_cisco": { + "location_child_test_location": { + "children": [ + "location_child_child_test_location" + ] + }, + "location_parent_test_location": { + "children": [ + "location_child_test_location" + ] + }, + "locations_child_child_test_location": { + "hosts": [ + "TestDeviceR1" + ] + }, + "locations_child_test_location": { "hosts": [ "R1-Device", "Test Nexus One", "TestDeviceR1", - "test100" + "test100", + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" ] }, - "rack_group_parent_rack_group": { + "locations_parent_test_location": { "hosts": [ - "TestDeviceR1" + "R1-Device", + "Test Nexus One", + "TestDeviceR1", + "test100", + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" ] }, - "rack_group_test_rack_group": { + "manufacturers_cisco": { "hosts": [ - "TestDeviceR1" + "R1-Device", + "Test Nexus One", + "TestDeviceR1", + "test100" ] }, - "rack_role_test_rack_role": { + "rack_group_child_rack_group": { "hosts": [ - "R1-Device" + "TestDeviceR1" ] }, - "racks_Test_Rack": { + "rack_group_parent_rack_group": { "hosts": [ + "R1-Device", "TestDeviceR1" ] }, - "racks_Test_Rack_Site_2": { + "rack_role_test_rack_role": { "hosts": [ "R1-Device" ] }, - "region_parent_region": { - "children": [ - "region_test_region" - ] - }, - "region_test_region": { - "children": [ - "sites_test_site" - ] - }, - "sites_test_site": { + "racks_main_test_rack": { "hosts": [ - "Test Nexus One", - "TestDeviceR1", - "test100", - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" + "R1-Device" ] }, - "sites_test_site2": { + "racks_sub_test_rack": { "hosts": [ - "R1-Device" + "TestDeviceR1" ] }, "status_active": { diff --git a/tests/integration/targets/inventory/files/test-inventory-plurals.yml b/tests/integration/targets/inventory/files/test-inventory-plurals.yml index 741d9754..26c6f213 100644 --- a/tests/integration/targets/inventory/files/test-inventory-plurals.yml +++ b/tests/integration/targets/inventory/files/test-inventory-plurals.yml @@ -18,7 +18,7 @@ max_uri_length: 80 fetch_all: False group_by: - - sites + - locations - tenants - tenant_group - racks @@ -29,7 +29,6 @@ group_by: - device_types - manufacturers - platforms - - region - cluster - cluster_group - cluster_type diff --git a/tests/integration/targets/inventory/files/test-inventory.json b/tests/integration/targets/inventory/files/test-inventory.json index 55d84f1e..6117f988 100644 --- a/tests/integration/targets/inventory/files/test-inventory.json +++ b/tests/integration/targets/inventory/files/test-inventory.json @@ -4,20 +4,30 @@ "R1-Device": { "config_context": {}, "custom_fields": {}, - "device_type": "cisco-test", + "device_type": "Cisco Test", "interfaces": [], "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack Site 2", - "rack_groups": [], - "rack_role": "test-rack-role", - "regions": [], - "role": "core-switch", + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" + ], + "manufacturer": "Cisco", + "rack": "Main Test Rack", + "rack_groups": [ + "Parent Rack Group" + ], + "rack_role": "Test Rack Role", + "role": "Core Switch", "services": [], - "site": "test-site2", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, @@ -25,25 +35,67 @@ "ansible_host": "172.16.180.11", "config_context": {}, "custom_fields": {}, - "device_type": "nexus-parent", + "device_type": "Nexus Parent", "dns_name": "nexus.example.com", "interfaces": [ { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus One", - "name": "Test Nexus One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus One", + "natural_slug": "test-nexus-one__child-test-location_parent-test-location_9171", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": { + "object_type": "ipam.ipaddress" + }, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 0, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "Ethernet1/1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.11/24", @@ -51,20 +103,67 @@ "description": "", "display": "172.16.180.11/24", "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.11", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-11_59b6", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -74,30 +173,83 @@ "mode": null, "mtu": null, "name": "Ethernet1/1", + "natural_slug": "ethernet1-1_test-nexus-one__child-test-location_parent-test-location_a314", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null }, { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus Child One", - "name": "Test Nexus Child One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus Child One", + "natural_slug": "test-nexus-child-one__child-test-location_parent-test-location_d562", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 2, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "Ethernet2/1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.12/24", @@ -105,20 +257,67 @@ "description": "", "display": "172.16.180.12/24", "dns_name": "nexus.example.com", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.12", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-12_f322", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -128,34 +327,91 @@ "mode": null, "mtu": null, "name": "Ethernet2/1", + "natural_slug": "ethernet2-1_test-nexus-child-one__child-test-location_parent-test-location_be66", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null } ], "is_virtual": false, - "manufacturer": "cisco", - "primary_ip4": "172.16.180.11", - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "role": "core-switch", + "manufacturer": "Cisco", + "primary_ip4": "172.16.180.11", + "role": "Core Switch", "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "Test Nexus One", - "name": "Test Nexus One" + "face": null, + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "Test Nexus One", + "natural_slug": "test-nexus-one__child-test-location_parent-test-location_9171", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": { + "object_type": "ipam.ipaddress" + }, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vc_position": 0, + "vc_priority": null, + "virtual_chassis": { + "object_type": "dcim.virtualchassis" + } }, "display": "telnet (TCP/23)", - "ipaddresses": [], + "ip_addresses": [], "name": "telnet", + "natural_slug": "telnet____test-nexus-one__child-test-location_parent-test-location_758f", + "object_type": "ipam.service", "ports": [ 23 ], @@ -167,20 +423,26 @@ "virtual_machine": null } ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "Test VM With Spaces": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "config_context": {}, "custom_fields": {}, "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -189,15 +451,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster-2__test-vm-with-spaces_eth0_0a6c", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -206,25 +505,62 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster-2__test-vm-with-spaces_eth1_45be", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, - "regions": [], + "locations": [], "services": [ { "custom_fields": {}, "description": "", "device": null, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh_test-cluster-2__test-vm-with-spaces_2cf8", + "object_type": "ipam.service", "ports": [ 22 ], @@ -234,39 +570,72 @@ }, "tags": [], "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "Test VM With Spaces", - "name": "Test VM With Spaces" + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "Test VM With Spaces", + "natural_slug": "test-cluster-2__test-vm-with-spaces_e84a", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null } } ], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "TestDeviceR1": { "config_context": {}, "custom_fields": {}, - "device_type": "cisco-test", + "device_type": "Cisco Test", "interfaces": [], "is_virtual": false, - "manufacturer": "cisco", - "rack": "Test Rack", - "rack_groups": [ - "test-rack-group", - "parent-rack-group" + "location": "Child-Child Test Location", + "locations": [ + "Child-Child Test Location", + "Child Test Location", + "Parent Test Location" ], - "regions": [ - "test-region", - "parent-region" + "manufacturer": "Cisco", + "rack": "Sub Test Rack", + "rack_groups": [ + "Child Rack Group", + "Parent Rack Group" ], - "role": "core-switch", + "role": "Core Switch", "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, @@ -277,24 +646,68 @@ ] }, "custom_fields": {}, - "device_type": "cisco-test", + "device_type": "Cisco Test", "interfaces": [ { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "GigabitEthernet1", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "172.16.180.1/24", @@ -302,20 +715,67 @@ "description": "", "display": "172.16.180.1/24", "dns_name": "", - "family": { - "label": "IPv4", - "value": 4 - }, + "host": "172.16.180.1", + "ip_version": 4, + "mask_length": 24, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-1_57e3", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "172.31.255.255", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "172.16.0.0/12", + "ip_version": 4, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_172-16-0-0_12_c00f", + "network": "172.16.0.0", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "172.16.0.0/12", + "prefix_length": 12, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -325,30 +785,87 @@ "mode": null, "mtu": null, "name": "GigabitEthernet1", + "natural_slug": "gigabitethernet1_test100_test-tenant_child-test-location_parent-test-location_0bc5", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null }, { + "bridge": null, "cable": null, "cable_peer": null, "cable_peer_type": null, "connected_endpoint": null, "connected_endpoint_reachable": null, "connected_endpoint_type": null, - "count_ipaddresses": 1, "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "GigabitEthernet2", "enabled": true, + "ip_address_count": 1, "ip_addresses": [ { "address": "2001::1:1/64", @@ -356,20 +873,67 @@ "description": "", "display": "2001::1:1/64", "dns_name": "", - "family": { - "label": "IPv6", - "value": 6 - }, + "host": "2001::1:1", + "ip_version": 6, + "mask_length": 64, "nat_inside": null, - "nat_outside": null, + "nat_outside_list": [], + "natural_slug": "global_2001-1-1_6117", + "object_type": "ipam.ipaddress", + "parent": { + "broadcast": "2001::ffff:ffff:ffff:ffff", + "custom_fields": {}, + "date_allocated": null, + "description": "", + "display": "2001::/64", + "ip_version": 6, + "location": null, + "namespace": { + "custom_fields": {}, + "description": "Default Global namespace. Created by Nautobot.", + "display": "Global", + "location": null, + "name": "Global", + "natural_slug": "global_2d05", + "object_type": "ipam.namespace" + }, + "natural_slug": "global_2001_64_8659", + "network": "2001::", + "object_type": "ipam.prefix", + "parent": null, + "prefix": "2001::/64", + "prefix_length": 64, + "rir": null, + "role": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tenant": null, + "type": { + "label": "Network", + "value": "network" + }, + "vlan": null + }, "role": null, "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], "tenant": null, - "vrf": null + "type": "host" } ], "label": "", @@ -379,13 +943,204 @@ "mode": null, "mtu": null, "name": "GigabitEthernet2", + "natural_slug": "gigabitethernet2_test100_test-tenant_child-test-location_parent-test-location_be95", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "type": { "label": "1000BASE-T (1GE)", "value": "1000base-t" }, - "untagged_vlan": null + "untagged_vlan": null, + "vrf": null + }, + { + "bridge": null, + "cable": null, + "cable_peer": null, + "cable_peer_type": null, + "connected_endpoint": null, + "connected_endpoint_reachable": null, + "connected_endpoint_type": null, + "custom_fields": {}, + "description": "", + "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, + "display": "test100", + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null + }, + "display": "GigabitEthernet3", + "enabled": true, + "ip_address_count": 0, + "ip_addresses": [], + "label": "", + "lag": null, + "mac_address": null, + "mgmt_only": false, + "mode": null, + "mtu": null, + "name": "GigabitEthernet3", + "natural_slug": "gigabitethernet3_test100_test-tenant_child-test-location_parent-test-location_135e", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tagged_vlans": [], + "tags": [], + "type": { + "label": "1000BASE-T (1GE)", + "value": "1000base-t" + }, + "untagged_vlan": null, + "vrf": null + }, + { + "bridge": null, + "cable": null, + "cable_peer": null, + "cable_peer_type": null, + "connected_endpoint": null, + "connected_endpoint_reachable": null, + "connected_endpoint_type": null, + "custom_fields": {}, + "description": "", + "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, + "display": "test100", + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null + }, + "display": "GigabitEthernet4", + "enabled": true, + "ip_address_count": 0, + "ip_addresses": [], + "label": "", + "lag": null, + "mac_address": null, + "mgmt_only": false, + "mode": null, + "mtu": null, + "name": "GigabitEthernet4", + "natural_slug": "gigabitethernet4_test100_test-tenant_child-test-location_parent-test-location_5982", + "object_type": "dcim.interface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, + "tagged_vlans": [], + "tags": [], + "type": { + "label": "1000BASE-T (1GE)", + "value": "1000base-t" + }, + "untagged_vlan": null, + "vrf": null } ], "is_virtual": false, @@ -394,34 +1149,128 @@ "pool.ntp.org" ] }, - "manufacturer": "cisco", - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], - "role": "core-switch", + "manufacturer": "Cisco", + "role": "Core Switch", "services": [ { "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "http (TCP/80)", - "ipaddresses": [ - { - "address": "2001::1:1/64", - "display": "2001::1:1/64", - "family": 6 - }, + "ip_addresses": [ { "address": "172.16.180.1/24", + "custom_fields": {}, + "description": "", "display": "172.16.180.1/24", - "family": 4 + "dns_name": "", + "host": "172.16.180.1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 4, + "mask_length": 24, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_172-16-180-1_57e3", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] + }, + { + "address": "2001::1:1/64", + "custom_fields": {}, + "description": "", + "display": "2001::1:1/64", + "dns_name": "", + "host": "2001::1:1", + "interfaces": [ + { + "object_type": "dcim.interface" + } + ], + "ip_version": 6, + "mask_length": 64, + "nat_inside": null, + "nat_outside_list": [], + "natural_slug": "global_2001-1-1_6117", + "object_type": "ipam.ipaddress", + "parent": { + "object_type": "ipam.prefix" + }, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "type": "host", + "vm_interfaces": [] } ], "name": "http", + "natural_slug": "http____test100_test-tenant_child-test-location_parent-test-location_a068", + "object_type": "ipam.service", "ports": [ 80 ], @@ -436,12 +1285,57 @@ "custom_fields": {}, "description": "", "device": { + "asset_tag": null, + "cluster": null, + "comments": "", + "custom_fields": {}, + "device_redundancy_group": null, + "device_redundancy_group_priority": null, + "device_type": { + "object_type": "dcim.devicetype" + }, "display": "test100", - "name": "test100" + "face": null, + "local_config_context_data": { + "ntp_servers": [ + "pool.ntp.org" + ] + }, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "location": { + "object_type": "dcim.location" + }, + "name": "test100", + "natural_slug": "test100_test-tenant_child-test-location_parent-test-location_12cb", + "object_type": "dcim.device", + "parent_bay": null, + "platform": null, + "position": null, + "primary_ip4": null, + "primary_ip6": null, + "rack": null, + "role": { + "object_type": "extras.role" + }, + "secrets_group": null, + "serial": "", + "status": { + "object_type": "extras.status" + }, + "tenant": { + "object_type": "tenancy.tenant" + }, + "vc_position": null, + "vc_priority": null, + "virtual_chassis": null }, "display": "ssh (TCP/22)", - "ipaddresses": [], + "ip_addresses": [], "name": "ssh", + "natural_slug": "ssh____test100_test-tenant_child-test-location_parent-test-location_aac7", + "object_type": "ipam.service", "ports": [ 22 ], @@ -453,23 +1347,29 @@ "virtual_machine": null } ], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [], - "tenant": "test-tenant", - "tenant_group": "test-tenant-group" + "tenant": "Test Tenant", + "tenant_group": "Test Tenant Group" }, "test100-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": {}, "custom_fields": {}, "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -478,15 +1378,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster__test100-vm_eth0_7ee5", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -495,15 +1432,52 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster__test100-vm_eth1_4371", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth2", "enabled": true, @@ -512,15 +1486,52 @@ "mode": null, "mtu": null, "name": "Eth2", + "natural_slug": "test-cluster__test100-vm_eth2_f824", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth3", "enabled": true, @@ -529,15 +1540,52 @@ "mode": null, "mtu": null, "name": "Eth3", + "natural_slug": "test-cluster__test100-vm_eth3_3bb5", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth4", "enabled": true, @@ -546,36 +1594,78 @@ "mode": null, "mtu": null, "name": "Eth4", + "natural_slug": "test-cluster__test100-vm_eth4_0ba2", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test100-vm", - "name": "test100-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test100-vm", + "natural_slug": "test-cluster__test100-vm_bc38", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test101-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": {}, "custom_fields": {}, "interfaces": [ { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth0", "enabled": true, @@ -584,15 +1674,52 @@ "mode": null, "mtu": null, "name": "Eth0", + "natural_slug": "test-cluster__test101-vm_eth0_87dc", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth1", "enabled": true, @@ -601,15 +1728,52 @@ "mode": null, "mtu": null, "name": "Eth1", + "natural_slug": "test-cluster__test101-vm_eth1_9cfb", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth2", "enabled": true, @@ -618,15 +1782,52 @@ "mode": null, "mtu": null, "name": "Eth2", + "natural_slug": "test-cluster__test101-vm_eth2_8aee", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth3", "enabled": true, @@ -635,15 +1836,52 @@ "mode": null, "mtu": null, "name": "Eth3", + "natural_slug": "test-cluster__test101-vm_eth3_4f29", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null }, { + "bridge": null, + "custom_fields": {}, "description": "", "display": "Eth4", "enabled": true, @@ -652,80 +1890,135 @@ "mode": null, "mtu": null, "name": "Eth4", + "natural_slug": "test-cluster__test101-vm_eth4_d390", + "object_type": "virtualization.vminterface", + "parent_interface": null, + "status": { + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" + }, "tagged_vlans": [], "tags": [], "untagged_vlan": null, "virtual_machine": { + "cluster": { + "object_type": "virtualization.cluster" + }, + "comments": "", + "custom_fields": {}, + "disk": null, "display": "test101-vm", - "name": "test101-vm" - } + "local_config_context_data": null, + "local_config_context_data_owner_content_type": null, + "local_config_context_data_owner_object_id": null, + "local_config_context_schema": null, + "memory": null, + "name": "test101-vm", + "natural_slug": "test-cluster__test101-vm_6d1d", + "object_type": "virtualization.virtualmachine", + "platform": null, + "primary_ip4": null, + "primary_ip6": null, + "role": null, + "status": { + "object_type": "extras.status" + }, + "tenant": null, + "vcpus": null + }, + "vrf": null } ], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test102-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": {}, "custom_fields": {}, "interfaces": [], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test103-vm": { "cluster": "Test Cluster", - "cluster_group": "test-cluster-group", - "cluster_type": "test-cluster-type", + "cluster_group": "Test Cluster Group", + "cluster_type": "Test Cluster Type", "config_context": {}, "custom_fields": {}, "interfaces": [], "is_virtual": true, - "regions": [ - "test-region", - "parent-region" + "location": "Child Test Location", + "locations": [ + "Child Test Location", + "Parent Test Location" ], "services": [], - "site": "test-site", "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] }, "test104-vm": { "cluster": "Test Cluster 2", - "cluster_type": "test-cluster-type", + "cluster_type": "Test Cluster Type", "config_context": {}, "custom_fields": {}, "interfaces": [], "is_virtual": true, - "regions": [], + "locations": [], "services": [], "status": { - "label": "Active", - "value": "active" + "color": "4caf50", + "custom_fields": {}, + "description": "Unit is active", + "display": "Active", + "name": "Active", + "natural_slug": "active_efb8", + "object_type": "extras.status" }, "tags": [] } @@ -733,32 +2026,32 @@ }, "all": { "children": [ - "cluster_Test_Cluster", - "cluster_Test_Cluster_2", "cluster_group_test_cluster_group", + "cluster_test_cluster", + "cluster_test_cluster_2", "cluster_type_test_cluster_type", "device_type_cisco_test", "device_type_nexus_parent", "is_virtual", + "location_child_child_test_location", + "location_child_test_location", + "location_parent_test_location", "manufacturer_cisco", - "rack_Test_Rack", - "rack_Test_Rack_Site_2", + "rack_group_child_rack_group", "rack_group_parent_rack_group", - "rack_group_test_rack_group", + "rack_main_test_rack", "rack_role_test_rack_role", - "region_other_region", - "region_parent_region", + "rack_sub_test_rack", "role_core_switch", "service_http", "service_ssh", "service_telnet", - "site_test_site2", "status_active", "tenant_test_tenant", "ungrouped" ] }, - "cluster_Test_Cluster": { + "cluster_group_test_cluster_group": { "hosts": [ "test100-vm", "test101-vm", @@ -766,13 +2059,7 @@ "test103-vm" ] }, - "cluster_Test_Cluster_2": { - "hosts": [ - "Test VM With Spaces", - "test104-vm" - ] - }, - "cluster_group_test_cluster_group": { + "cluster_test_cluster": { "hosts": [ "test100-vm", "test101-vm", @@ -780,6 +2067,12 @@ "test103-vm" ] }, + "cluster_test_cluster_2": { + "hosts": [ + "Test VM With Spaces", + "test104-vm" + ] + }, "cluster_type_test_cluster_type": { "hosts": [ "Test VM With Spaces", @@ -812,47 +2105,67 @@ "test104-vm" ] }, - "manufacturer_cisco": { + "location_child_child_test_location": { + "hosts": [ + "TestDeviceR1" + ] + }, + "location_child_test_location": { "hosts": [ "R1-Device", "Test Nexus One", "TestDeviceR1", - "test100" + "test100", + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" ] }, - "rack_Test_Rack": { + "location_parent_test_location": { "hosts": [ - "TestDeviceR1" + "R1-Device", + "Test Nexus One", + "TestDeviceR1", + "test100", + "test100-vm", + "test101-vm", + "test102-vm", + "test103-vm" ] }, - "rack_Test_Rack_Site_2": { + "manufacturer_cisco": { "hosts": [ - "R1-Device" + "R1-Device", + "Test Nexus One", + "TestDeviceR1", + "test100" ] }, - "rack_group_parent_rack_group": { + "rack_group_child_rack_group": { "hosts": [ "TestDeviceR1" ] }, - "rack_group_test_rack_group": { + "rack_group_parent_rack_group": { "hosts": [ + "R1-Device", "TestDeviceR1" ] }, - "rack_role_test_rack_role": { + "rack_main_test_rack": { "hosts": [ "R1-Device" ] }, - "region_parent_region": { - "children": [ - "region_test_region" + "rack_role_test_rack_role": { + "hosts": [ + "R1-Device" ] }, - "region_test_region": { - "children": [ - "site_test_site" + "rack_sub_test_rack": { + "hosts": [ + "TestDeviceR1" ] }, "role_core_switch": { @@ -879,22 +2192,6 @@ "Test Nexus One" ] }, - "site_test_site": { - "hosts": [ - "Test Nexus One", - "TestDeviceR1", - "test100", - "test100-vm", - "test101-vm", - "test102-vm", - "test103-vm" - ] - }, - "site_test_site2": { - "hosts": [ - "R1-Device" - ] - }, "status_active": { "hosts": [ "R1-Device", diff --git a/tests/integration/targets/inventory/files/test-inventory.yml b/tests/integration/targets/inventory/files/test-inventory.yml index 4954836f..9dbdf06d 100644 --- a/tests/integration/targets/inventory/files/test-inventory.yml +++ b/tests/integration/targets/inventory/files/test-inventory.yml @@ -9,7 +9,7 @@ interfaces: True services: True group_by: - - site + - location - tenant - rack - rack_group @@ -19,7 +19,6 @@ group_by: - device_type - manufacturer - platform - - region - cluster - cluster_group - cluster_type diff --git a/tests/integration/targets/latest/tasks/aggregate.yml b/tests/integration/targets/latest/tasks/aggregate.yml deleted file mode 100644 index be4bed82..00000000 --- a/tests/integration/targets/latest/tasks/aggregate.yml +++ /dev/null @@ -1,114 +0,0 @@ ---- -## -## -### PYNAUTOBOT_AGGEGATE -## -## -- set_fact: - rir: "{{ lookup('networktocode.nautobot.lookup', 'rirs', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=example-rir') }}" - schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" - -- name: "AGGREGATE 1: Necessary info creation" - networktocode.nautobot.aggregate: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - prefix: "10.0.0.0/8" - rir: "Example RIR" - state: present - register: test_one - -- name: "AGGREGATE 1: ASSERT - Necessary info creation" - assert: - that: - - test_one is changed - - test_one['diff']['before']['state'] == "absent" - - test_one['diff']['after']['state'] == "present" - - test_one['aggregate']['prefix'] == "10.0.0.0/8" - - test_one['aggregate']['family'] == 4 - - test_one['aggregate']['rir'] == rir['key'] - - test_one['msg'] == "aggregate 10.0.0.0/8 created" - -- name: "AGGREGATE 2: Create duplicate" - networktocode.nautobot.aggregate: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - prefix: "10.0.0.0/8" - state: present - register: test_two - -- name: "AGGREGATE 2: ASSERT - Create duplicate" - assert: - that: - - not test_two['changed'] - - test_two['aggregate']['prefix'] == "10.0.0.0/8" - - test_two['aggregate']['family'] == 4 - - test_two['aggregate']['rir'] == rir['key'] - - test_two['msg'] == "aggregate 10.0.0.0/8 already exists" - -- name: "AGGREGATE 3: ASSERT - Update" - networktocode.nautobot.aggregate: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - prefix: "10.0.0.0/8" - rir: "Example RIR" - date_added: "1989-01-18" - description: "Test Description" - tags: - - "Schnozzberry" - state: present - register: test_three - -- name: "AGGREGATE 3: ASSERT - Updated" - assert: - that: - - test_three is changed - - test_three['diff']['after']['date_added'] == "1989-01-18" - - test_three['diff']['after']['description'] == "Test Description" - - test_three['diff']['after']['tags'][0] == schnozzberry['key'] - - test_three['aggregate']['prefix'] == "10.0.0.0/8" - - test_three['aggregate']['family'] == 4 - - test_three['aggregate']['rir'] == rir['key'] - - test_three['aggregate']['date_added'] == "1989-01-18" - - test_three['aggregate']['description'] == "Test Description" - - test_three['aggregate']['tags'][0] == schnozzberry['key'] - - test_three['msg'] == "aggregate 10.0.0.0/8 updated" - -- name: "AGGREGATE 4: ASSERT - Delete" - networktocode.nautobot.aggregate: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - prefix: "10.0.0.0/8" - state: absent - register: test_four - -- name: "AGGREGATE 4: ASSERT - Delete" - assert: - that: - - test_four is changed - - test_four['aggregate']['prefix'] == "10.0.0.0/8" - - test_four['aggregate']['family'] == 4 - - test_four['aggregate']['rir'] == rir['key'] - - test_four['aggregate']['date_added'] == "1989-01-18" - - test_four['aggregate']['description'] == "Test Description" - - test_four['aggregate']['tags'][0] == schnozzberry['key'] - - test_four['msg'] == "aggregate 10.0.0.0/8 deleted" - -- name: "AGGREGATE 5: Necessary info creation" - networktocode.nautobot.aggregate: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - prefix: "2001::/32" - rir: "Example RIR" - state: present - register: test_five - -- name: "AGGREGATE 5: ASSERT - Necessary info creation" - assert: - that: - - test_five is changed - - test_five['diff']['before']['state'] == "absent" - - test_five['diff']['after']['state'] == "present" - - test_five['aggregate']['prefix'] == "2001::/32" - - test_five['aggregate']['family'] == 6 - - test_five['aggregate']['rir'] == rir['key'] - - test_five['msg'] == "aggregate 2001::/32 created" diff --git a/tests/integration/targets/latest/tasks/cable.yml b/tests/integration/targets/latest/tasks/cable.yml index efc8fc86..6d9d849a 100644 --- a/tests/integration/targets/latest/tasks/cable.yml +++ b/tests/integration/targets/latest/tasks/cable.yml @@ -10,6 +10,7 @@ - set_fact: nexus_parent_intf: '{{ lookup(''networktocode.nautobot.lookup'', ''interfaces'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''device="Test Nexus One" name="Ethernet1/1"'') }}' nexus_child_intf: '{{ lookup(''networktocode.nautobot.lookup'', ''interfaces'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''device="Test Nexus Child One" name="Ethernet2/1"'') }}' + planned: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Planned') }}" - name: "CABLE 1: Necessary info creation" networktocode.nautobot.cable: @@ -23,7 +24,7 @@ termination_b: device: Test Nexus Child One name: Ethernet2/1 - status: "connected" + status: "Connected" state: present register: test_one @@ -51,7 +52,7 @@ termination_b: device: Test Nexus Child One name: Ethernet2/1 - status: "connected" + status: "Connected" state: present register: test_two @@ -78,7 +79,7 @@ device: Test Nexus Child One name: Ethernet2/1 type: mmf-om4 - status: planned + status: Planned label: label123 color: abcdef length: 30 @@ -91,7 +92,7 @@ that: - test_three is changed - test_three['diff']['after']['type'] == "mmf-om4" - - test_three['diff']['after']['status'] == "planned" + - test_three['diff']['after']['status'] == planned['key'] - test_three['diff']['after']['label'] == "label123" - test_three['diff']['after']['color'] == "abcdef" - test_three['diff']['after']['length'] == 30 @@ -101,7 +102,7 @@ - test_three['cable']['termination_b_type'] == "dcim.interface" - test_three['cable']['termination_b_id'] == nexus_child_intf['key'] - test_three['cable']['type'] == "mmf-om4" - - test_three['cable']['status'] == "planned" + - test_three['cable']['status'] == planned['key'] - test_three['cable']['label'] == "label123" - test_three['cable']['color'] == "abcdef" - test_three['cable']['length'] == 30 @@ -143,7 +144,7 @@ termination_b: name: Test Console Port device: test100 - status: "connected" + status: "Connected" state: present register: test_five @@ -174,7 +175,7 @@ termination_b: device: "test100" name: "GigabitEthernet2" - status: "connected" + status: "Connected" state: present register: test_six @@ -193,5 +194,5 @@ - test_six['cable']['termination_b_id'] == interface['key'] - test_six['msg'] == "cable circuits.circuittermination Test Circuit Two <> dcim.interface GigabitEthernet2 created" vars: - circuit_termination: "{{ lookup('networktocode.nautobot.lookup', 'circuit-terminations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='circuit_id=' ~ circuit['key'] ~ ' term_side=A') }}" + circuit_termination: "{{ lookup('networktocode.nautobot.lookup', 'circuit-terminations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='circuit=' ~ circuit['key'] ~ ' term_side=A') }}" interface: '{{ lookup(''networktocode.nautobot.lookup'', ''interfaces'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''device="test100" name="GigabitEthernet2"'') }}' diff --git a/tests/integration/targets/latest/tasks/circuit.yml b/tests/integration/targets/latest/tasks/circuit.yml index 16e1ff1b..8c4d854e 100644 --- a/tests/integration/targets/latest/tasks/circuit.yml +++ b/tests/integration/targets/latest/tasks/circuit.yml @@ -5,9 +5,10 @@ ## ## - set_fact: - provider: "{{ lookup('networktocode.nautobot.lookup', 'circuit-providers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-provider') }}" - type: "{{ lookup('networktocode.nautobot.lookup', 'circuit-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-circuit-type') }}" - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" + provider: "{{ lookup('networktocode.nautobot.lookup', 'circuit-providers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Provider\"') }}" + type: "{{ lookup('networktocode.nautobot.lookup', 'circuit-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Circuit Type\"') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + planned: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Planned') }}" - name: "PYNAUTOBOT_CIRCUIT 1: Create provider within Nautobot with only required information" networktocode.nautobot.circuit: @@ -28,7 +29,7 @@ - test_one['diff']['after']['state'] == "present" - test_one['circuit']['cid'] == "Test Circuit One" - test_one['circuit']['provider'] == provider['key'] - - test_one['circuit']['type'] == type['key'] + - test_one['circuit']['circuit_type'] == type['key'] - test_one['msg'] == "circuit Test Circuit One created" - name: "PYNAUTOBOT_CIRCUIT 2: Duplicate" @@ -48,7 +49,7 @@ - not test_two['changed'] - test_two['circuit']['cid'] == "Test Circuit One" - test_two['circuit']['provider'] == provider['key'] - - test_two['circuit']['type'] == type['key'] + - test_two['circuit']['circuit_type'] == type['key'] - test_two['msg'] == "circuit Test Circuit One already exists" - name: "PYNAUTOBOT_CIRCUIT 3: Update provider with other fields" @@ -62,7 +63,7 @@ tenant: Test Tenant install_date: "2018-12-25" commit_rate: 10000 - description: "Test circuit " + description: "Test circuit" comments: "FAST CIRCUIT" state: present register: test_three @@ -71,7 +72,7 @@ assert: that: - test_three is changed - - test_three['diff']['after']['status'] == "planned" + - test_three['diff']['after']['status'] == planned['key'] - test_three['diff']['after']['tenant'] == tenant['key'] - test_three['diff']['after']['install_date'] == "2018-12-25" - test_three['diff']['after']['commit_rate'] == 10000 @@ -79,8 +80,8 @@ - test_three['diff']['after']['comments'] == "FAST CIRCUIT" - test_three['circuit']['cid'] == "Test Circuit One" - test_three['circuit']['provider'] == provider['key'] - - test_three['circuit']['type'] == type['key'] - - test_three['circuit']['status'] == "planned" + - test_three['circuit']['circuit_type'] == type['key'] + - test_three['circuit']['status'] == planned['key'] - test_three['circuit']['tenant'] == tenant['key'] - test_three['circuit']['install_date'] == "2018-12-25" - test_three['circuit']['commit_rate'] == 10000 @@ -102,8 +103,8 @@ - test_four is changed - test_four['circuit']['cid'] == "Test Circuit One" - test_four['circuit']['provider'] == provider['key'] - - test_four['circuit']['type'] == type['key'] - - test_four['circuit']['status'] == "planned" + - test_four['circuit']['circuit_type'] == type['key'] + - test_four['circuit']['status'] == planned['key'] - test_four['circuit']['tenant'] == tenant['key'] - test_four['circuit']['install_date'] == "2018-12-25" - test_four['circuit']['commit_rate'] == 10000 diff --git a/tests/integration/targets/latest/tasks/circuit_termination.yml b/tests/integration/targets/latest/tasks/circuit_termination.yml index 607b2b84..64439a40 100644 --- a/tests/integration/targets/latest/tasks/circuit_termination.yml +++ b/tests/integration/targets/latest/tasks/circuit_termination.yml @@ -5,7 +5,7 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" circuit: '{{ lookup(''networktocode.nautobot.lookup'', ''circuits'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''cid="Test Circuit"'') }}' circuit2: '{{ lookup(''networktocode.nautobot.lookup'', ''circuits'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''cid="Test Circuit Two"'') }}' provider_network: '{{ lookup(''networktocode.nautobot.lookup'', ''provider_networks'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Provider Network"'') }}' @@ -16,7 +16,7 @@ token: "{{ nautobot_token }}" circuit: Test Circuit term_side: A - site: "Test Site" + location: "{{ test_location['key'] }}" port_speed: 10000 state: present register: test_one @@ -29,7 +29,7 @@ - test_one['diff']['after']['state'] == "present" - test_one['circuit_termination']['circuit'] == circuit['key'] - test_one['circuit_termination']['term_side'] == "A" - - test_one['circuit_termination']['site'] == test_site['key'] + - test_one['circuit_termination']['location'] == test_location['key'] - test_one['circuit_termination']['port_speed'] == 10000 - test_one['msg'] == "circuit_termination test_circuit_a created" @@ -48,7 +48,7 @@ - not test_two['changed'] - test_two['circuit_termination']['circuit'] == circuit['key'] - test_two['circuit_termination']['term_side'] == "A" - - test_two['circuit_termination']['site'] == test_site['key'] + - test_two['circuit_termination']['location'] == test_location['key'] - test_two['circuit_termination']['port_speed'] == 10000 - test_two['msg'] == "circuit_termination test_circuit_a already exists" @@ -75,7 +75,7 @@ - test_three['diff']['after']['description'] == "Test description" - test_three['circuit_termination']['circuit'] == circuit['key'] - test_three['circuit_termination']['term_side'] == "A" - - test_three['circuit_termination']['site'] == test_site['key'] + - test_three['circuit_termination']['location'] == test_location['key'] - test_three['circuit_termination']['port_speed'] == 10000 - test_three['circuit_termination']['upstream_speed'] == 1000 - test_three['circuit_termination']['xconnect_id'] == "10X100" @@ -89,7 +89,7 @@ token: "{{ nautobot_token }}" circuit: Test Circuit term_side: Z - site: "Test Site" + location: "{{ test_location['key'] }}" port_speed: 10000 state: present register: test_four @@ -102,7 +102,7 @@ - test_four['diff']['after']['state'] == "present" - test_four['circuit_termination']['circuit'] == circuit['key'] - test_four['circuit_termination']['term_side'] == "Z" - - test_four['circuit_termination']['site'] == test_site['key'] + - test_four['circuit_termination']['location'] == test_location['key'] - test_four['circuit_termination']['port_speed'] == 10000 - test_four['msg'] == "circuit_termination test_circuit_z created" @@ -149,7 +149,7 @@ - test_six is changed - test_six['circuit_termination']['circuit'] == circuit['key'] - test_six['circuit_termination']['term_side'] == "A" - - test_six['circuit_termination']['site'] == test_site['key'] + - test_six['circuit_termination']['location'] == test_location['key'] - test_six['circuit_termination']['port_speed'] == 10000 - test_six['circuit_termination']['upstream_speed'] == 1000 - test_six['circuit_termination']['xconnect_id'] == "10X100" diff --git a/tests/integration/targets/latest/tasks/circuit_type.yml b/tests/integration/targets/latest/tasks/circuit_type.yml index 4a7c3ba7..12696fab 100644 --- a/tests/integration/targets/latest/tasks/circuit_type.yml +++ b/tests/integration/targets/latest/tasks/circuit_type.yml @@ -19,7 +19,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['circuit_type']['name'] == "Test Circuit Type One" - - test_one['circuit_type']['slug'] == "test-circuit-type-one" - test_one['msg'] == "circuit_type Test Circuit Type One created" - name: "CIRCUIT_TYPE 2: Create duplicate" @@ -35,27 +34,25 @@ that: - not test_two['changed'] - test_two['circuit_type']['name'] == "Test Circuit Type One" - - test_two['circuit_type']['slug'] == "test-circuit-type-one" - test_two['msg'] == "circuit_type Test Circuit Type One already exists" -- name: "CIRCUIT_TYPE 3: User specified slug" +- name: "CIRCUIT_TYPE 3: Update" networktocode.nautobot.circuit_type: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - name: "Test Circuit Type Two" - slug: "test-circuit-type-2" + name: "Test Circuit Type One" + description: "Test Description" state: present register: test_three -- name: "CIRCUIT_TYPE 3: ASSERT - User specified slug" +- name: "CIRCUIT_TYPE 3: ASSERT - Update" assert: that: - test_three is changed - - test_three['diff']['before']['state'] == "absent" - - test_three['diff']['after']['state'] == "present" - - test_three['circuit_type']['name'] == "Test Circuit Type Two" - - test_three['circuit_type']['slug'] == "test-circuit-type-2" - - test_three['msg'] == "circuit_type Test Circuit Type Two created" + - test_three['diff']['after']['description'] == "Test Description" + - test_three['circuit_type']['name'] == "Test Circuit Type One" + - test_three['circuit_type']['description'] == "Test Description" + - test_three['msg'] == "circuit_type Test Circuit Type One updated" - name: "CIRCUIT_TYPE 4: ASSERT - Delete" networktocode.nautobot.circuit_type: @@ -70,22 +67,5 @@ that: - test_four is changed - test_four['circuit_type']['name'] == "Test Circuit Type One" - - test_four['circuit_type']['slug'] == "test-circuit-type-one" + - test_four['circuit_type']['description'] == "Test Description" - test_four['msg'] == "circuit_type Test Circuit Type One deleted" - -- name: "CIRCUIT_TYPE 5: ASSERT - Delete" - networktocode.nautobot.circuit_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Circuit Type Two" - slug: "test-circuit-type-2" - state: absent - register: test_five - -- name: "CIRCUIT_TYPE 5: ASSERT - Delete" - assert: - that: - - test_five is changed - - test_five['circuit_type']['name'] == "Test Circuit Type Two" - - test_five['circuit_type']['slug'] == "test-circuit-type-2" - - test_five['msg'] == "circuit_type Test Circuit Type Two deleted" diff --git a/tests/integration/targets/latest/tasks/cluster.yml b/tests/integration/targets/latest/tasks/cluster.yml index a2537c53..da797c4d 100644 --- a/tests/integration/targets/latest/tasks/cluster.yml +++ b/tests/integration/targets/latest/tasks/cluster.yml @@ -5,11 +5,11 @@ ## ## - set_fact: - test_cluster_type: "{{ lookup('networktocode.nautobot.lookup', 'cluster-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-cluster-type') }}" - test_cluster_group: "{{ lookup('networktocode.nautobot.lookup', 'cluster-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-cluster-group') }}" - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" + test_cluster_type: "{{ lookup('networktocode.nautobot.lookup', 'cluster-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Cluster Type\"') }}" + test_cluster_group: "{{ lookup('networktocode.nautobot.lookup', 'cluster-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Cluster Group\"') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" - name: "CLUSTER 1: Necessary info creation" networktocode.nautobot.cluster: @@ -27,7 +27,7 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['cluster']['name'] == "Test Cluster One" - - test_one['cluster']['type'] == test_cluster_type['key'] + - test_one['cluster']['cluster_type'] == test_cluster_type['key'] - test_one['msg'] == "cluster Test Cluster One created" - name: "CLUSTER 2: Create duplicate" @@ -44,7 +44,7 @@ that: - not test_two['changed'] - test_two['cluster']['name'] == "Test Cluster One" - - test_two['cluster']['type'] == test_cluster_type['key'] + - test_two['cluster']['cluster_type'] == test_cluster_type['key'] - test_two['msg'] == "cluster Test Cluster One already exists" - name: "CLUSTER 3: Update" @@ -54,7 +54,7 @@ name: "Test Cluster One" cluster_type: "Test Cluster Type" cluster_group: "Test Cluster Group" - site: "Test Site" + location: "{{ test_location['key'] }}" comments: "Updated cluster" tenant: "Test Tenant" tags: @@ -66,15 +66,15 @@ assert: that: - test_three is changed - - test_three['diff']['after']['group'] == test_cluster_group['key'] - - test_three['diff']['after']['site'] == test_site['key'] + - test_three['diff']['after']['cluster_group'] == test_cluster_group['key'] + - test_three['diff']['after']['location'] == test_location['key'] - test_three['diff']['after']['comments'] == "Updated cluster" - test_three['diff']['after']['tags'][0] == tag_schnozzberry['key'] - test_three['diff']['after']['tenant'] == tenant['key'] - test_three['cluster']['name'] == "Test Cluster One" - - test_three['cluster']['type'] == test_cluster_type['key'] - - test_three['cluster']['group'] == test_cluster_group['key'] - - test_three['cluster']['site'] == test_site['key'] + - test_three['cluster']['cluster_type'] == test_cluster_type['key'] + - test_three['cluster']['cluster_group'] == test_cluster_group['key'] + - test_three['cluster']['location'] == test_location['key'] - test_three['cluster']['comments'] == "Updated cluster" - test_three['cluster']['tags'][0] == tag_schnozzberry['key'] - test_three['cluster']['tenant'] == tenant['key'] @@ -93,9 +93,9 @@ that: - test_four is changed - test_four['cluster']['name'] == "Test Cluster One" - - test_four['cluster']['type'] == test_cluster_type['key'] - - test_four['cluster']['group'] == test_cluster_group['key'] - - test_four['cluster']['site'] == test_site['key'] + - test_four['cluster']['cluster_type'] == test_cluster_type['key'] + - test_four['cluster']['cluster_group'] == test_cluster_group['key'] + - test_four['cluster']['location'] == test_location['key'] - test_four['cluster']['comments'] == "Updated cluster" - test_four['cluster']['tags'][0] == tag_schnozzberry['key'] - test_four['msg'] == "cluster Test Cluster One deleted" diff --git a/tests/integration/targets/latest/tasks/cluster_group.yml b/tests/integration/targets/latest/tasks/cluster_group.yml index d669ef07..89817178 100644 --- a/tests/integration/targets/latest/tasks/cluster_group.yml +++ b/tests/integration/targets/latest/tasks/cluster_group.yml @@ -19,7 +19,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['cluster_group']['name'] == "Test Cluster Group One" - - test_one['cluster_group']['slug'] == "test-cluster-group-one" - test_one['msg'] == "cluster_group Test Cluster Group One created" - name: "CLUSTER_GROUP 2: Create duplicate" @@ -35,29 +34,27 @@ that: - not test_two['changed'] - test_two['cluster_group']['name'] == "Test Cluster Group One" - - test_two['cluster_group']['slug'] == "test-cluster-group-one" - test_two['msg'] == "cluster_group Test Cluster Group One already exists" -- name: "CLUSTER_GROUP 3: User specified slug" +- name: "CLUSTER_GROUP 3: Update" networktocode.nautobot.cluster_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - name: "Test Cluster Group Two" - slug: "test-cluster-group-2" + name: "Test Cluster Group One" + description: "Test Description" state: present register: test_three -- name: "CLUSTER_GROUP 3: ASSERT - User specified slug" +- name: "CLUSTER_GROUP 3: ASSERT - Update" assert: that: - - test_three is changed - - test_three['diff']['before']['state'] == "absent" - - test_three['diff']['after']['state'] == "present" - - test_three['cluster_group']['name'] == "Test Cluster Group Two" - - test_three['cluster_group']['slug'] == "test-cluster-group-2" - - test_three['msg'] == "cluster_group Test Cluster Group Two created" + - test_three['changed'] + - test_three['diff']['after']['description'] == "Test Description" + - test_three['cluster_group']['name'] == "Test Cluster Group One" + - test_three['cluster_group']['description'] == "Test Description" + - test_three['msg'] == "cluster_group Test Cluster Group One updated" -- name: "CLUSTER_GROUP 4: ASSERT - Delete" +- name: "CLUSTER_GROUP 4: Delete" networktocode.nautobot.cluster_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" @@ -70,22 +67,5 @@ that: - test_four is changed - test_four['cluster_group']['name'] == "Test Cluster Group One" - - test_four['cluster_group']['slug'] == "test-cluster-group-one" + - test_four['cluster_group']['description'] == "Test Description" - test_four['msg'] == "cluster_group Test Cluster Group One deleted" - -- name: "CLUSTER_GROUP 5: ASSERT - Delete" - networktocode.nautobot.cluster_group: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Cluster Group Two" - slug: "test-cluster-group-2" - state: absent - register: test_five - -- name: "CLUSTER_GROUP 5: ASSERT - Delete" - assert: - that: - - test_five is changed - - test_five['cluster_group']['name'] == "Test Cluster Group Two" - - test_five['cluster_group']['slug'] == "test-cluster-group-2" - - test_five['msg'] == "cluster_group Test Cluster Group Two deleted" diff --git a/tests/integration/targets/latest/tasks/cluster_type.yml b/tests/integration/targets/latest/tasks/cluster_type.yml index f68012b0..dbd65e5d 100644 --- a/tests/integration/targets/latest/tasks/cluster_type.yml +++ b/tests/integration/targets/latest/tasks/cluster_type.yml @@ -18,7 +18,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['cluster_type']['name'] == "Test Cluster Type One" - - test_one['cluster_type']['slug'] == "test-cluster-type-one" - test_one['msg'] == "cluster_type Test Cluster Type One created" - name: "CLUSTER_TYPE 2: Create duplicate" @@ -34,27 +33,25 @@ that: - not test_two['changed'] - test_two['cluster_type']['name'] == "Test Cluster Type One" - - test_two['cluster_type']['slug'] == "test-cluster-type-one" - test_two['msg'] == "cluster_type Test Cluster Type One already exists" -- name: "CLUSTER_TYPE 3: User specified slug" +- name: "CLUSTER_TYPE 3: Update" networktocode.nautobot.cluster_type: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - name: "Test Cluster Type Two" - slug: "test-cluster-type-2" + name: "Test Cluster Type One" + description: "Test Description" state: present register: test_three -- name: "CLUSTER_TYPE 3: ASSERT - User specified slug" +- name: "CLUSTER_TYPE 3: ASSERT - Update" assert: that: - test_three is changed - - test_three['diff']['before']['state'] == "absent" - - test_three['diff']['after']['state'] == "present" - - test_three['cluster_type']['name'] == "Test Cluster Type Two" - - test_three['cluster_type']['slug'] == "test-cluster-type-2" - - test_three['msg'] == "cluster_type Test Cluster Type Two created" + - test_three['diff']['after']['description'] == "Test Description" + - test_three['cluster_type']['name'] == "Test Cluster Type One" + - test_three['cluster_type']['description'] == "Test Description" + - test_three['msg'] == "cluster_type Test Cluster Type One updated" - name: "CLUSTER_TYPE 4: ASSERT - Delete" networktocode.nautobot.cluster_type: @@ -69,22 +66,5 @@ that: - test_four is changed - test_four['cluster_type']['name'] == "Test Cluster Type One" - - test_four['cluster_type']['slug'] == "test-cluster-type-one" + - test_four['cluster_type']['description'] == "Test Description" - test_four['msg'] == "cluster_type Test Cluster Type One deleted" - -- name: "CLUSTER_TYPE 5: ASSERT - Delete" - networktocode.nautobot.cluster_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Cluster Type Two" - slug: "test-cluster-type-2" - state: absent - register: test_five - -- name: "CLUSTER_TYPE 5: ASSERT - Delete" - assert: - that: - - test_five is changed - - test_five['cluster_type']['name'] == "Test Cluster Type Two" - - test_five['cluster_type']['slug'] == "test-cluster-type-2" - - test_five['msg'] == "cluster_type Test Cluster Type Two deleted" diff --git a/tests/integration/targets/latest/tasks/console_port_template.yml b/tests/integration/targets/latest/tasks/console_port_template.yml index f2db9158..7dca20f6 100644 --- a/tests/integration/targets/latest/tasks/console_port_template.yml +++ b/tests/integration/targets/latest/tasks/console_port_template.yml @@ -8,7 +8,7 @@ ## ## - set_fact: - cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco-test') }}" + cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Cisco Test\"') }}" - name: "CONSOLE_PORT_TEMPLATE 1: Necessary info creation" networktocode.nautobot.console_port_template: diff --git a/tests/integration/targets/latest/tasks/console_server_port_template.yml b/tests/integration/targets/latest/tasks/console_server_port_template.yml index f073a030..93a35c7c 100644 --- a/tests/integration/targets/latest/tasks/console_server_port_template.yml +++ b/tests/integration/targets/latest/tasks/console_server_port_template.yml @@ -8,7 +8,7 @@ ## ## - set_fact: - cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco-test') }}" + cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Cisco Test\"') }}" - name: "CONSOLE_SERVER_PORT_TEMPLATE 1: Necessary info creation" networktocode.nautobot.console_server_port_template: diff --git a/tests/integration/targets/latest/tasks/device.yml b/tests/integration/targets/latest/tasks/device.yml index a001e116..bb6a5b40 100644 --- a/tests/integration/targets/latest/tasks/device.yml +++ b/tests/integration/targets/latest/tasks/device.yml @@ -5,10 +5,13 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - device_type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco-test') }}" - device_role: "{{ lookup('networktocode.nautobot.lookup', 'device-roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=core-switch') }}" + parent_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Parent Test Location\"') }}" + child_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + device_type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Cisco Test\"') }}" + role: "{{ lookup('networktocode.nautobot.lookup', 'roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Core Switch\"') }}" vc1: "{{ lookup('networktocode.nautobot.lookup', 'virtual-chassis', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=VC1') }}" + staged: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Staged') }}" + active: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Active') }}" - name: "1 - Device with required information" networktocode.nautobot.device: @@ -17,8 +20,8 @@ name: "R1" device_type: id: "{{ device_type['key'] }}" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ parent_location['key'] }}" status: "Staged" state: present register: test_one @@ -30,21 +33,41 @@ - test_one['diff']['before']['state'] == 'absent' - test_one['diff']['after']['state'] == 'present' - test_one['device']['name'] == "R1" - - test_one['device']['device_role'] == device_role['key'] + - test_one['device']['role'] == role['key'] - test_one['device']['device_type'] == device_type['key'] - - test_one['device']['site'] == test_site['key'] - - test_one['device']['status'] == "staged" + - test_one['device']['location'] == parent_location['key'] + - test_one['device']['status'] == staged['key'] - test_one['device']['name'] == "R1" - test_one['msg'] == "device R1 created" +- name: "1.1 - Device with location not as UUID" + networktocode.nautobot.device: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: "R11" + device_type: + id: "{{ device_type['key'] }}" + role: "Core Switch" + location: Parent Test Location + status: "Staged" + state: present + register: test_one_one + ignore_errors: true + +- name: "1.1 - ASSERT" + assert: + that: + - test_one_one is failed + - test_one_one['msg'] == "Location needs a valid UUID" + - name: "2 - Duplicate device" networktocode.nautobot.device: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "R1" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ parent_location['key'] }}" status: "Staged" state: present register: test_two @@ -54,10 +77,10 @@ that: - not test_two['changed'] - test_two['device']['name'] == "R1" - - test_two['device']['device_role'] == device_role['key'] + - test_two['device']['role'] == role['key'] - test_two['device']['device_type'] == device_type['key'] - - test_two['device']['site'] == test_site['key'] - - test_two['device']['status'] == "staged" + - test_two['device']['location'] == parent_location['key'] + - test_two['device']['status'] == staged['key'] - test_two['msg'] == "device R1 already exists" - name: "3 - Update device" @@ -67,7 +90,7 @@ name: "R1" serial: "FXS1001" status: "Staged" - local_context_data: + local_config_context_data: bgp_as: "65412" virtual_chassis: "VC1" vc_position: 3 @@ -80,17 +103,17 @@ that: - test_three is changed - test_three['diff']['after']['serial'] == "FXS1001" - - test_three['diff']['after']['local_context_data']["bgp_as"] == "65412" + - test_three['diff']['after']['local_config_context_data']["bgp_as"] == "65412" - test_three['diff']['after']['virtual_chassis'] == vc1['key'] - test_three['diff']['after']['vc_position'] == 3 - test_three['diff']['after']['vc_priority'] == 15 - test_three['device']['name'] == "R1" - - test_three['device']['device_role'] == device_role['key'] + - test_three['device']['role'] == role['key'] - test_three['device']['device_type'] == device_type['key'] - - test_three['device']['site'] == test_site['key'] - - test_three['device']['status'] == "staged" + - test_three['device']['location'] == parent_location['key'] + - test_three['device']['status'] == staged['key'] - test_three['device']['serial'] == "FXS1001" - - test_three['device']['local_context_data']["bgp_as"] == "65412" + - test_three['device']['local_config_context_data']["bgp_as"] == "65412" - test_three['device']['virtual_chassis'] == vc1['key'] - test_three['device']['vc_position'] == 3 - test_three['device']['vc_priority'] == 15 @@ -113,28 +136,34 @@ that: - test_three_dot_one is changed - test_three_dot_one['diff']['after']['name'] == "R1-changed-name" - - test_three_dot_one['device']['device_role'] == device_role['key'] + - test_three_dot_one['device']['role'] == role['key'] - test_three_dot_one['device']['device_type'] == device_type['key'] - - test_three_dot_one['device']['site'] == test_site['key'] - - test_three_dot_one['device']['status'] == "staged" + - test_three_dot_one['device']['location'] == parent_location['key'] + - test_three_dot_one['device']['status'] == staged['key'] - test_three_dot_one['device']['serial'] == "FXS1001" - - test_three_dot_one['device']['local_context_data']["bgp_as"] == "65412" - test_three_dot_one['msg'] == "device R1-changed-name updated" +- name: "3.11 - ASSERT" + assert: + that: + - device['value']['local_config_context_data']["bgp_as"] == "65412" + vars: + device: "{{ lookup('networktocode.nautobot.lookup', 'devices', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=R1-changed-name') }}" + - name: "4 - Create device with tags and assign to rack" networktocode.nautobot.device: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "TestR1" device_type: "1841" - device_role: "Core Switch" - site: "Test Site2" - rack: "Test Rack Site 2" + role: "Core Switch" + location: "{{ child_location['key'] }}" + rack: "Main Test Rack" status: "Active" position: 35 face: "Front" tags: - - "schnozzberry" + - "Schnozzberry" tenant: "Test Tenant" asset_tag: "1234" state: present @@ -147,21 +176,20 @@ - test_four['diff']['before']['state'] == "absent" - test_four['diff']['after']['state'] == "present" - test_four['device']['name'] == "TestR1" - - test_four['device']['device_role'] == device_role['key'] + - test_four['device']['role'] == role['key'] - test_four['device']['device_type'] == type['key'] - - test_four['device']['site'] == site['key'] - - test_four['device']['status'] == "active" + - test_four['device']['location'] == child_location['key'] + - test_four['device']['status'] == active['key'] - test_four['device']['rack'] == rack['key'] - test_four['device']['tags'][0] == schnozzberry['key'] - test_four['device']['tenant'] == tenant['key'] - test_four['device']['asset_tag'] == '1234' - test_four['msg'] == "device TestR1 created" vars: - site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site2') }}" - rack: '{{ lookup(''networktocode.nautobot.lookup'', ''racks'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Rack Site 2"'') }}' - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=1841') }}" - schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" + rack: "{{ lookup('networktocode.nautobot.lookup', 'racks', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Main Test Rack\"') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=1841') }}" + schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" - name: "5 - Delete previous device" networktocode.nautobot.device: @@ -219,10 +247,10 @@ - test_seven['diff']['after']['primary_ip4'] == ip4['key'] - test_seven['diff']['after']['primary_ip6'] == ip6['key'] - test_seven['device']['name'] == "test100" - - test_seven['device']['device_role'] == device_role['key'] + - test_seven['device']['role'] == role['key'] - test_seven['device']['device_type'] == device_type['key'] - - test_seven['device']['site'] == test_site['key'] - - test_seven['device']['status'] == "active" + - test_seven['device']['location'] == child_location['key'] + - test_seven['device']['status'] == active['key'] - test_seven['device']['primary_ip4'] == ip4['key'] - test_seven['device']['primary_ip6'] == ip6['key'] - test_seven['msg'] == "device test100 updated" @@ -234,8 +262,8 @@ name: "" device_type: id: "{{ device_type['key'] }}" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ parent_location['key'] }}" status: "Staged" state: present register: test_eight @@ -246,9 +274,9 @@ - test_eight is changed - test_eight['diff']['before']['state'] == 'absent' - test_eight['diff']['after']['state'] == 'present' - - test_eight['device']['device_role'] == device_role['key'] + - test_eight['device']['role'] == role['key'] - test_eight['device']['device_type'] == device_type['key'] - - test_eight['device']['site'] == test_site['key'] - - test_eight['device']['status'] == "staged" + - test_eight['device']['location'] == parent_location['key'] + - test_eight['device']['status'] == staged['key'] - "'-' in test_eight['device']['name']" - "test_eight['device']['name'] | length == 36" diff --git a/tests/integration/targets/latest/tasks/device_bay.yml b/tests/integration/targets/latest/tasks/device_bay.yml index abc3f262..71f9534e 100644 --- a/tests/integration/targets/latest/tasks/device_bay.yml +++ b/tests/integration/targets/latest/tasks/device_bay.yml @@ -7,7 +7,7 @@ - set_fact: nexus_parent: '{{ lookup(''networktocode.nautobot.lookup'', ''devices'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Nexus One"'') }}' nexus_child: '{{ lookup(''networktocode.nautobot.lookup'', ''devices'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Nexus Child One"'') }}' - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" - name: "DEVICE_BAY 1: Necessary info creation" networktocode.nautobot.device_bay: diff --git a/tests/integration/targets/latest/tasks/device_bay_template.yml b/tests/integration/targets/latest/tasks/device_bay_template.yml index f918dcd9..f30c6d48 100644 --- a/tests/integration/targets/latest/tasks/device_bay_template.yml +++ b/tests/integration/targets/latest/tasks/device_bay_template.yml @@ -5,7 +5,7 @@ ## ## - set_fact: - nexus_parent: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=nexus-parent') }}" + nexus_parent: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Nexus Parent\"') }}" - name: "DEVICE_BAY_TEMPLATE 1: Necessary info creation" networktocode.nautobot.device_bay_template: diff --git a/tests/integration/targets/latest/tasks/device_interface.yml b/tests/integration/targets/latest/tasks/device_interface.yml index 22d1f8e7..f3645bdd 100644 --- a/tests/integration/targets/latest/tasks/device_interface.yml +++ b/tests/integration/targets/latest/tasks/device_interface.yml @@ -6,13 +6,15 @@ ## - set_fact: test100: "{{ lookup('networktocode.nautobot.lookup', 'devices', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=test100') }}" + child_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" - name: "1 - Interface with required information" networktocode.nautobot.device_interface: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: test100 - name: GigabitEthernet3 + name: GigabitEthernet5 + status: Active type: "1000Base-T (1GE)" register: test_one @@ -20,10 +22,10 @@ assert: that: - test_one is changed - - test_one['msg'] == "interface GigabitEthernet3 created" + - test_one['msg'] == "interface GigabitEthernet5 created" - test_one['diff']['before']['state'] == 'absent' - test_one['diff']['after']['state'] == 'present' - - test_one['interface']['name'] == "GigabitEthernet3" + - test_one['interface']['name'] == "GigabitEthernet5" - test_one['interface']['device'] == test100['key'] - name: "2 - Update test100 - GigabitEthernet3" @@ -31,7 +33,8 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: test100 - name: GigabitEthernet3 + name: GigabitEthernet5 + status: Active mtu: 1600 enabled: false register: test_two @@ -40,20 +43,20 @@ assert: that: - test_two is changed - - test_two['msg'] == "interface GigabitEthernet3 updated" + - test_two['msg'] == "interface GigabitEthernet5 updated" - test_two['diff']['after']['enabled'] == false - test_two['diff']['after']['mtu'] == 1600 - - test_two['interface']['name'] == "GigabitEthernet3" + - test_two['interface']['name'] == "GigabitEthernet5" - test_two['interface']['device'] == test100['key'] - test_two['interface']['enabled'] == false - test_two['interface']['mtu'] == 1600 -- name: "3 - Delete interface test100 - GigabitEthernet3" +- name: "3 - Delete interface test100 - GigabitEthernet5" networktocode.nautobot.device_interface: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: test100 - name: GigabitEthernet3 + name: GigabitEthernet5 state: absent register: test_three @@ -61,7 +64,7 @@ assert: that: - test_three is changed - - test_three['msg'] == "interface GigabitEthernet3 deleted" + - test_three['msg'] == "interface GigabitEthernet5 deleted" - test_three['diff']['before']['state'] == "present" - test_three['diff']['after']['state'] == "absent" @@ -75,6 +78,7 @@ mtu: 1600 mgmt_only: false mode: Access + status: Active state: present register: test_four @@ -101,7 +105,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: test100 - name: GigabitEthernet3 + name: GigabitEthernet5 enabled: false type: 1000Base-T (1GE) lag: @@ -109,6 +113,7 @@ mtu: 1600 mgmt_only: false mode: Access + status: Active state: present register: test_five @@ -116,10 +121,10 @@ assert: that: - test_five is changed - - test_five['msg'] == "interface GigabitEthernet3 created" + - test_five['msg'] == "interface GigabitEthernet5 created" - test_five['diff']['before']['state'] == 'absent' - test_five['diff']['after']['state'] == 'present' - - test_five['interface']['name'] == "GigabitEthernet3" + - test_five['interface']['name'] == "GigabitEthernet5" - test_five['interface']['device'] == test100['key'] - test_five['interface']['enabled'] == false - test_five['interface']['type'] == "1000base-t" @@ -138,15 +143,16 @@ type: 1000Base-T (1GE) untagged_vlan: name: Wireless - site: Test Site + location: "{{ child_location['key'] }}" tagged_vlans: - name: Data - site: Test Site + location: "{{ child_location['key'] }}" - name: VoIP - site: Test Site + location: "{{ child_location['key'] }}" mtu: 1600 mgmt_only: true mode: Tagged + status: Active state: present register: test_six @@ -175,6 +181,7 @@ token: "{{ nautobot_token }}" device: test100 name: GigabitEthernet1 + status: Active register: test_seven - name: "7 - ASSERT" @@ -192,19 +199,21 @@ device: "R1-Device" name: "port-channel1" type: "Link Aggregation Group (LAG)" + status: Active - name: "8 - Create interface and assign it to parent LAG - non dict" networktocode.nautobot.device_interface: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: test100 - name: GigabitEthernet4 + name: GigabitEthernet6 enabled: false type: 1000Base-T (1GE) lag: "port-channel1" mtu: 1600 mgmt_only: false mode: Access + status: Active state: present register: test_eight @@ -212,10 +221,10 @@ assert: that: - test_eight is changed - - test_eight['msg'] == "interface GigabitEthernet4 created" + - test_eight['msg'] == "interface GigabitEthernet6 created" - test_eight['diff']['before']['state'] == 'absent' - test_eight['diff']['after']['state'] == 'present' - - test_eight['interface']['name'] == "GigabitEthernet4" + - test_eight['interface']['name'] == "GigabitEthernet6" - test_eight['interface']['device'] == test100['key'] - test_eight['interface']['enabled'] == false - test_eight['interface']['type'] == "1000base-t" @@ -231,6 +240,7 @@ device: Test Nexus Child One name: Ethernet2/2 type: 1000Base-T (1GE) + status: Active state: present register: test_nine @@ -257,6 +267,7 @@ name: Ethernet2/2 description: "Updated child interface from parent device" update_vc_child: True + status: Active state: present register: test_ten @@ -279,6 +290,7 @@ device: Test Nexus One name: Ethernet2/2 description: "Updated child interface from parent device - test" + status: Active state: present ignore_errors: yes register: test_eleven @@ -289,81 +301,71 @@ - test_eleven is failed - test_eleven['msg'] == "Must set update_vc_child to True to allow child device interface modification" -## -## -### Nautobot 1.4+ tests -## -## -- block: - - name: "12 - Interface with status" - networktocode.nautobot.device_interface: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - device: test100 - api_version: "{{ nautobot_version }}" - name: GigabitEthernet9999 - status: planned - type: "1000Base-T (1GE)" - register: test_twelve - - - name: "12 - ASSERT" - assert: - that: - - test_twelve is changed - - test_twelve['msg'] == "interface GigabitEthernet9999 created" - - test_twelve['diff']['before']['state'] == 'absent' - - test_twelve['diff']['after']['state'] == 'present' - - test_twelve['interface']['name'] == "GigabitEthernet9999" - - test_twelve['interface']['status'] == "planned" - - test_twelve['interface']['device'] == test100['key'] - - - name: "13 - Create child interface" - networktocode.nautobot.device_interface: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - device: test100 - api_version: "{{ nautobot_version }}" - name: GigabitEthernet9999/1 - status: active - type: "Virtual" - parent_interface: - name: GigabitEthernet9999 - register: test_thirteen +- name: "12 - Interface with status" + networktocode.nautobot.device_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + device: test100 + name: GigabitEthernet9999 + status: Planned + type: "1000Base-T (1GE)" + register: test_twelve - - name: "13 - ASSERT" - assert: - that: - - test_thirteen is changed - - test_thirteen['msg'] == "interface GigabitEthernet9999/1 created" - - test_thirteen['diff']['before']['state'] == 'absent' - - test_thirteen['diff']['after']['state'] == 'present' - - test_thirteen['interface']['name'] == "GigabitEthernet9999/1" - - test_thirteen['interface']['device'] == test100['key'] - - test_thirteen['interface']['parent_interface'] == test_twelve['interface']['id'] +- name: "12 - ASSERT" + assert: + that: + - test_twelve is changed + - test_twelve['msg'] == "interface GigabitEthernet9999 created" + - test_twelve['diff']['before']['state'] == 'absent' + - test_twelve['diff']['after']['state'] == 'present' + - test_twelve['interface']['name'] == "GigabitEthernet9999" + - test_twelve['interface']['status'] == planned['key'] + - test_twelve['interface']['device'] == test100['key'] + vars: + planned: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Planned') }}" - - name: "14 - Create bridge interface" - networktocode.nautobot.device_interface: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - device: test100 - api_version: "{{ nautobot_version }}" - name: Bridge1 - status: active - type: "1000Base-T (1GE)" - bridge: - name: GigabitEthernet9999 - register: test_fourteen +- name: "13 - Create child interface" + networktocode.nautobot.device_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + device: test100 + name: GigabitEthernet9999/1 + status: Active + type: "Virtual" + parent_interface: + name: GigabitEthernet9999 + register: test_thirteen - - name: "14 - ASSERT" - assert: - that: - - test_fourteen is changed - - test_fourteen['msg'] == "interface Bridge1 created" - - test_fourteen['diff']['before']['state'] == 'absent' - - test_fourteen['diff']['after']['state'] == 'present' - - test_fourteen['interface']['name'] == "Bridge1" - - test_fourteen['interface']['device'] == test100['key'] - - test_fourteen['interface']['bridge'] == test_twelve['interface']['id'] +- name: "13 - ASSERT" + assert: + that: + - test_thirteen is changed + - test_thirteen['msg'] == "interface GigabitEthernet9999/1 created" + - test_thirteen['diff']['before']['state'] == 'absent' + - test_thirteen['diff']['after']['state'] == 'present' + - test_thirteen['interface']['name'] == "GigabitEthernet9999/1" + - test_thirteen['interface']['device'] == test100['key'] + - test_thirteen['interface']['parent_interface'] == test_twelve['interface']['id'] + +- name: "14 - Create bridge interface" + networktocode.nautobot.device_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + device: test100 + name: Bridge1 + status: Active + type: "1000Base-T (1GE)" + bridge: + name: GigabitEthernet9999 + register: test_fourteen - when: - - "nautobot_version is version('1.4', '>=')" +- name: "14 - ASSERT" + assert: + that: + - test_fourteen is changed + - test_fourteen['msg'] == "interface Bridge1 created" + - test_fourteen['diff']['before']['state'] == 'absent' + - test_fourteen['diff']['after']['state'] == 'present' + - test_fourteen['interface']['name'] == "Bridge1" + - test_fourteen['interface']['device'] == test100['key'] + - test_fourteen['interface']['bridge'] == test_twelve['interface']['id'] diff --git a/tests/integration/targets/latest/tasks/device_interface_template.yml b/tests/integration/targets/latest/tasks/device_interface_template.yml index 5cc6551c..73feb788 100644 --- a/tests/integration/targets/latest/tasks/device_interface_template.yml +++ b/tests/integration/targets/latest/tasks/device_interface_template.yml @@ -5,7 +5,7 @@ ## ## - set_fact: - dt_arista: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=arista-test') }}" + dt_arista: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Arista Test\"') }}" - name: "1 - Interface with required information" networktocode.nautobot.device_interface_template: diff --git a/tests/integration/targets/latest/tasks/device_role.yml b/tests/integration/targets/latest/tasks/device_role.yml deleted file mode 100644 index 66738a3f..00000000 --- a/tests/integration/targets/latest/tasks/device_role.yml +++ /dev/null @@ -1,96 +0,0 @@ ---- -## -## -### PYNAUTOBOT_DEVICE_ROLE -## -## -- name: "DEVICE_ROLE 1: Necessary info creation" - networktocode.nautobot.device_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Device Role" - color: "FFFFFF" - state: present - register: test_one - -- name: "DEVICE_ROLE 1: ASSERT - Necessary info creation" - assert: - that: - - test_one is changed - - test_one['diff']['before']['state'] == "absent" - - test_one['diff']['after']['state'] == "present" - - test_one['device_role']['name'] == "Test Device Role" - - test_one['device_role']['slug'] == "test-device-role" - - test_one['device_role']['color'] == "ffffff" - - test_one['msg'] == "device_role Test Device Role created" - -- name: "DEVICE_ROLE 2: Create duplicate" - networktocode.nautobot.device_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Device Role" - color: "FFFFFF" - state: present - register: test_two - -- name: "DEVICE_ROLE 2: ASSERT - Create duplicate" - assert: - that: - - not test_two['changed'] - - test_two['device_role']['name'] == "Test Device Role" - - test_two['device_role']['slug'] == "test-device-role" - - test_two['device_role']['color'] == "ffffff" - - test_two['msg'] == "device_role Test Device Role already exists" - -- name: "DEVICE_ROLE 3: ASSERT - Update" - networktocode.nautobot.device_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Device Role" - color: "003EFF" - vm_role: false - state: present - register: test_three - -- name: "DEVICE_ROLE 3: ASSERT - Update" - assert: - that: - - test_three is changed - - test_three['diff']['after']['color'] == "003eff" - - test_three['diff']['after']['vm_role'] == false - - test_three['device_role']['name'] == "Test Device Role" - - test_three['device_role']['slug'] == "test-device-role" - - test_three['device_role']['color'] == "003eff" - - test_three['device_role']['vm_role'] == false - - test_three['msg'] == "device_role Test Device Role updated" - -- name: "DEVICE_ROLE 4: ASSERT - Delete" - networktocode.nautobot.device_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Device Role - state: absent - register: test_four - -- name: "DEVICE_ROLE 4: ASSERT - Delete" - assert: - that: - - test_four is changed - - test_four['diff']['before']['state'] == "present" - - test_four['diff']['after']['state'] == "absent" - - test_four['msg'] == "device_role Test Device Role deleted" - -- name: "DEVICE_ROLE 5: ASSERT - Delete non existing" - networktocode.nautobot.device_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Device Role - state: absent - register: test_five - -- name: "DEVICE_ROLE 5: ASSERT - Delete non existing`" - assert: - that: - - not test_five['changed'] - - test_five['device_role'] == None - - test_five['msg'] == "device_role Test Device Role already absent" diff --git a/tests/integration/targets/latest/tasks/device_type.yml b/tests/integration/targets/latest/tasks/device_type.yml index 27fe1b1a..71c9fa1a 100644 --- a/tests/integration/targets/latest/tasks/device_type.yml +++ b/tests/integration/targets/latest/tasks/device_type.yml @@ -5,13 +5,12 @@ ## ## - set_fact: - manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-manufacturer') }}" + manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Manufacturer\"') }}" - name: "DEVICE_TYPE 1: Necessary info creation" networktocode.nautobot.device_type: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - slug: test-device-type model: ws-test-3750 manufacturer: Test Manufacturer state: present @@ -23,16 +22,14 @@ - test_one is changed - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - - test_one['device_type']['slug'] == "test-device-type" - test_one['device_type']['model'] == "ws-test-3750" - test_one['device_type']['manufacturer'] == manufacturer['key'] - - test_one['msg'] == "device_type test-device-type created" + - test_one['msg'] == "device_type ws-test-3750 created" - name: "DEVICE_TYPE 2: Create duplicate" networktocode.nautobot.device_type: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - slug: test-device-type model: "ws-test-3750" manufacturer: Test Manufacturer state: present @@ -42,16 +39,14 @@ assert: that: - not test_two['changed'] - - test_one['device_type']['slug'] == "test-device-type" - test_one['device_type']['model'] == "ws-test-3750" - test_one['device_type']['manufacturer'] == manufacturer['key'] - - test_two['msg'] == "device_type test-device-type already exists" + - test_two['msg'] == "device_type ws-test-3750 already exists" - name: "DEVICE_TYPE 3: ASSERT - Update" networktocode.nautobot.device_type: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - slug: test-device-type model: ws-test-3750 manufacturer: Test Manufacturer part_number: ws-3750g-v2 @@ -68,19 +63,18 @@ - test_three['diff']['after']['is_full_depth'] == false - test_three['diff']['after']['part_number'] == "ws-3750g-v2" - test_three['diff']['after']['subdevice_role'] == "parent" - - test_three['device_type']['slug'] == "test-device-type" - test_three['device_type']['model'] == "ws-test-3750" - test_three['device_type']['manufacturer'] == manufacturer['key'] - test_three['device_type']['is_full_depth'] == false - test_three['device_type']['part_number'] == "ws-3750g-v2" - test_three['device_type']['subdevice_role'] == "parent" - - test_three['msg'] == "device_type test-device-type updated" + - test_three['msg'] == "device_type ws-test-3750 updated" - name: "DEVICE_TYPE 4: ASSERT - Delete" networktocode.nautobot.device_type: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - model: test-device-type + model: ws-test-3750 state: absent register: test_four @@ -90,13 +84,13 @@ - test_four is changed - test_four['diff']['before']['state'] == "present" - test_four['diff']['after']['state'] == "absent" - - test_four['msg'] == "device_type test-device-type deleted" + - test_four['msg'] == "device_type ws-test-3750 deleted" - name: "DEVICE_TYPE 5: ASSERT - Delete non existing" networktocode.nautobot.device_type: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - model: "Test Device Type" + model: "ws-test-3750" state: absent register: test_five @@ -105,25 +99,4 @@ that: - not test_five['changed'] - test_five['device_type'] == None - - test_five['msg'] == "device_type Test Device Type already absent" - -- name: "DEVICE_TYPE 6: Without Slug" - networktocode.nautobot.device_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - model: "WS Test 3850" - manufacturer: "Test Manufacturer" - subdevice_role: "parent" - state: present - register: test_six - -- name: "DEVICE_TYPE 6: ASSERT - Without Slug" - assert: - that: - - test_six is changed - - test_six['diff']['before']['state'] == "absent" - - test_six['diff']['after']['state'] == "present" - - test_six['device_type']['slug'] == "ws-test-3850" - - test_six['device_type']['model'] == "WS Test 3850" - - test_six['device_type']['manufacturer'] == manufacturer['key'] - - test_six['msg'] == "device_type WS Test 3850 created" + - test_five['msg'] == "device_type ws-test-3750 already absent" diff --git a/tests/integration/targets/latest/tasks/front_port_template.yml b/tests/integration/targets/latest/tasks/front_port_template.yml index f635332f..a78ef9c2 100644 --- a/tests/integration/targets/latest/tasks/front_port_template.yml +++ b/tests/integration/targets/latest/tasks/front_port_template.yml @@ -8,9 +8,9 @@ ## ## - set_fact: - cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco-test') }}" - arista_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=arista-test') }}" - rear_port: '{{ lookup(''networktocode.nautobot.lookup'', ''rear-port-templates'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Rear Port Template"'') }}' + cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Cisco Test\"') }}" + arista_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Arista Test\"') }}" + rear_port_template: '{{ lookup(''networktocode.nautobot.lookup'', ''rear-port-templates'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Rear Port Template"'') }}' - name: "FRONT_PORT_TEMPLATE 1: Necessary info creation" networktocode.nautobot.front_port_template: @@ -32,7 +32,7 @@ - test_one['front_port_template']['name'] == "Front Port Template" - test_one['front_port_template']['device_type'] == cisco_test['key'] - test_one['front_port_template']['type'] == "bnc" - - test_one['front_port_template']['rear_port'] == rear_port['key'] + - test_one['front_port_template']['rear_port_template'] == rear_port_template['key'] - test_one['msg'] == "front_port_template Front Port Template created" - name: "FRONT_PORT_TEMPLATE 2: Create duplicate" @@ -53,7 +53,7 @@ - test_two['front_port_template']['name'] == "Front Port Template" - test_two['front_port_template']['device_type'] == cisco_test['key'] - test_two['front_port_template']['type'] == "bnc" - - test_two['front_port_template']['rear_port'] == rear_port['key'] + - test_two['front_port_template']['rear_port_template'] == rear_port_template['key'] - test_two['msg'] == "front_port_template Front Port Template already exists" - name: "FRONT_PORT_TEMPLATE 3: Update Front Port Template with other fields" @@ -77,7 +77,7 @@ - test_three['front_port_template']['device_type'] == cisco_test['key'] - test_three['front_port_template']['type'] == "bnc" - test_three['front_port_template']['rear_port_position'] == 5 - - test_three['front_port_template']['rear_port'] == rear_port['key'] + - test_three['front_port_template']['rear_port_template'] == rear_port_template['key'] - test_three['msg'] == "front_port_template Front Port Template updated" - name: "FRONT_PORT_TEMPLATE 4: Create Front Port Template for Delete Test" @@ -100,7 +100,7 @@ - test_four['front_port_template']['name'] == "Front Port Template 2" - test_four['front_port_template']['device_type'] == cisco_test['key'] - test_four['front_port_template']['type'] == "bnc" - - test_four['front_port_template']['rear_port'] == rear_port['key'] + - test_four['front_port_template']['rear_port_template'] == rear_port_template['key'] - test_four['msg'] == "front_port_template Front Port Template 2 created" - name: "FRONT_PORT_TEMPLATE 5: Delete Front Port Template" @@ -142,5 +142,5 @@ - test_six['front_port_template']['name'] == "Front Port Template" - test_six['front_port_template']['device_type'] == cisco_test['key'] - test_six['front_port_template']['type'] == "bnc" - - test_six['front_port_template']['rear_port'] == rear_port['key'] + - test_six['front_port_template']['rear_port_template'] == rear_port_template['key'] - test_six['msg'] == "front_port_template Front Port Template already exists" diff --git a/tests/integration/targets/latest/tasks/inventory_item.yml b/tests/integration/targets/latest/tasks/inventory_item.yml index 9eaf62d9..8ac9d6ed 100644 --- a/tests/integration/targets/latest/tasks/inventory_item.yml +++ b/tests/integration/targets/latest/tasks/inventory_item.yml @@ -6,8 +6,8 @@ ## - set_fact: test100: "{{ lookup('networktocode.nautobot.lookup', 'devices', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=test100') }}" - manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" + manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Cisco') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" - name: "INVENTORY_ITEM 1: Necessary info creation" networktocode.nautobot.inventory_item: diff --git a/tests/integration/targets/latest/tasks/ip_address.yml b/tests/integration/targets/latest/tasks/ip_address.yml index 8a417546..8885a618 100644 --- a/tests/integration/targets/latest/tasks/ip_address.yml +++ b/tests/integration/targets/latest/tasks/ip_address.yml @@ -9,7 +9,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" address: 192.168.1.10/30 - status: "active" + status: "Active" state: present register: test_one @@ -27,7 +27,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" address: 192.168.1.10/30 - status: "active" + status: "Active" description: "Updated ip address" tags: - "Updated" @@ -45,7 +45,7 @@ - test_two['ip_address']['tags'][0] == tag_updated['key'] - test_two['ip_address']['description'] == "Updated ip address" vars: - tag_updated: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=updated') }}" + tag_updated: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Updated') }}" - name: "3 - Delete IP - 192.168.1.10 - State: Absent" networktocode.nautobot.ip_address: @@ -63,12 +63,12 @@ - test_three['diff']['after']['state'] == "absent" - test_three['msg'] == "ip_address 192.168.1.10/30 deleted" -- name: "4 - Create IP in global VRF - 192.168.1.20/30 - State: Present" +- name: "4 - Create IP in global namespace - 192.168.1.20/30 - State: Present" networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" address: 192.168.1.20/30 - status: "active" + status: "Active" state: present register: test_four @@ -81,277 +81,132 @@ - test_four['msg'] == "ip_address 192.168.1.20/30 created" - test_four['ip_address']['address'] == "192.168.1.20/30" -- name: "5 - Create IP in global VRF - 192.168.1.20/30 - State: New" +- name: "5 - Duplicate IP in global namespace - 192.168.1.20/30 - State: Present" networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" address: 192.168.1.20/30 - status: "active" - state: new + status: "Active" + state: present register: test_five - name: "5 - ASSERT" assert: that: - - test_five is changed - - test_five['diff']['before']['state'] == "absent" - - test_five['diff']['after']['state'] == "present" - - test_five['msg'] == "ip_address 192.168.1.20/30 created" + - not test_five['changed'] + - test_five['msg'] == "ip_address 192.168.1.20/30 already exists" - test_five['ip_address']['address'] == "192.168.1.20/30" -- name: "6 - Create new address with only prefix specified - State: new" +- name: "6 - Force Duplicate IP in global namespace - 192.168.1.20/30 - State: New" networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - prefix: 192.168.100.0/24 - status: "active" + address: 192.168.1.20/30 + status: "Active" state: new register: test_six + ignore_errors: true - name: "6 - ASSERT" assert: that: - - test_six is changed - - test_six['diff']['before']['state'] == "absent" - - test_six['diff']['after']['state'] == "present" - - test_six['msg'] == "ip_address 192.168.100.1/24 created" - - test_six['ip_address']['address'] == "192.168.100.1/24" + - test_six is not changed + - "'duplicate key value violates unique constraint' in test_six['msg']" -- name: "7 - Create IP address with several specified" +- name: "7 - Create new address with only parent specified - State: new" networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - address: 172.16.1.20/24 - vrf: Test VRF - tenant: Test Tenant - status: Reserved - role: Loopback - description: Test description - tags: - - "Schnozzberry" - state: present + parent: 192.168.0.0/16 + status: "Active" + state: new register: test_seven -- set_fact: - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" - vrf: '{{ lookup(''networktocode.nautobot.lookup'', ''vrfs'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test VRF"'') }}' - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - - name: "7 - ASSERT" assert: that: - test_seven is changed - test_seven['diff']['before']['state'] == "absent" - test_seven['diff']['after']['state'] == "present" - - test_seven['msg'] == "ip_address 172.16.1.20/24 created" - - test_seven['ip_address']['address'] == "172.16.1.20/24" - - test_seven['ip_address']['description'] == "Test description" - - test_seven['ip_address']['family'] == 4 - - test_seven['ip_address']['role'] == "loopback" - - test_seven['ip_address']['status'] == "reserved" - - test_seven['ip_address']['tags'][0] == tag_schnozzberry['key'] - - test_seven['ip_address']['tenant'] == tenant['key'] - - test_seven['ip_address']['vrf'] == vrf['key'] + - test_seven['msg'] == "ip_address 192.168.0.1/16 created" + - test_seven['ip_address']['address'] == "192.168.0.1/16" -- name: "8 - Create IP address and assign a nat_inside IP" +- name: "8 - Create IP address with several specified in namespace Private" networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - address: 10.10.1.30/16 - vrf: Test VRF - status: "active" - nat_inside: - address: 172.16.1.20 - vrf: Test VRF + address: 172.16.1.20/24 + namespace: Private + tenant: Test Tenant + status: Reserved + role: Loopback + type: Host + description: Test description + tags: + - "Schnozzberry" + state: present register: test_eight +- set_fact: + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" + reserved: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Reserved') }}" + loopback: "{{ lookup('networktocode.nautobot.lookup', 'roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Loopback') }}" + parent_prefix: "{{ lookup('networktocode.nautobot.lookup', 'prefixes', api_endpoint=nautobot_url, token=nautobot_token, api_filter='prefix=172.16.0.0/12 namespace=Private') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + - name: "8 - ASSERT" assert: that: - test_eight is changed - test_eight['diff']['before']['state'] == "absent" - test_eight['diff']['after']['state'] == "present" - - test_eight['msg'] == "ip_address 10.10.1.30/16 created" - - test_eight['ip_address']['address'] == "10.10.1.30/16" - - test_eight['ip_address']['family'] == 4 - - test_eight['ip_address']['nat_inside'] == nat_inside['key'] - - test_eight['ip_address']['vrf'] == vrf['key'] - vars: - nat_inside: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=172.16.1.20/24 vrf_id=' ~ vrf['key']) }}" + - test_eight['msg'] == "ip_address 172.16.1.20/24 created" + - test_eight['ip_address']['address'] == "172.16.1.20/24" + - test_eight['ip_address']['description'] == "Test description" + - test_eight['ip_address']['ip_version'] == 4 + - test_eight['ip_address']['parent'] == parent_prefix['key'] + - test_eight['ip_address']['role'] == loopback['key'] + - test_eight['ip_address']['status'] == reserved['key'] + - test_eight['ip_address']['tags'][0] == tag_schnozzberry['key'] + - test_eight['ip_address']['tenant'] == tenant['key'] -- name: "9 - Create IP address on GigabitEthernet2 - test100 - State: present" +- name: "9 - Create IP address and assign a nat_inside IP" networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - address: 10.10.200.30/16 - status: "active" - assigned_object: - name: GigabitEthernet2 - device: test100 + address: 10.10.1.30/16 + status: "Active" + nat_inside: + address: 172.16.1.20 register: test_nine -- set_fact: - test100_gi2: "{{ lookup('networktocode.nautobot.lookup', 'interfaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=GigabitEthernet2 device=test100') }}" - - name: "9 - ASSERT" assert: that: - test_nine is changed - test_nine['diff']['before']['state'] == "absent" - test_nine['diff']['after']['state'] == "present" - - test_nine['msg'] == "ip_address 10.10.200.30/16 created" - - test_nine['ip_address']['address'] == "10.10.200.30/16" - - test_nine['ip_address']['family'] == 4 - - test_nine['ip_address']['assigned_object_type'] == "dcim.interface" - - test_nine['ip_address']['assigned_object_id'] == test100_gi2['key'] - -- name: "10 - Create IP address on GigabitEthernet2 - test100 - State: new" - networktocode.nautobot.ip_address: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - prefix: 10.10.0.0/16 - status: "active" - assigned_object: - name: GigabitEthernet2 - device: test100 - state: new - register: test_ten - -- name: "10 - ASSERT" - assert: - that: - - test_ten is changed - - test_ten['diff']['before']['state'] == "absent" - - test_ten['diff']['after']['state'] == "present" - - test_ten['msg'] == "ip_address 10.10.0.1/16 created" - - test_ten['ip_address']['address'] == "10.10.0.1/16" - - test_ten['ip_address']['family'] == 4 - - test_ten['ip_address']['assigned_object_type'] == "dcim.interface" - - test_ten['ip_address']['assigned_object_id'] == test100_gi2['key'] - -- name: "11 - Create IP address on GigabitEthernet2 - test100 - State: present" - networktocode.nautobot.ip_address: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - prefix: 192.168.100.0/24 - status: "active" - assigned_object: - name: GigabitEthernet2 - device: test100 - state: present - register: test_eleven - -- name: "11 - ASSERT" - assert: - that: - - test_eleven is changed - - test_eleven['diff']['before']['state'] == "absent" - - test_eleven['diff']['after']['state'] == "present" - - test_eleven['msg'] == "ip_address 192.168.100.2/24 created" - - test_eleven['ip_address']['address'] == "192.168.100.2/24" - -- name: "12 - Duplicate - 192.168.100.2/24 on interface" - networktocode.nautobot.ip_address: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - address: 192.168.100.2/24 - status: "active" - assigned_object: - name: GigabitEthernet2 - device: test100 - state: present - register: test_twelve - -- name: "12 - ASSERT" - assert: - that: - - not test_twelve['changed'] - - test_twelve['msg'] == "ip_address 192.168.100.2/24 already exists" - - test_twelve['ip_address']['address'] == "192.168.100.2/24" - - test_twelve['ip_address']['assigned_object_type'] == "dcim.interface" - - test_twelve['ip_address']['assigned_object_id'] == test100_gi2['key'] - -- name: "13 - Duplicate - 192.168.100.2/24" - networktocode.nautobot.ip_address: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - address: 192.168.100.2/24 - status: "active" - state: present - register: test_thirteen - -- name: "13 - ASSERT" - assert: - that: - - not test_thirteen['changed'] - - test_thirteen['msg'] == "ip_address 192.168.100.2/24 already exists" - - test_thirteen['ip_address']['address'] == "192.168.100.2/24" - -- name: "14 - Create IP address on Eth0 - test100-vm - State: present" - networktocode.nautobot.ip_address: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - address: 10.188.1.100/24 - status: "active" - assigned_object: - name: Eth0 - virtual_machine: test100-vm - register: test_fourteen - -- name: "14 - ASSERT" - assert: - that: - - test_fourteen is changed - - test_fourteen['diff']['before']['state'] == "absent" - - test_fourteen['diff']['after']['state'] == "present" - - test_fourteen['msg'] == "ip_address 10.188.1.100/24 created" - - test_fourteen['ip_address']['address'] == "10.188.1.100/24" - - test_fourteen['ip_address']['family'] == 4 - - test_fourteen['ip_address']['assigned_object_type'] == "virtualization.vminterface" - - test_fourteen['ip_address']['assigned_object_id'] == interface['key'] - vars: - interface: "{{ lookup('networktocode.nautobot.lookup', 'virtualization-interfaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Eth0 virtual_machine=test100-vm') }}" - -- name: "15 - Create same IP address on Eth0 - test101-vm - State: present" - networktocode.nautobot.ip_address: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - address: 10.188.1.100/24 - status: "active" - assigned_object: - name: Eth0 - virtual_machine: test101-vm - state: "present" - register: test_fifteen - -- name: "15 - ASSERT" - assert: - that: - - test_fifteen is changed - - test_fifteen['diff']['before']['state'] == "absent" - - test_fifteen['diff']['after']['state'] == "present" - - test_fifteen['msg'] == "ip_address 10.188.1.100/24 created" - - test_fifteen['ip_address']['address'] == "10.188.1.100/24" - - test_fifteen['ip_address']['family'] == 4 - - test_fifteen['ip_address']['assigned_object_type'] == "virtualization.vminterface" - - test_fifteen['ip_address']['assigned_object_id'] == interface['key'] + - test_nine['msg'] == "ip_address 10.10.1.30/16 created" + - test_nine['ip_address']['address'] == "10.10.1.30/16" + - test_nine['ip_address']['ip_version'] == 4 + - test_nine['ip_address']['nat_inside'] == nat_inside['key'] vars: - interface: "{{ lookup('networktocode.nautobot.lookup', 'virtualization-interfaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Eth0 virtual_machine=test101-vm') }}" + nat_inside: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=172.16.1.20/24') }}" -- name: "16 - Create IP address with no mask - State: Present" +- name: "10 - Create IP address with no mask - State: Present" networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" address: 10.120.10.1 - status: "active" + status: "Active" state: present - register: test_sixteen + register: test_ten - name: "16 - ASSERT" assert: that: - - test_sixteen is changed - - test_sixteen['diff']['before']['state'] == "absent" - - test_sixteen['diff']['after']['state'] == "present" - - test_sixteen['msg'] == "ip_address 10.120.10.1/32 created" - - test_sixteen['ip_address']['address'] == "10.120.10.1/32" + - test_ten is changed + - test_ten['diff']['before']['state'] == "absent" + - test_ten['diff']['after']['state'] == "present" + - test_ten['msg'] == "ip_address 10.120.10.1/32 created" + - test_ten['ip_address']['address'] == "10.120.10.1/32" diff --git a/tests/integration/targets/latest/tasks/ip_address_to_interface.yml b/tests/integration/targets/latest/tasks/ip_address_to_interface.yml new file mode 100644 index 00000000..b8104351 --- /dev/null +++ b/tests/integration/targets/latest/tasks/ip_address_to_interface.yml @@ -0,0 +1,125 @@ +--- +## +## +### PYNAUTOBOT_IP_ADDRESS_TO_INTERFACE +## +## +- set_fact: + ip_address_dev: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=10.100.0.1/32') }}" + ip_address_vm: "{{ lookup('networktocode.nautobot.lookup', 'ip-addresses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='address=10.100.10.1/32') }}" + test100_gi4: "{{ lookup('networktocode.nautobot.lookup', 'interfaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=GigabitEthernet4 device=test100') }}" + test100_vm_eth0: "{{ lookup('networktocode.nautobot.lookup', 'virtualization-interfaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Eth0 virtual_machine=test100-vm') }}" + +- name: "1 - Add IP address on GigabitEthernet4 - test100" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address_dev['key'] }}" + interface: + name: GigabitEthernet4 + device: test100 + register: test_one + +- name: "1 - ASSERT" + assert: + that: + - test_one is changed + - test_one['diff']['before']['state'] == "absent" + - test_one['diff']['after']['state'] == "present" + - "'created' in test_one['msg']" + - test_one['ip_address_to_interface']['ip_address'] == ip_address_dev['key'] + - test_one['ip_address_to_interface']['interface'] == test100_gi4['key'] + +- name: "2 - Duplicate IP address on GigabitEthernet4 - test100" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address_dev['key'] }}" + interface: + name: GigabitEthernet4 + device: test100 + register: test_two + +- name: "2 - ASSERT" + assert: + that: + - not test_two is changed + - "'already exists' in test_two['msg']" + - test_one['ip_address_to_interface']['ip_address'] == ip_address_dev['key'] + - test_one['ip_address_to_interface']['interface'] == test100_gi4['key'] + +- name: "3 - Delete IP address on GigabitEthernet4 - test100" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address_dev['key'] }}" + interface: + name: GigabitEthernet4 + device: test100 + state: absent + register: test_three + +- name: "3 - ASSERT" + assert: + that: + - test_three is changed + - test_three['diff']['before']['state'] == "present" + - test_three['diff']['after']['state'] == "absent" + - "'deleted' in test_three['msg']" + +- name: 4" - Add IP address on Eth0 - test100-vm" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address_vm['key'] }}" + vm_interface: + name: Eth0 + virtual_machine: test100-vm + register: test_four + +- name: "4 - ASSERT" + assert: + that: + - test_four is changed + - test_four['diff']['before']['state'] == "absent" + - test_four['diff']['after']['state'] == "present" + - "'created' in test_four['msg']" + - test_four['ip_address_to_interface']['ip_address'] == ip_address_vm['key'] + - test_four['ip_address_to_interface']['vm_interface'] == test100_vm_eth0['key'] + +- name: "5 - Duplicate IP address on Eth0 - test100-vm" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address_vm['key'] }}" + vm_interface: + name: Eth0 + virtual_machine: test100-vm + register: test_five + +- name: "5 - ASSERT" + assert: + that: + - not test_five is changed + - "'already exists' in test_five['msg']" + - test_five['ip_address_to_interface']['ip_address'] == ip_address_vm['key'] + - test_five['ip_address_to_interface']['vm_interface'] == test100_vm_eth0['key'] + +- name: "6 - Delete IP address on Eth0 - test100-vm" + networktocode.nautobot.ip_address_to_interface: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + ip_address: "{{ ip_address_vm['key'] }}" + vm_interface: + name: Eth0 + virtual_machine: test100-vm + state: absent + register: test_six + +- name: "3 - ASSERT" + assert: + that: + - test_six is changed + - test_six['diff']['before']['state'] == "present" + - test_six['diff']['after']['state'] == "absent" + - "'deleted' in test_six['msg']" diff --git a/tests/integration/targets/latest/tasks/ipam_role.yml b/tests/integration/targets/latest/tasks/ipam_role.yml deleted file mode 100644 index 6d9c70f5..00000000 --- a/tests/integration/targets/latest/tasks/ipam_role.yml +++ /dev/null @@ -1,89 +0,0 @@ ---- -## -## -### PYNAUTOBOT_IPAM_ROLE -## -## -- name: "IPAM_ROLE 1: Necessary info creation" - networktocode.nautobot.ipam_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test IPAM Role" - state: present - register: test_one - -- name: "IPAM_ROLE 1: ASSERT - Necessary info creation" - assert: - that: - - test_one is changed - - test_one['diff']['before']['state'] == "absent" - - test_one['diff']['after']['state'] == "present" - - test_one['role']['name'] == "Test IPAM Role" - - test_one['role']['slug'] == "test-ipam-role" - - test_one['msg'] == "role Test IPAM Role created" - -- name: "IPAM_ROLE 2: Create duplicate" - networktocode.nautobot.ipam_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test IPAM Role" - state: present - register: test_two - -- name: "IPAM_ROLE 2: ASSERT - Create duplicate" - assert: - that: - - not test_two['changed'] - - test_two['role']['name'] == "Test IPAM Role" - - test_two['role']['slug'] == "test-ipam-role" - - test_two['msg'] == "role Test IPAM Role already exists" - -- name: "IPAM_ROLE 3: ASSERT - Update" - networktocode.nautobot.ipam_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test IPAM Role" - weight: 4096 - state: present - register: test_three - -- name: "IPAM_ROLE 3: ASSERT - Update" - assert: - that: - - test_three is changed - - test_three['diff']['after']['weight'] == 4096 - - test_three['role']['name'] == "Test IPAM Role" - - test_three['role']['slug'] == "test-ipam-role" - - test_three['role']['weight'] == 4096 - - test_three['msg'] == "role Test IPAM Role updated" - -- name: "IPAM_ROLE 4: ASSERT - Delete" - networktocode.nautobot.ipam_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test IPAM Role - state: absent - register: test_four - -- name: "IPAM_ROLE 4: ASSERT - Delete" - assert: - that: - - test_four is changed - - test_four['diff']['before']['state'] == "present" - - test_four['diff']['after']['state'] == "absent" - - test_four['msg'] == "role Test IPAM Role deleted" - -- name: "IPAM_ROLE 5: ASSERT - Delete non existing" - networktocode.nautobot.ipam_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test IPAM Role - state: absent - register: test_five - -- name: "IPAM_ROLE 5: ASSERT - Delete non existing`" - assert: - that: - - not test_five['changed'] - - test_five['role'] == None - - test_five['msg'] == "role Test IPAM Role already absent" diff --git a/tests/integration/targets/latest/tasks/location.yml b/tests/integration/targets/latest/tasks/location.yml index 8322b2b9..c367f18b 100644 --- a/tests/integration/targets/latest/tasks/location.yml +++ b/tests/integration/targets/latest/tasks/location.yml @@ -4,144 +4,159 @@ ### PYNAUTOBOT_LOCATION ## ## -- block: - - set_fact: - site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - parent_location_type: "{{ lookup('networktocode.nautobot.lookup', 'location_types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=my-parent-location-type') }}" - child_location_type: "{{ lookup('networktocode.nautobot.lookup', 'location_types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=my-child-location-type') }}" - - - name: "1 - Create location within Nautobot with only required information" - networktocode.nautobot.location: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location - status: Active - location_type: "{{ parent_location_type['key'] }}" - site: "{{ site['key'] }}" - register: test_create_min - - - name: "1 - ASSERT" - assert: - that: - - test_create_min is changed - - test_create_min['diff']['before']['state'] == "absent" - - test_create_min['diff']['after']['state'] == "present" - - test_create_min['location']['name'] == "Test Location" - - test_create_min['location']['status'] == "active" - - test_create_min['location']['site'] == site["key"] - - test_create_min['location']['location_type'] == parent_location_type["key"] - - test_create_min['msg'] == "location Test Location created" - - - name: "2 - Duplicate" - networktocode.nautobot.location: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location - status: Active - location_type: "{{ parent_location_type['key'] }}" - site: "{{ site['key'] }}" - register: test_create_idem - - - name: "2 - ASSERT" - assert: - that: - - not test_create_idem['changed'] - - test_create_idem['msg'] == "location Test Location already exists" - - test_create_idem['location']['name'] == "Test Location" - - - name: "3 - Update location" - networktocode.nautobot.location: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location - status: Active - location_type: "{{ parent_location_type['key'] }}" - site: "{{ site['key'] }}" - description: Test Location Description - register: test_update - - - name: "3 - ASSERT" - assert: - that: - - test_update is changed - - test_update['diff']['before']['description'] == "" - - test_update['diff']['after']['description'] == "Test Location Description" - - - name: "4 - Create location with all parameters" - networktocode.nautobot.location: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location 2 - status: Active - description: Test Location 2 Description - location_type: "{{ child_location_type['key'] }}" - parent: "{{ test_create_min['location']['id'] }}" - state: present - register: test_create_max - - - name: "4 - ASSERT" - assert: - that: - - test_create_max is changed - - test_create_max['diff']['before']['state'] == "absent" - - test_create_max['diff']['after']['state'] == "present" - - test_create_max['location']['name'] == "Test Location 2" - - test_create_max['location']['status'] == "active" - - test_create_max['msg'] == "location Test Location 2 created" - - test_create_max['location']['description'] == "Test Location 2 Description" - - test_create_max['location']['location_type'] == child_location_type["key"] - - test_create_max['location']['parent'] == test_create_min['location']['id'] - - - name: "5 - Duplicate create with all parameters" - networktocode.nautobot.location: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location 2 - status: Active - description: Test Location 2 Description - location_type: "{{ child_location_type['key'] }}" - parent: "{{ test_create_min['location']['id'] }}" - state: present - register: test_create_max_idem - - - name: "5 - ASSERT" - assert: - that: - - not test_create_max_idem['changed'] - - test_create_max_idem['msg'] == "location Test Location 2 already exists" - - test_create_max_idem['location']['name'] == "Test Location 2" - - - name: "6 - Delete location" - networktocode.nautobot.location: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location 2 - state: absent - register: test_delete - - - name: "6 - ASSERT" - assert: - that: - - test_delete is changed - - test_delete['diff']['before']['state'] == "present" - - test_delete['diff']['after']['state'] == "absent" - - test_delete['location']['name'] == "Test Location 2" - - test_delete['msg'] == "location Test Location 2 deleted" - - - name: "7 - Delete duplicate" - networktocode.nautobot.location: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location 2 - state: absent - register: test_delete_idem - - - name: "7 - ASSERT" - assert: - that: - - not test_delete_idem['changed'] - - test_delete_idem['msg'] == "location Test Location 2 already absent" - - when: - # Locations are only available on Nautobot 1.4+ - - "nautobot_version is version('1.4', '>=')" \ No newline at end of file +- set_fact: + parent_location_type: "{{ lookup('networktocode.nautobot.lookup', 'location_types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Parent Location Type\"') }}" + child_location_type: "{{ lookup('networktocode.nautobot.lookup', 'location_types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"My Child Location Type\"') }}" + active: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Active') }}" + +- name: "1 - Create location within Nautobot with only required information" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location + status: Active + location_type: "{{ parent_location_type['key'] }}" + register: test_create_min + +- name: "1 - ASSERT" + assert: + that: + - test_create_min is changed + - test_create_min['diff']['before']['state'] == "absent" + - test_create_min['diff']['after']['state'] == "present" + - test_create_min['location']['name'] == "Test Location" + - test_create_min['location']['status'] == active['key'] + - test_create_min['location']['location_type'] == parent_location_type["key"] + - test_create_min['msg'] == "location Test Location created" + +- name: "2 - Duplicate" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location + status: Active + location_type: "{{ parent_location_type['key'] }}" + register: test_create_idem + +- name: "2 - ASSERT" + assert: + that: + - not test_create_idem['changed'] + - test_create_idem['msg'] == "location Test Location already exists" + - test_create_idem['location']['name'] == "Test Location" + +- name: "3 - Update location" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location + status: Active + location_type: "{{ parent_location_type['key'] }}" + description: Test Location Description + register: test_update + +- name: "3 - ASSERT" + assert: + that: + - test_update is changed + - test_update['diff']['before']['description'] == "" + - test_update['diff']['after']['description'] == "Test Location Description" + +- name: "4 - Create location with all parameters" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location 2 + status: Active + description: Test Location 2 Description + location_type: "{{ child_location_type['key'] }}" + parent_location: "{{ test_create_min['location']['id'] }}" + state: present + register: test_create_max + +- name: "4 - ASSERT" + assert: + that: + - test_create_max is changed + - test_create_max['diff']['before']['state'] == "absent" + - test_create_max['diff']['after']['state'] == "present" + - test_create_max['location']['name'] == "Test Location 2" + - test_create_max['location']['status'] == active['key'] + - test_create_max['msg'] == "location Test Location 2 created" + - test_create_max['location']['description'] == "Test Location 2 Description" + - test_create_max['location']['location_type'] == child_location_type["key"] + - test_create_max['location']['parent'] == test_create_min['location']['id'] + +- name: "5 - Duplicate create with all parameters" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location 2 + status: Active + description: Test Location 2 Description + location_type: "{{ child_location_type['key'] }}" + parent_location: "{{ test_create_min['location']['id'] }}" + state: present + register: test_create_max_idem + +- name: "5 - ASSERT" + assert: + that: + - not test_create_max_idem['changed'] + - test_create_max_idem['msg'] == "location Test Location 2 already exists" + - test_create_max_idem['location']['name'] == "Test Location 2" + +- set_fact: + location_to_delete: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Location 2\" parent=\"Test Location\" location_type=\"My Child Location Type\"') }}" + +- name: "6 - Delete location" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + id: "{{ location_to_delete['key'] }}" + state: absent + register: test_delete + +- name: "6 - ASSERT" + assert: + that: + - test_delete is changed + - test_delete['diff']['before']['state'] == "present" + - test_delete['diff']['after']['state'] == "absent" + - test_delete['location']['name'] == "Test Location 2" + - "'deleted' in test_delete['msg']" + +- name: "7 - Delete duplicate" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + id: "{{ location_to_delete['key'] }}" + state: absent + register: test_delete_idem + +- name: "7 - ASSERT" + assert: + that: + - not test_delete_idem['changed'] + - "'already absent' in test_delete_idem['msg']" + +- set_fact: + fist_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Location\" location_type=\"My Parent Location Type\"') }}" + + +- name: "8 - Delete location" + networktocode.nautobot.location: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + id: "{{ fist_location['key'] }}" + state: absent + register: test_eight + +- name: "8 - ASSERT" + assert: + that: + - test_eight is changed + - test_eight['diff']['before']['state'] == "present" + - test_eight['diff']['after']['state'] == "absent" + - test_eight['location']['name'] == "Test Location" + - "'deleted' in test_eight['msg']" \ No newline at end of file diff --git a/tests/integration/targets/latest/tasks/location_type.yml b/tests/integration/targets/latest/tasks/location_type.yml index 83e0048d..9f093022 100644 --- a/tests/integration/targets/latest/tasks/location_type.yml +++ b/tests/integration/targets/latest/tasks/location_type.yml @@ -4,128 +4,123 @@ ### PYNAUTOBOT_LOCATION_TYPE ## ## -- block: - - name: "1 - Create location type within Nautobot with only required information" - networktocode.nautobot.location_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location Type - register: test_create_min +- name: "1 - Create location type within Nautobot with only required information" + networktocode.nautobot.location_type: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location Type + register: test_create_min - - name: "1 - ASSERT" - assert: - that: - - test_create_min is changed - - test_create_min['diff']['before']['state'] == "absent" - - test_create_min['diff']['after']['state'] == "present" - - test_create_min['location_type']['name'] == "Test Location Type" - - test_create_min['msg'] == "location_type Test Location Type created" +- name: "1 - ASSERT" + assert: + that: + - test_create_min is changed + - test_create_min['diff']['before']['state'] == "absent" + - test_create_min['diff']['after']['state'] == "present" + - test_create_min['location_type']['name'] == "Test Location Type" + - test_create_min['msg'] == "location_type Test Location Type created" - - name: "2 - Duplicate" - networktocode.nautobot.location_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location Type - register: test_create_idem +- name: "2 - Duplicate" + networktocode.nautobot.location_type: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location Type + register: test_create_idem - - name: "2 - ASSERT" - assert: - that: - - not test_create_idem['changed'] - - test_create_idem['msg'] == "location_type Test Location Type already exists" - - test_create_idem['location_type']['name'] == "Test Location Type" +- name: "2 - ASSERT" + assert: + that: + - not test_create_idem['changed'] + - test_create_idem['msg'] == "location_type Test Location Type already exists" + - test_create_idem['location_type']['name'] == "Test Location Type" - - name: "3 - Update location type" - networktocode.nautobot.location_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location Type - description: Test Location Type Description - register: test_update +- name: "3 - Update location type" + networktocode.nautobot.location_type: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location Type + description: Test Location Type Description + register: test_update - - name: "3 - ASSERT" - assert: - that: - - test_update is changed - - test_update['diff']['before']['description'] == "" - - test_update['diff']['after']['description'] == "Test Location Type Description" +- name: "3 - ASSERT" + assert: + that: + - test_update is changed + - test_update['diff']['before']['description'] == "" + - test_update['diff']['after']['description'] == "Test Location Type Description" - - name: "4 - Create location type with all parameters" - networktocode.nautobot.location_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location Type 2 - description: Test Location Type 2 Description - parent: "{{ test_create_min['location_type']['id'] }}" - nestable: "{{ true if nautobot_version is version('1.5', '>=') else omit }}" - content_types: - - "dcim.device" - state: present - register: test_create_max +- name: "4 - Create location type with all parameters" + networktocode.nautobot.location_type: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location Type 2 + description: Test Location Type 2 Description + parent: "{{ test_create_min['location_type']['id'] }}" + nestable: "{{ true if nautobot_version is version('1.5', '>=') else omit }}" + content_types: + - "dcim.device" + state: present + register: test_create_max - - name: "4 - ASSERT" - assert: - that: - - test_create_max is changed - - test_create_max['diff']['before']['state'] == "absent" - - test_create_max['diff']['after']['state'] == "present" - - test_create_max['location_type']['name'] == "Test Location Type 2" - - test_create_max['msg'] == "location_type Test Location Type 2 created" - - test_create_max['location_type']['description'] == "Test Location Type 2 Description" - - test_create_max['location_type']['parent'] == test_create_min['location_type']['id'] - - test_create_max['location_type']['content_types'] == ["dcim.device"] +- name: "4 - ASSERT" + assert: + that: + - test_create_max is changed + - test_create_max['diff']['before']['state'] == "absent" + - test_create_max['diff']['after']['state'] == "present" + - test_create_max['location_type']['name'] == "Test Location Type 2" + - test_create_max['msg'] == "location_type Test Location Type 2 created" + - test_create_max['location_type']['description'] == "Test Location Type 2 Description" + - test_create_max['location_type']['parent'] == test_create_min['location_type']['id'] + - test_create_max['location_type']['content_types'] == ["dcim.device"] - - name: "5 - Duplicate create with all parameters" - networktocode.nautobot.location_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location Type 2 - description: Test Location Type 2 Description - parent: "{{ test_create_min['location_type']['id'] }}" - nestable: "{{ true if nautobot_version is version('1.5', '>=') else omit }}" - content_types: - - "dcim.device" - state: present - register: test_create_max_idem +- name: "5 - Duplicate create with all parameters" + networktocode.nautobot.location_type: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location Type 2 + description: Test Location Type 2 Description + parent: "{{ test_create_min['location_type']['id'] }}" + nestable: "{{ true if nautobot_version is version('1.5', '>=') else omit }}" + content_types: + - "dcim.device" + state: present + register: test_create_max_idem - - name: "5 - ASSERT" - assert: - that: - - not test_create_max_idem['changed'] - - test_create_max_idem['msg'] == "location_type Test Location Type 2 already exists" - - test_create_max_idem['location_type']['name'] == "Test Location Type 2" +- name: "5 - ASSERT" + assert: + that: + - not test_create_max_idem['changed'] + - test_create_max_idem['msg'] == "location_type Test Location Type 2 already exists" + - test_create_max_idem['location_type']['name'] == "Test Location Type 2" - - name: "6 - Delete location type" - networktocode.nautobot.location_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location Type 2 - state: absent - register: test_delete +- name: "6 - Delete location type" + networktocode.nautobot.location_type: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location Type 2 + state: absent + register: test_delete - - name: "6 - ASSERT" - assert: - that: - - test_delete is changed - - test_delete['diff']['before']['state'] == "present" - - test_delete['diff']['after']['state'] == "absent" - - test_delete['location_type']['name'] == "Test Location Type 2" - - test_delete['msg'] == "location_type Test Location Type 2 deleted" +- name: "6 - ASSERT" + assert: + that: + - test_delete is changed + - test_delete['diff']['before']['state'] == "present" + - test_delete['diff']['after']['state'] == "absent" + - test_delete['location_type']['name'] == "Test Location Type 2" + - test_delete['msg'] == "location_type Test Location Type 2 deleted" - - name: "7 - Delete duplicate" - networktocode.nautobot.location_type: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test Location Type 2 - state: absent - register: test_delete_idem +- name: "7 - Delete duplicate" + networktocode.nautobot.location_type: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Location Type 2 + state: absent + register: test_delete_idem - - name: "7 - ASSERT" - assert: - that: - - not test_delete_idem['changed'] - - test_delete_idem['msg'] == "location_type Test Location Type 2 already absent" - - when: - # Location Types are only available on Nautobot 1.4+ - - "nautobot_version is version('1.4', '>=')" +- name: "7 - ASSERT" + assert: + that: + - not test_delete_idem['changed'] + - test_delete_idem['msg'] == "location_type Test Location Type 2 already absent" diff --git a/tests/integration/targets/latest/tasks/lookup.yml b/tests/integration/targets/latest/tasks/lookup.yml index 77975a70..197f4fa3 100644 --- a/tests/integration/targets/latest/tasks/lookup.yml +++ b/tests/integration/targets/latest/tasks/lookup.yml @@ -4,11 +4,11 @@ ### PYNAUTOBOT_LOOKUP ## ## -- name: "PYNAUTOBOT_LOOKUP 1: Lookup returns exactly two sites" +- name: "PYNAUTOBOT_LOOKUP 1: Lookup returns exactly three locations" assert: that: "{{ query_result|count }} == 3" vars: - query_result: "{{ query('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token) }}" + query_result: "{{ query('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token) }}" - name: "PYNAUTOBOT_LOOKUP 2: Query doesn't return Wibble (sanity check json_query)" assert: @@ -28,17 +28,21 @@ vars: query_result: "{{ query('networktocode.nautobot.lookup', 'vlans', api_endpoint=nautobot_url, token=nautobot_token) }}" +- set_fact: + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + child_test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child-Child Test Location\"') }}" + - name: "PYNAUTOBOT_LOOKUP 5: Add one of two devices for lookup filter test." networktocode.nautobot.device: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "L1" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ test_location['key'] }}" status: "Staged" tags: - - "nolookup" + - "Nolookup" state: present - name: "PYNAUTOBOT_LOOKUP 6: Add two of two devices for lookup filter test." @@ -47,29 +51,29 @@ token: "{{ nautobot_token }}" name: "L2" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site2" + role: "Core Switch" + location: "{{ child_test_location['key'] }}" status: "Staged" tags: - - "lookup" + - "Lookup" state: present - name: "PYNAUTOBOT_LOOKUP 7: Device query returns exactly the L2 device" assert: that: "{{ query_result|json_query('[?value.display==`L2`]')|count }} == 1" vars: - query_result: "{{ query('networktocode.nautobot.lookup', 'devices', api_filter='role=core-switch tag=lookup', api_endpoint=nautobot_url, token=nautobot_token) }}" + query_result: "{{ query('networktocode.nautobot.lookup', 'devices', api_filter='role=\"Core Switch\" tags=Lookup', api_endpoint=nautobot_url, token=nautobot_token) }}" - name: "PYNAUTOBOT_LOOKUP 8: Device query specifying raw data returns payload without key/value dict" assert: that: "{{ query_result|json_query('[?display==`L2`]')|count }} == 1" vars: - query_result: "{{ query('networktocode.nautobot.lookup', 'devices', api_filter='role=core-switch tag=lookup', api_endpoint=nautobot_url, token=nautobot_token, raw_data=True) }}" + query_result: "{{ query('networktocode.nautobot.lookup', 'devices', api_filter='role=\"Core Switch\" tags=Lookup', api_endpoint=nautobot_url, token=nautobot_token, raw_data=True) }}" -- name: "PYNAUTOBOT_LOOKUP 9: Device query specifying multiple sites, Make sure L1 and L2 are in the results" +- name: "PYNAUTOBOT_LOOKUP 9: Device query specifying multiple locations, Make sure L1 and L2 are in the results" assert: that: - "'L1' in {{ query_result |json_query('[*].display') }}" - "'L2' in {{ query_result |json_query('[*].display') }}" vars: - query_result: "{{ query('networktocode.nautobot.lookup', 'devices', api_filter='role=core-switch site=test-site site=test-site2', api_endpoint=nautobot_url, token=nautobot_token, raw_data=True) }}" + query_result: "{{ query('networktocode.nautobot.lookup', 'devices', api_filter='role=\"Core Switch\" location=\"Child Test Location\" location=\"Child-Child Test Location\"', api_endpoint=nautobot_url, token=nautobot_token, raw_data=True) }}" diff --git a/tests/integration/targets/latest/tasks/main.yml b/tests/integration/targets/latest/tasks/main.yml index acc1cd85..365424fb 100644 --- a/tests/integration/targets/latest/tasks/main.yml +++ b/tests/integration/targets/latest/tasks/main.yml @@ -35,23 +35,23 @@ tags: - ip_address -- name: "PYNAUTOBOT_PREFIX TESTS" +- name: "PYNAUTOBOT_IP_ADDRESS_TO_INTERFACE TESTS" include_tasks: - file: "prefix.yml" + file: "ip_address_to_interface.yml" apply: tags: - - prefix + - ip_address_to_interface tags: - - prefix + - ip_address_to_interface -- name: "PYNAUTOBOT_SITE TESTS" +- name: "PYNAUTOBOT_PREFIX TESTS" include_tasks: - file: "site.yml" + file: "prefix.yml" apply: tags: - - site + - prefix tags: - - site + - prefix - name: "PYNAUTOBOT_LOCATION TESTS" include_tasks: @@ -98,15 +98,6 @@ tags: - rack -- name: "PYNAUTOBOT_RACK_ROLE TESTS" - include_tasks: - file: "rack_role.yml" - apply: - tags: - - rack_role - tags: - - rack_role - - name: "PYNAUTOBOT_RACK_GROUP TESTS" include_tasks: file: "rack_group.yml" @@ -143,23 +134,14 @@ tags: - device_type -- name: "PYNAUTOBOT_DEVICE_ROLE TESTS" - include_tasks: - file: "device_role.yml" - apply: - tags: - - device_role - tags: - - device_role - -- name: "PYNAUTOBOT_IPAM_ROLE TESTS" +- name: "PYNAUTOBOT ROLE TESTS" include_tasks: - file: "ipam_role.yml" + file: "role.yml" apply: tags: - - ipam_role + - role tags: - - ipam_role + - role - name: "PYNAUTOBOT_VLAN_GROUP TESTS" include_tasks: @@ -197,24 +179,6 @@ tags: - rir -- name: "PYNAUTOBOT_AGGREGATE TESTS" - include_tasks: - file: "aggregate.yml" - apply: - tags: - - aggregate - tags: - - aggregate - -- name: "PYNAUTOBOT_REGION TESTS" - include_tasks: - file: "region.yml" - apply: - tags: - - region - tags: - - region - - name: "PYNAUTOBOT_DEVICE_BAY TESTS" include_tasks: file: "device_bay.yml" diff --git a/tests/integration/targets/latest/tasks/manufacturer.yml b/tests/integration/targets/latest/tasks/manufacturer.yml index 611861dd..78960888 100644 --- a/tests/integration/targets/latest/tasks/manufacturer.yml +++ b/tests/integration/targets/latest/tasks/manufacturer.yml @@ -10,7 +10,7 @@ token: "{{ nautobot_token }}" name: Test Manufacturer Two state: present - description: "Test Manufactureer" + description: "Test Manufacturer" register: test_one - name: "MANUFACTURER 1: ASSERT - Necessary info creation" @@ -20,8 +20,7 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['manufacturer']['name'] == "Test Manufacturer Two" - - test_one['manufacturer']['slug'] == "test-manufacturer-two" - - test_one['manufacturer']['description'] == "Test Manufactureer" + - test_one['manufacturer']['description'] == "Test Manufacturer" - test_one['msg'] == "manufacturer Test Manufacturer Two created" - name: "MANUFACTURER 2: Create duplicate" @@ -30,7 +29,7 @@ token: "{{ nautobot_token }}" name: Test Manufacturer Two state: present - description: "Test Manufactureer" + description: "Test Manufacturer" register: test_two - name: "MANUFACTURER 2: ASSERT - Create duplicate" @@ -38,15 +37,15 @@ that: - not test_two['changed'] - test_two['manufacturer']['name'] == "Test Manufacturer Two" - - test_two['manufacturer']['slug'] == "test-manufacturer-two" - - test_two['manufacturer']['description'] == "Test Manufactureer" + - test_two['manufacturer']['description'] == "Test Manufacturer" - test_two['msg'] == "manufacturer Test Manufacturer Two already exists" - name: "MANUFACTURER 3: Update" networktocode.nautobot.manufacturer: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - name: test manufacturer two + name: Test Manufacturer Two + description: "Test Manufacturer changed description" state: present register: test_three @@ -54,18 +53,16 @@ assert: that: - test_three['changed'] - - test_three['manufacturer']['name'] == "test manufacturer two" - - test_three['manufacturer']['slug'] == "test-manufacturer-two" - - test_three['manufacturer']['description'] == "Test Manufactureer" - - test_three['msg'] == "manufacturer test manufacturer two updated" + - test_three['manufacturer']['name'] == "Test Manufacturer Two" + - test_three['manufacturer']['description'] == "Test Manufacturer changed description" + - test_three['msg'] == "manufacturer Test Manufacturer Two updated" - name: "MANUFACTURER 4: ASSERT - Delete" networktocode.nautobot.manufacturer: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - name: test manufacturer two + name: Test Manufacturer Two state: absent - description: "Test Manufactureer" register: test_four - name: "MANUFACTURER 3: ASSERT - Delete" @@ -74,7 +71,7 @@ - test_four is changed - test_four['diff']['before']['state'] == "present" - test_four['diff']['after']['state'] == "absent" - - test_four['msg'] == "manufacturer test manufacturer two deleted" + - test_four['msg'] == "manufacturer Test Manufacturer Two deleted" - name: "MANUFACTURER 5: ASSERT - Delete non existing" networktocode.nautobot.manufacturer: diff --git a/tests/integration/targets/latest/tasks/platform.yml b/tests/integration/targets/latest/tasks/platform.yml index 2a7e552e..5187458b 100644 --- a/tests/integration/targets/latest/tasks/platform.yml +++ b/tests/integration/targets/latest/tasks/platform.yml @@ -19,7 +19,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['platform']['name'] == "Test Platform" - - test_one['platform']['slug'] == "test-platform" - test_one['msg'] == "platform Test Platform created" - name: "PLATFORM 2: Create duplicate" @@ -35,7 +34,6 @@ that: - not test_two['changed'] - test_two['platform']['name'] == "Test Platform" - - test_two['platform']['slug'] == "test-platform" - test_two['msg'] == "platform Test Platform already exists" - name: "PLATFORM 3: ASSERT - Update" @@ -62,7 +60,7 @@ - test_three['platform']['napalm_driver'] == "ios" - test_three['msg'] == "platform Test Platform updated" vars: - manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-manufacturer') }}" + manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Manufacturer\"') }}" - name: "PLATFORM 4: ASSERT - Delete" networktocode.nautobot.platform: diff --git a/tests/integration/targets/latest/tasks/plugin_bgp_asn.yml b/tests/integration/targets/latest/tasks/plugin_bgp_asn.yml index d3c24f03..224a0e49 100644 --- a/tests/integration/targets/latest/tasks/plugin_bgp_asn.yml +++ b/tests/integration/targets/latest/tasks/plugin_bgp_asn.yml @@ -4,6 +4,10 @@ ### PYNAUTOBOT_PLUGIN_BGP_ASN ## ## +- set_fact: + active: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Active') }}" + planned: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Planned') }}" + - name: "BGP ASN 1: Creation" networktocode.nautobot.plugin: url: "{{ nautobot_url }}" @@ -13,7 +17,7 @@ ids: asn: 65001 attrs: - status: active + status: Active state: present register: test_one @@ -24,70 +28,70 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['autonomous-systems']['asn'] == 65001 - - test_one['autonomous-systems']['status'] == "active" + - test_one['autonomous-systems']['status'] == active['key'] - test_one['msg'] == "autonomous-systems asn:65001 created" -- name: "BGP ASN 2: Create duplicate" - networktocode.nautobot.plugin: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - plugin: bgp - endpoint: autonomous-systems - ids: - asn: 65001 - attrs: - status: active - state: present - register: test_two - -- name: "BGP ASN 2: ASSERT - Create duplicate" - assert: - that: - - test_two is not changed - - test_two['autonomous-systems']['asn'] == 65001 - - test_two['autonomous-systems']['status'] == "active" - - test_two['msg'] == "autonomous-systems asn:65001 already exists" - -- name: "BGP ASN 3: Update" - networktocode.nautobot.plugin: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - plugin: bgp - endpoint: autonomous-systems - ids: - asn: 65001 - attrs: - status: planned - state: present - register: test_three - -- name: "BGP ASN 3: ASSERT - Updated" - assert: - that: - - test_three is changed - - test_three['diff']['before']['status'] == "active" - - test_three['diff']['after']['status'] == "planned" - - test_three['msg'] == "autonomous-systems asn:65001 updated" - -- name: "BGP ASN 4: Update Idempotent" - networktocode.nautobot.plugin: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - plugin: bgp - endpoint: autonomous-systems - ids: - asn: 65001 - attrs: - status: planned - state: present - register: test_four - -- name: "BGP ASN 4: ASSERT - Update Idempotent" - assert: - that: - - test_four is not changed - - test_four['msg'] == "autonomous-systems asn:65001 already exists" - +#- name: "BGP ASN 2: Create duplicate" # TODO (fixme) status doesn't convert to id, will look into that with issue #244 +# networktocode.nautobot.plugin: +# url: "{{ nautobot_url }}" +# token: "{{ nautobot_token }}" +# plugin: bgp +# endpoint: autonomous-systems +# ids: +# asn: 65001 +# attrs: +# status: Active +# state: present +# register: test_two +# +#- name: "BGP ASN 2: ASSERT - Create duplicate" +# assert: +# that: +# - test_two is not changed +# - test_two['autonomous-systems']['asn'] == 65001 +# - test_two['autonomous-systems']['status'] == active['key'] +# - test_two['msg'] == "autonomous-systems asn:65001 already exists" +# +#- name: "BGP ASN 3: Update" +# networktocode.nautobot.plugin: +# url: "{{ nautobot_url }}" +# token: "{{ nautobot_token }}" +# plugin: bgp +# endpoint: autonomous-systems +# ids: +# asn: 65001 +# attrs: +# status: Planned +# state: present +# register: test_three +# +#- name: "BGP ASN 3: ASSERT - Updated" +# assert: +# that: +# - test_three is changed +# - test_three['diff']['before']['status'] == active['key'] +# - test_three['diff']['after']['status'] == planned['key'] +# - test_three['msg'] == "autonomous-systems asn:65001 updated" +# +#- name: "BGP ASN 4: Update Idempotent" +# networktocode.nautobot.plugin: +# url: "{{ nautobot_url }}" +# token: "{{ nautobot_token }}" +# plugin: bgp +# endpoint: autonomous-systems +# ids: +# asn: 65001 +# attrs: +# status: Planned +# state: present +# register: test_four +# +#- name: "BGP ASN 4: ASSERT - Update Idempotent" +# assert: +# that: +# - test_four is not changed +# - test_four['msg'] == "autonomous-systems asn:65001 already exists" +# - name: "BGP ASN 5: Delete" networktocode.nautobot.plugin: url: "{{ nautobot_url }}" diff --git a/tests/integration/targets/latest/tasks/power_feed.yml b/tests/integration/targets/latest/tasks/power_feed.yml index 86349101..8fa2c943 100644 --- a/tests/integration/targets/latest/tasks/power_feed.yml +++ b/tests/integration/targets/latest/tasks/power_feed.yml @@ -9,6 +9,7 @@ ## - set_fact: power_panel: '{{ lookup(''networktocode.nautobot.lookup'', ''power-panels'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Power Panel"'') }}' + offline: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Offline') }}" - name: "POWER_FEED 1: Necessary info creation" networktocode.nautobot.power_feed: @@ -54,7 +55,7 @@ token: "{{ nautobot_token }}" name: Power Feed power_panel: Test Power Panel - status: offline + status: Offline type: redundant supply: dc phase: three-phase @@ -69,7 +70,7 @@ assert: that: - test_three is changed - - test_three['diff']['after']['status'] == "offline" + - test_three['diff']['after']['status'] == offline['key'] - test_three['diff']['after']['type'] == "redundant" - test_three['diff']['after']['supply'] == "dc" - test_three['diff']['after']['phase'] == "three-phase" @@ -79,7 +80,7 @@ - test_three['diff']['after']['comments'] == "totally normal power feed" - test_three['power_feed']['name'] == "Power Feed" - test_three['power_feed']['power_panel'] == power_panel['key'] - - test_three['power_feed']['status'] == "offline" + - test_three['power_feed']['status'] == offline['key'] - test_three['power_feed']['type'] == "redundant" - test_three['power_feed']['supply'] == "dc" - test_three['power_feed']['phase'] == "three-phase" diff --git a/tests/integration/targets/latest/tasks/power_outlet.yml b/tests/integration/targets/latest/tasks/power_outlet.yml index 57d89827..9ac972a1 100644 --- a/tests/integration/targets/latest/tasks/power_outlet.yml +++ b/tests/integration/targets/latest/tasks/power_outlet.yml @@ -7,14 +7,17 @@ ### PYNAUTOBOT_POWER_OUTLET ## ## +- set_fact: + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + - name: "POWER_PORT 0: Create device for testing power ports" networktocode.nautobot.device: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Device Power Outlet device_type: Cisco Test - device_role: Core Switch - site: Test Site + role: Core Switch + location: "{{ test_location['key'] }}" status: "Active" state: present diff --git a/tests/integration/targets/latest/tasks/power_outlet_template.yml b/tests/integration/targets/latest/tasks/power_outlet_template.yml index d9ad28f5..9a91c9bf 100644 --- a/tests/integration/targets/latest/tasks/power_outlet_template.yml +++ b/tests/integration/targets/latest/tasks/power_outlet_template.yml @@ -24,7 +24,7 @@ state: present - set_fact: - device_type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=device-type-power-outlet') }}" + device_type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Device Type Power Outlet\"') }}" power_port_template: '{{ lookup(''networktocode.nautobot.lookup'', ''power-port-templates'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Power Port Template - Outlet"'') }}' - name: "POWER_OUTLET_TEMPLATE 1: Necessary info creation" @@ -80,12 +80,12 @@ that: - test_three is changed - test_three['diff']['after']['type'] == "ita-e" - - test_three['diff']['after']['power_port'] == power_port_template['key'] + - test_three['diff']['after']['power_port_template'] == power_port_template['key'] - test_three['diff']['after']['feed_leg'] == "B" - test_three['power_outlet_template']['name'] == "Power Outlet Template" - test_three['power_outlet_template']['device_type'] == device_type['key'] - test_three['power_outlet_template']['type'] == "ita-e" - - test_three['power_outlet_template']['power_port'] == power_port_template['key'] + - test_three['power_outlet_template']['power_port_template'] == power_port_template['key'] - test_three['power_outlet_template']['feed_leg'] == "B" - test_three['msg'] == "power_outlet_template Power Outlet Template updated" diff --git a/tests/integration/targets/latest/tasks/power_panel.yml b/tests/integration/targets/latest/tasks/power_panel.yml index 0e09dbe1..8a95655b 100644 --- a/tests/integration/targets/latest/tasks/power_panel.yml +++ b/tests/integration/targets/latest/tasks/power_panel.yml @@ -8,15 +8,15 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - rack_group: "{{ lookup('networktocode.nautobot.lookup', 'rack-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-rack-group') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + rack_group: "{{ lookup('networktocode.nautobot.lookup', 'rack-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Parent Rack Group\"') }}" - name: "POWER_PANEL 1: Necessary info creation" networktocode.nautobot.power_panel: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Power Panel - site: Test Site + location: "{{ test_location['key'] }}" state: present register: test_one @@ -27,7 +27,7 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['power_panel']['name'] == "Power Panel" - - test_one['power_panel']['site'] == test_site['key'] + - test_one['power_panel']['location'] == test_location['key'] - test_one['msg'] == "power_panel Power Panel created" - name: "POWER_PANEL 2: Create duplicate" @@ -35,7 +35,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Power Panel - site: Test Site + location: "{{ test_location['key'] }}" state: present register: test_two @@ -44,7 +44,7 @@ that: - not test_two['changed'] - test_two['power_panel']['name'] == "Power Panel" - - test_two['power_panel']['site'] == test_site['key'] + - test_two['power_panel']['location'] == test_location['key'] - test_two['msg'] == "power_panel Power Panel already exists" - name: "POWER_PANEL 3: Update power_panel with other fields" @@ -52,8 +52,8 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Power Panel - site: Test Site - rack_group: Test Rack Group + location: "{{ test_location['key'] }}" + rack_group: Parent Rack Group state: present register: test_three @@ -63,7 +63,7 @@ - test_three is changed - test_three['diff']['after']['rack_group'] == rack_group['key'] - test_three['power_panel']['name'] == "Power Panel" - - test_three['power_panel']['site'] == test_site['key'] + - test_three['power_panel']['location'] == test_location['key'] - test_three['power_panel']['rack_group'] == rack_group['key'] - test_three['msg'] == "power_panel Power Panel updated" @@ -72,7 +72,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Power Panel 2 - site: Test Site + location: "{{ test_location['key'] }}" state: present register: test_four @@ -83,7 +83,7 @@ - test_four['diff']['before']['state'] == "absent" - test_four['diff']['after']['state'] == "present" - test_four['power_panel']['name'] == "Power Panel 2" - - test_four['power_panel']['site'] == test_site['key'] + - test_four['power_panel']['location'] == test_location['key'] - test_four['msg'] == "power_panel Power Panel 2 created" - name: "POWER_PANEL 5: Delete Power Panel" @@ -91,7 +91,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Power Panel 2 - site: Test Site + location: "{{ test_location['key'] }}" state: absent register: test_five diff --git a/tests/integration/targets/latest/tasks/power_port.yml b/tests/integration/targets/latest/tasks/power_port.yml index 8dd8be87..8ecb11d0 100644 --- a/tests/integration/targets/latest/tasks/power_port.yml +++ b/tests/integration/targets/latest/tasks/power_port.yml @@ -7,15 +7,18 @@ ### PYNAUTOBOT_POWER_PORT ## ## +- set_fact: + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + - name: "POWER_PORT 0: Create device for testing power ports" networktocode.nautobot.device: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Device Power Tests device_type: Cisco Test - device_role: Core Switch + role: Core Switch status: "Active" - site: Test Site + location: "{{ test_location['key'] }}" state: present - set_fact: diff --git a/tests/integration/targets/latest/tasks/power_port_template.yml b/tests/integration/targets/latest/tasks/power_port_template.yml index 168e7320..efc5c8de 100644 --- a/tests/integration/targets/latest/tasks/power_port_template.yml +++ b/tests/integration/targets/latest/tasks/power_port_template.yml @@ -16,7 +16,7 @@ state: present - set_fact: - device_type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=device-type-power-tests') }}" + device_type: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Device Type Power Tests\"') }}" - name: "POWER_PORT_TEMPLATE 1: Necessary info creation" networktocode.nautobot.power_port_template: diff --git a/tests/integration/targets/latest/tasks/prefix.yml b/tests/integration/targets/latest/tasks/prefix.yml index e28ee36b..f1d3a0ab 100644 --- a/tests/integration/targets/latest/tasks/prefix.yml +++ b/tests/integration/targets/latest/tasks/prefix.yml @@ -5,11 +5,14 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" - vrf: '{{ lookup(''networktocode.nautobot.lookup'', ''vrfs'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test VRF"'') }}' - vlan_group: "{{ lookup('networktocode.nautobot.lookup', 'vlan-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-vlan-group') }}" + test_child_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" + vlan_group: "{{ lookup('networktocode.nautobot.lookup', 'vlan-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Vlan Group\"') }}" + reserved: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Reserved') }}" + active: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Active') }}" + global_namespace: "{{ lookup('networktocode.nautobot.lookup', 'namespaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Global') }}" + private_namespace: "{{ lookup('networktocode.nautobot.lookup', 'namespaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Private') }}" - name: "1 - Create prefix within Nautobot with only required information" networktocode.nautobot.prefix: @@ -28,6 +31,7 @@ - test_one['diff']['after']['state'] == "present" - test_one['msg'] == "prefix 10.156.0.0/19 created" - test_one['prefix']['prefix'] == "10.156.0.0/19" + - test_one['prefix']['namespace'] == global_namespace['key'] - name: "2 - Duplicate" networktocode.nautobot.prefix: @@ -50,7 +54,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" prefix: 10.156.0.0/19 - site: Test Site + location: "{{ test_child_location['key'] }}" status: Reserved description: "This prefix has been updated" state: present @@ -60,13 +64,13 @@ assert: that: - test_three is changed - - test_three['diff']['after']['site'] == test_site['key'] - - test_three['diff']['after']['status'] == "reserved" + - test_three['diff']['after']['location'] == test_child_location['key'] + - test_three['diff']['after']['status'] == reserved['key'] - test_three['diff']['after']['description'] == "This prefix has been updated" - test_three['msg'] == "prefix 10.156.0.0/19 updated" - test_three['prefix']['prefix'] == "10.156.0.0/19" - - test_three['prefix']['site'] == test_site['key'] - - test_three['prefix']['status'] == "reserved" + - test_three['prefix']['location'] == test_child_location['key'] + - test_three['prefix']['status'] == reserved['key'] - test_three['prefix']['description'] == "This prefix has been updated" - name: "4 - Delete prefix within nautobot" @@ -89,20 +93,19 @@ networktocode.nautobot.prefix: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - family: 4 + ip_version: 4 prefix: 10.156.32.0/19 - site: Test Site - vrf: Test VRF + location: "{{ test_child_location['key'] }}" tenant: Test Tenant vlan: name: Test VLAN - site: Test Site + location: "{{ test_child_location['key'] }}" tenant: Test Tenant vlan_group: Test Vlan Group status: Reserved - prefix_role: Network of care + role: Network of care description: Test description - is_pool: true + type: Pool tags: - "Schnozzberry" state: present @@ -116,19 +119,18 @@ - test_five['diff']['after']['state'] == "present" - test_five['msg'] == "prefix 10.156.32.0/19 created" - test_five['prefix']['prefix'] == "10.156.32.0/19" - - test_five['prefix']['family'] == 4 - - test_five['prefix']['site'] == test_site['key'] - - test_five['prefix']['vrf'] == vrf['key'] + - test_five['prefix']['ip_version'] == 4 + - test_five['prefix']['location'] == test_child_location['key'] - test_five['prefix']['tenant'] == tenant['key'] - test_five['prefix']['vlan'] == vlan['key'] - - test_five['prefix']['status'] == "reserved" - - test_five['prefix']['role'] == role['key'] + - test_five['prefix']['status'] == reserved['key'] + - test_five['prefix']['role'] == prefix_role['key'] - test_five['prefix']['description'] == "Test description" - - test_five['prefix']['is_pool'] == true + - test_five['prefix']['type'] == "pool" - test_five['prefix']['tags'][0] == tag_schnozzberry['key'] vars: - role: '{{ lookup(''networktocode.nautobot.lookup'', ''roles'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''slug="network-of-care"'') }}' - vlan: '{{ lookup(''networktocode.nautobot.lookup'', ''vlans'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test VLAN"'') }}' + prefix_role: "{{ lookup('networktocode.nautobot.lookup', 'roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Network of care\"') }}" + vlan: "{{ lookup('networktocode.nautobot.lookup', 'vlans', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test VLAN\"') }}" - name: "6 - Get a new /24 inside 10.156.0.0/19 within Nautobot - Parent doesn't exist" networktocode.nautobot.prefix: @@ -190,8 +192,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" prefix: 10.157.0.0/19 - vrf: Test VRF - site: Test Site + location: "{{ test_child_location['key'] }}" status: "Active" state: present register: test_nine @@ -204,8 +205,7 @@ - test_nine['diff']['after']['state'] == "present" - test_nine['msg'] == "prefix 10.157.0.0/19 created" - test_nine['prefix']['prefix'] == "10.157.0.0/19" - - test_nine['prefix']['site'] == test_site['key'] - - test_nine['prefix']['vrf'] == vrf['key'] + - test_nine['prefix']['location'] == test_child_location['key'] - name: "10 - Get a new /24 inside 10.157.0.0/19 within Nautobot with additional values" networktocode.nautobot.prefix: @@ -213,8 +213,7 @@ token: "{{ nautobot_token }}" parent: 10.157.0.0/19 prefix_length: 24 - vrf: Test VRF - site: Test Site + location: "{{ test_child_location['key'] }}" status: "Active" state: present first_available: yes @@ -228,8 +227,7 @@ - test_ten['diff']['after']['state'] == "present" - test_ten['msg'] == "prefix 10.157.0.0/24 created" - test_ten['prefix']['prefix'] == "10.157.0.0/24" - - test_ten['prefix']['site'] == test_site['key'] - - test_ten['prefix']['vrf'] == vrf['key'] + - test_ten['prefix']['location'] == test_child_location['key'] - name: "11 - Get a new /24 inside 10.156.0.0/19 within Nautobot" networktocode.nautobot.prefix: @@ -250,3 +248,49 @@ - test_eleven['diff']['after']['state'] == "present" - test_eleven['msg'] == "prefix 10.156.1.0/24 created" - test_eleven['prefix']['prefix'] == "10.156.1.0/24" + +- name: "12 - Create 10.157.0.0/19 within Nautobot in Private namespace" + networktocode.nautobot.prefix: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + prefix: 10.157.0.0/19 + location: "{{ test_child_location['key'] }}" + namespace: Private + status: "Active" + state: present + register: test_twelve + +- name: "12 - ASSERT" + assert: + that: + - test_twelve is changed + - test_twelve['diff']['before']['state'] == "absent" + - test_twelve['diff']['after']['state'] == "present" + - test_twelve['msg'] == "prefix 10.157.0.0/19 created" + - test_twelve['prefix']['prefix'] == "10.157.0.0/19" + - test_twelve['prefix']['namespace'] == private_namespace['key'] + - test_twelve['prefix']['location'] == test_child_location['key'] + +- name: "13 - Get a new /24 inside 10.157.0.0/19 within Nautobot in Private namespace" + networktocode.nautobot.prefix: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + parent: 10.157.0.0/19 + prefix_length: 24 + location: "{{ test_child_location['key'] }}" + namespace: Private + status: "Active" + state: present + first_available: yes + register: test_thirteen + +- name: "13 - ASSERT" + assert: + that: + - test_thirteen is changed + - test_thirteen['diff']['before']['state'] == "absent" + - test_thirteen['diff']['after']['state'] == "present" + - test_thirteen['msg'] == "prefix 10.157.0.0/24 created" + - test_thirteen['prefix']['prefix'] == "10.157.0.0/24" + - test_thirteen['prefix']['namespace'] == private_namespace['key'] + - test_thirteen['prefix']['location'] == test_child_location['key'] diff --git a/tests/integration/targets/latest/tasks/provider.yml b/tests/integration/targets/latest/tasks/provider.yml index 73c0a475..86e36f58 100644 --- a/tests/integration/targets/latest/tasks/provider.yml +++ b/tests/integration/targets/latest/tasks/provider.yml @@ -19,7 +19,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['provider']['name'] == "Test Provider One" - - test_one['provider']['slug'] == "test-provider-one" - test_one['msg'] == "provider Test Provider One created" - name: "PYNAUTOBOT_PROVIDER 2: Duplicate" @@ -35,7 +34,6 @@ that: - not test_two['changed'] - test_two['provider']['name'] == "Test Provider One" - - test_two['provider']['slug'] == "test-provider-one" - test_two['msg'] == "provider Test Provider One already exists" - name: "PYNAUTOBOT_PROVIDER 3: Update provider with other fields" @@ -63,7 +61,6 @@ - test_three['diff']['after']['admin_contact'] == "admin@provider.net" - test_three['diff']['after']['comments'] == "BAD PROVIDER" - test_three['provider']['name'] == "Test Provider One" - - test_three['provider']['slug'] == "test-provider-one" - test_three['provider']['asn'] == 65001 - test_three['provider']['account'] == "200129104" - test_three['provider']['portal_url'] == "http://provider.net" @@ -85,7 +82,6 @@ that: - test_four is changed - test_four['provider']['name'] == "Test Provider One" - - test_four['provider']['slug'] == "test-provider-one" - test_four['provider']['asn'] == 65001 - test_four['provider']['account'] == "200129104" - test_four['provider']['portal_url'] == "http://provider.net" diff --git a/tests/integration/targets/latest/tasks/rack.yml b/tests/integration/targets/latest/tasks/rack.yml index fd3cfc12..483eac20 100644 --- a/tests/integration/targets/latest/tasks/rack.yml +++ b/tests/integration/targets/latest/tasks/rack.yml @@ -5,19 +5,21 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" - rack_role: "{{ lookup('networktocode.nautobot.lookup', 'rack-roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-rack-role') }}" - rack_group: "{{ lookup('networktocode.nautobot.lookup', 'rack-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-rack-group') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" + rack_role: "{{ lookup('networktocode.nautobot.lookup', 'roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Rack Role\"') }}" + rack_group: "{{ lookup('networktocode.nautobot.lookup', 'rack-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Parent Rack Group\"') }}" + available: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Available') }}" - name: "1 - Test rack creation" networktocode.nautobot.rack: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test rack one" + rack_group: "Parent Rack Group" status: "Available" - site: "Test Site" + location: "{{ test_location['key'] }}" register: test_one - name: "1 - ASSERT" @@ -27,13 +29,15 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['rack']['name'] == "Test rack one" - - test_one['rack']['site'] == test_site['key'] + - test_one['rack']['location'] == test_location['key'] + - test_one['rack']['rack_group'] == rack_group['key'] - name: "Test duplicate rack" networktocode.nautobot.rack: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test rack one" + rack_group: "Parent Rack Group" status: "Available" register: test_two @@ -42,15 +46,17 @@ that: - not test_two['changed'] - test_two['rack']['name'] == "Test rack one" - - test_two['rack']['site'] == test_site['key'] + - test_two['rack']['location'] == test_location['key'] + - test_two['rack']['rack_group'] == rack_group['key'] - test_two['msg'] == "rack Test rack one already exists" - name: "3 - Create new rack with similar name" networktocode.nautobot.rack: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - name: Test rack - Test Site - site: Test Site + name: Test rack - Child Test Location + location: "{{ test_location['key'] }}" + rack_group: "Parent Rack Group" status: "Available" state: present register: test_three @@ -61,16 +67,18 @@ - test_three is changed - test_three['diff']['before']['state'] == "absent" - test_three['diff']['after']['state'] == "present" - - test_three['rack']['name'] == "Test rack - Test Site" - - test_three['rack']['site'] == test_site['key'] - - test_three['msg'] == "rack Test rack - Test Site created" + - test_three['rack']['name'] == "Test rack - Child Test Location" + - test_three['rack']['location'] == test_location['key'] + - test_three['rack']['rack_group'] == rack_group['key'] + - test_three['msg'] == "rack Test rack - Child Test Location created" - name: "4 - Attempt to create Test rack one again" networktocode.nautobot.rack: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test rack one - site: Test Site + location: "{{ test_location['key'] }}" + rack_group: "Parent Rack Group" status: "Available" state: present register: test_four @@ -80,7 +88,8 @@ that: - not test_four['changed'] - test_four['rack']['name'] == "Test rack one" - - test_four['rack']['site'] == test_site['key'] + - test_four['rack']['location'] == test_location['key'] + - test_four['rack']['rack_group'] == rack_group['key'] - test_four['msg'] == "rack Test rack one already exists" - name: "5 - Update Test rack one with more options" @@ -88,9 +97,9 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test rack one - site: Test Site - rack_role: "Test Rack Role" - rack_group: "Test Rack Group" + location: "{{ test_location['key'] }}" + role: "Test Rack Role" + rack_group: "Parent Rack Group" facility_id: "EQUI10291" tenant: "Test Tenant" status: Available @@ -115,7 +124,6 @@ - test_five['diff']['after']['asset_tag'] == "1234" - test_five['diff']['after']['comments'] == "Just testing rack module" - test_five['diff']['after']['facility_id'] == "EQUI10291" - - test_five['diff']['after']['group'] == rack_group['key'] - test_five['diff']['after']['outer_depth'] == 24 - test_five['diff']['after']['outer_unit'] == "in" - test_five['diff']['after']['outer_width'] == 32 @@ -127,17 +135,17 @@ - test_five['diff']['after']['u_height'] == 48 - test_five['diff']['after']['width'] == 23 - test_five['rack']['name'] == "Test rack one" - - test_five['rack']['site'] == test_site['key'] + - test_five['rack']['location'] == test_location['key'] - test_five['rack']['asset_tag'] == "1234" - test_five['rack']['comments'] == "Just testing rack module" - test_five['rack']['facility_id'] == "EQUI10291" - - test_five['rack']['group'] == rack_group['key'] + - test_five['rack']['rack_group'] == rack_group['key'] - test_five['rack']['outer_depth'] == 24 - test_five['rack']['outer_unit'] == "in" - test_five['rack']['outer_width'] == 32 - test_five['rack']['role'] == rack_role['key'] - test_five['rack']['serial'] == "FXS10001" - - test_five['rack']['status'] == "available" + - test_five['rack']['status'] == available['key'] - test_five['rack']['tenant'] == tenant['key'] - test_five['rack']['tags'][0] == tag_schnozzberry['key'] - test_five['rack']['type'] == "2-post-frame" @@ -150,9 +158,9 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test rack one - site: Test Site - rack_role: "Test Rack Role" - rack_group: "Test Rack Group" + location: "{{ test_location['key'] }}" + role: "Test Rack Role" + rack_group: "Parent Rack Group" facility_id: "EQUI10291" tenant: "Test Tenant" status: Available @@ -175,17 +183,17 @@ that: - test_six is not changed - test_six['rack']['name'] == "Test rack one" - - test_six['rack']['site'] == test_site['key'] + - test_six['rack']['location'] == test_location['key'] - test_six['rack']['asset_tag'] == "1234" - test_six['rack']['comments'] == "Just testing rack module" - test_six['rack']['facility_id'] == "EQUI10291" - - test_six['rack']['group'] == rack_group['key'] + - test_six['rack']['rack_group'] == rack_group['key'] - test_six['rack']['outer_depth'] == 24 - test_six['rack']['outer_unit'] == "in" - test_six['rack']['outer_width'] == 32 - test_six['rack']['role'] == rack_role['key'] - test_six['rack']['serial'] == "FXS10001" - - test_six['rack']['status'] == "available" + - test_six['rack']['status'] == available['key'] - test_six['rack']['tenant'] == tenant['key'] - test_six['rack']['tags'][0] == tag_schnozzberry['key'] - test_six['rack']['type'] == "2-post-frame" @@ -197,7 +205,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test rack two - site: Test Site + location: "{{ test_location['key'] }}" serial: "FXS10001" asset_tag: "1234" status: Available diff --git a/tests/integration/targets/latest/tasks/rack_group.yml b/tests/integration/targets/latest/tasks/rack_group.yml index ca79ed2f..74358740 100644 --- a/tests/integration/targets/latest/tasks/rack_group.yml +++ b/tests/integration/targets/latest/tasks/rack_group.yml @@ -5,14 +5,14 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" - name: "RACK_GROUP 1: Necessary info creation" networktocode.nautobot.rack_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Rack Group - site: Test Site + location: "{{ test_location['key'] }}" state: present register: test_one @@ -23,8 +23,7 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['rack_group']['name'] == "Rack Group" - - test_one['rack_group']['slug'] == "rack-group" - - test_one['rack_group']['site'] == test_site['key'] + - test_one['rack_group']['location'] == test_location['key'] - test_one['msg'] == "rack_group Rack Group created" - name: "RACK_GROUP 2: Create duplicate" @@ -32,7 +31,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Rack Group - site: Test Site + location: "{{ test_location['key'] }}" state: present register: test_two @@ -41,8 +40,7 @@ that: - not test_two['changed'] - test_two['rack_group']['name'] == "Rack Group" - - test_two['rack_group']['slug'] == "rack-group" - - test_two['rack_group']['site'] == test_site['key'] + - test_two['rack_group']['location'] == test_location['key'] - test_two['msg'] == "rack_group Rack Group already exists" - name: "RACK_GROUP 3: ASSERT - Delete" diff --git a/tests/integration/targets/latest/tasks/rack_role.yml b/tests/integration/targets/latest/tasks/rack_role.yml deleted file mode 100644 index 903cd647..00000000 --- a/tests/integration/targets/latest/tasks/rack_role.yml +++ /dev/null @@ -1,77 +0,0 @@ ---- -## -## -### PYNAUTOBOT_RACK_ROLE -## -## -- name: "RACK_ROLE 1: Necessary info creation" - networktocode.nautobot.rack_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Rack Role - color: "ffffff" - state: present - register: test_one - -- name: "RACK_ROLE 1: ASSERT - Necessary info creation" - assert: - that: - - test_one is changed - - test_one['diff']['before']['state'] == "absent" - - test_one['diff']['after']['state'] == "present" - - test_one['rack_role']['name'] == "Rack Role" - - test_one['rack_role']['slug'] == "rack-role" - - test_one['rack_role']['color'] == "ffffff" - - test_one['msg'] == "rack_role Rack Role created" - -- name: "RACK_ROLE 2: Create duplicate" - networktocode.nautobot.rack_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Rack Role - state: present - register: test_two - -- name: "RACK_ROLE 1: ASSERT - Create duplicate" - assert: - that: - - not test_two['changed'] - - test_two['rack_role']['name'] == "Rack Role" - - test_two['rack_role']['slug'] == "rack-role" - - test_two['rack_role']['color'] == "ffffff" - - test_two['msg'] == "rack_role Rack Role already exists" - -- name: "RACK_ROLE 3: Update" - networktocode.nautobot.rack_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Rack Role - color: "003EFF" - state: present - register: test_three - -- name: "RACK_ROLE 3: ASSERT - Update" - assert: - that: - - test_three is changed - - test_three['diff']['after']['color'] == "003eff" - - test_three['rack_role']['name'] == "Rack Role" - - test_three['rack_role']['slug'] == "rack-role" - - test_three['rack_role']['color'] == "003eff" - - test_three['msg'] == "rack_role Rack Role updated" - -- name: "RACK_ROLE 4: Delete" - networktocode.nautobot.rack_role: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Rack Role - state: absent - register: test_four - -- name: "RACK_ROLE 4: ASSERT - Update" - assert: - that: - - test_four is changed - - test_four['diff']['before']['state'] == "present" - - test_four['diff']['after']['state'] == "absent" - - test_four['msg'] == "rack_role Rack Role deleted" diff --git a/tests/integration/targets/latest/tasks/rear_port_template.yml b/tests/integration/targets/latest/tasks/rear_port_template.yml index 77a4c566..bf80ea8b 100644 --- a/tests/integration/targets/latest/tasks/rear_port_template.yml +++ b/tests/integration/targets/latest/tasks/rear_port_template.yml @@ -8,8 +8,8 @@ ## ## - set_fact: - cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco-test') }}" - arista_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=arista-test') }}" + cisco_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Cisco Test\"') }}" + arista_test: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Arista Test\"') }}" - name: "REAR_PORT_TEMPLATE 1: Necessary info creation" networktocode.nautobot.rear_port_template: diff --git a/tests/integration/targets/latest/tasks/region.yml b/tests/integration/targets/latest/tasks/region.yml deleted file mode 100644 index 0dab9f8f..00000000 --- a/tests/integration/targets/latest/tasks/region.yml +++ /dev/null @@ -1,78 +0,0 @@ ---- -## -## -### PYNAUTOBOT_REGION -## -## -- set_fact: - region: "{{ lookup('networktocode.nautobot.lookup', 'regions', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-region') }}" - -- name: "REGION 1: Necessary info creation" - networktocode.nautobot.region: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Region One" - state: present - register: test_one - -- name: "REGION 1: ASSERT - Necessary info creation" - assert: - that: - - test_one is changed - - test_one['diff']['before']['state'] == "absent" - - test_one['diff']['after']['state'] == "present" - - test_one['region']['name'] == "Test Region One" - - test_one['region']['slug'] == "test-region-one" - - test_one['msg'] == "region Test Region One created" - -- name: "REGION 2: Create duplicate" - networktocode.nautobot.region: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Region One" - state: present - register: test_two - -- name: "REGION 2: ASSERT - Create duplicate" - assert: - that: - - not test_two['changed'] - - test_two['region']['name'] == "Test Region One" - - test_two['region']['slug'] == "test-region-one" - - test_two['msg'] == "region Test Region One already exists" - -- name: "REGION 3: ASSERT - Update" - networktocode.nautobot.region: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Region One" - parent_region: "Test Region" - state: present - register: test_three - -- name: "REGION 3: ASSERT - Updated" - assert: - that: - - test_three is changed - - test_three['diff']['after']['parent'] == region['key'] - - test_three['region']['name'] == "Test Region One" - - test_three['region']['slug'] == "test-region-one" - - test_three['region']['parent'] == region['key'] - - test_three['msg'] == "region Test Region One updated" - -- name: "REGION 4: ASSERT - Delete" - networktocode.nautobot.region: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Region One" - state: absent - register: test_four - -- name: "REGION 4: ASSERT - Delete" - assert: - that: - - test_four is changed - - test_four['region']['name'] == "Test Region One" - - test_four['region']['slug'] == "test-region-one" - - test_four['region']['parent'] == region['key'] - - test_four['msg'] == "region Test Region One deleted" diff --git a/tests/integration/targets/latest/tasks/relationship_association.yml b/tests/integration/targets/latest/tasks/relationship_association.yml index 98fd8157..2f1995ac 100644 --- a/tests/integration/targets/latest/tasks/relationship_association.yml +++ b/tests/integration/targets/latest/tasks/relationship_association.yml @@ -6,7 +6,7 @@ ## - set_fact: - relationship: "{{ lookup('networktocode.nautobot.lookup', 'relationships', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"VLAN to Device\"') }}" + relationship: "{{ lookup('networktocode.nautobot.lookup', 'relationships', api_endpoint=nautobot_url, token=nautobot_token, api_filter='label=\"VLAN to Device\"') }}" vlan: "{{ lookup('networktocode.nautobot.lookup', 'vlans', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test VLAN\"') }}" device: "{{ lookup('networktocode.nautobot.lookup', 'devices', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=TestDeviceR1') }}" diff --git a/tests/integration/targets/latest/tasks/rir.yml b/tests/integration/targets/latest/tasks/rir.yml index 4f55baac..af1a4848 100644 --- a/tests/integration/targets/latest/tasks/rir.yml +++ b/tests/integration/targets/latest/tasks/rir.yml @@ -19,7 +19,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['rir']['name'] == "Test RIR One" - - test_one['rir']['slug'] == "test-rir-one" - test_one['msg'] == "rir Test RIR One created" - name: "RIR 2: Create duplicate" @@ -35,7 +34,6 @@ that: - not test_two['changed'] - test_two['rir']['name'] == "Test RIR One" - - test_two['rir']['slug'] == "test-rir-one" - test_two['msg'] == "rir Test RIR One already exists" - name: "RIR 3: ASSERT - Update" @@ -53,7 +51,6 @@ - test_three is changed - test_three['diff']['after']['is_private'] == true - test_three['rir']['name'] == "Test RIR One" - - test_three['rir']['slug'] == "test-rir-one" - test_three['rir']['is_private'] == true - test_three['msg'] == "rir Test RIR One updated" @@ -70,6 +67,5 @@ that: - test_four is changed - test_four['rir']['name'] == "Test RIR One" - - test_four['rir']['slug'] == "test-rir-one" - test_four['rir']['is_private'] == true - test_four['msg'] == "rir Test RIR One deleted" diff --git a/tests/integration/targets/latest/tasks/role.yml b/tests/integration/targets/latest/tasks/role.yml new file mode 100644 index 00000000..01053ffa --- /dev/null +++ b/tests/integration/targets/latest/tasks/role.yml @@ -0,0 +1,83 @@ +--- +## +## +### PYNAUTOBOT_ROLE +## +## +- name: "ROLE 1: Necessary info creation" + networktocode.nautobot.role: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Role + color: "ffffff" + content_types: + - "dcim.device" + state: present + register: test_one + +- name: "ROLE 1: ASSERT - Necessary info creation" + assert: + that: + - test_one is changed + - test_one['diff']['before']['state'] == "absent" + - test_one['diff']['after']['state'] == "present" + - test_one['role']['name'] == "Test Role" + - test_one['role']['content_types'] == ["dcim.device"] + - test_one['role']['color'] == "ffffff" + - test_one['msg'] == "role Test Role created" + +- name: "ROLE 2: Create duplicate" + networktocode.nautobot.role: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Role + content_types: + - "dcim.device" + state: present + register: test_two + +- name: "ROLE 2: ASSERT - Create duplicate" + assert: + that: + - not test_two['changed'] + - test_two['role']['name'] == "Test Role" + - test_two['role']['content_types'] == ["dcim.device"] + - test_two['role']['color'] == "ffffff" + - test_two['msg'] == "role Test Role already exists" + +- name: "ROLE 3: Update" + networktocode.nautobot.role: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Role + content_types: + - "dcim.device" + color: "003EFF" + state: present + register: test_three + +- name: "ROLE 3: ASSERT - Update" + assert: + that: + - test_three is changed + - test_three['diff']['after']['color'] == "003eff" + - test_three['role']['name'] == "Test Role" + - test_three['role']['content_types'] == ["dcim.device"] + - test_three['role']['color'] == "003eff" + - test_three['msg'] == "role Test Role updated" + +- name: "ROLE 4: Delete" + networktocode.nautobot.role: + url: "{{ nautobot_url }}" + token: "{{ nautobot_token }}" + name: Test Role + state: absent + register: test_four + +- name: "ROLE 4: ASSERT - Update" + assert: + that: + - test_four is changed + - test_four['diff']['before']['state'] == "present" + - test_four['diff']['after']['state'] == "absent" + - test_four['msg'] == "role Test Role deleted" diff --git a/tests/integration/targets/latest/tasks/route_target.yml b/tests/integration/targets/latest/tasks/route_target.yml index 7817027e..afeaefae 100644 --- a/tests/integration/targets/latest/tasks/route_target.yml +++ b/tests/integration/targets/latest/tasks/route_target.yml @@ -2,7 +2,7 @@ # # ADD (CHECK MODE) - set_fact: - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" - name: "PYNAUTOBOT_ROUTE_TARGET_ADD: Check Mode - Add all fields except description" networktocode.nautobot.route_target: @@ -11,8 +11,8 @@ name: "65000:65001" tenant: "Test Tenant" tags: - - first - - second + - First + - Second check_mode: yes register: test_results @@ -35,8 +35,8 @@ name: "65000:65001" tenant: "Test Tenant" tags: - - first - - second + - First + - Second register: test_results - name: "PYNAUTOBOT_ROUTE_TARGET_ADD: (ASSERT) Add all fields except description" @@ -58,8 +58,8 @@ name: "65000:65001" tenant: "Test Tenant" tags: - - first - - second + - First + - Second register: test_results - name: "PYNAUTOBOT_ROUTE_TARGET_ADD_IDEM: (IDEMPOTENT) Add all fields except description" @@ -81,8 +81,8 @@ description: "NEW DESCRIPTION" tenant: "Test Tenant" tags: - - first - - second + - First + - Second check_mode: yes register: test_results @@ -107,8 +107,8 @@ tenant: "Test Tenant" description: "NEW DESCRIPTION" tags: - - first - - second + - First + - Second register: test_results - name: "PYNAUTOBOT_ROUTE_TARGET_UPDATE: (ASSERT) Update description" @@ -132,8 +132,8 @@ tenant: "Test Tenant" description: "NEW DESCRIPTION" tags: - - first - - second + - First + - Second register: test_results - name: "PYNAUTOBOT_ROUTE_TARGET_UPDATE_IDEM: (IDEMPOTENT) Update description" diff --git a/tests/integration/targets/latest/tasks/service.yml b/tests/integration/targets/latest/tasks/service.yml index 0f9e5e01..ce7d7537 100644 --- a/tests/integration/targets/latest/tasks/service.yml +++ b/tests/integration/targets/latest/tasks/service.yml @@ -5,7 +5,8 @@ ## ## - set_fact: - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" - name: "1 - Device with required information needs to add new service" networktocode.nautobot.device: @@ -13,8 +14,8 @@ token: "{{ nautobot_token }}" name: "FOR_SERVICE" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ test_location['key'] }}" status: "Staged" state: present @@ -23,7 +24,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: "FOR_SERVICE" - name: "node-exporter" + name: "node-exporter-tcp" ports: - 9100 protocol: TCP @@ -34,19 +35,19 @@ assert: that: - test_service_create is changed - - test_service_create['services']['name'] == "node-exporter" + - test_service_create['services']['name'] == "node-exporter-tcp" - test_service_create['services']['ports'] == [9100] - test_service_create['services']['protocol'] == "tcp" - test_service_create['diff']['after']['state'] == "present" - test_service_create['diff']['before']['state'] == "absent" - - test_service_create['msg'] == "services node-exporter created" + - test_service_create['msg'] == "services node-exporter-tcp created" - name: "PYNAUTOBOT_SERVICE: Test idempotence" networktocode.nautobot.service: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: "FOR_SERVICE" - name: "node-exporter" + name: "node-exporter-tcp" ports: - 9100 protocol: TCP @@ -56,17 +57,17 @@ - name: "PYNAUTOBOT_SERVICE ASSERT - Not changed" assert: that: - - test_service_idempotence['services']['name'] == "node-exporter" + - test_service_idempotence['services']['name'] == "node-exporter-tcp" - test_service_idempotence['services']['ports'] == [9100] - test_service_idempotence['services']['protocol'] == "tcp" - - test_service_idempotence['msg'] == "services node-exporter already exists" + - test_service_idempotence['msg'] == "services node-exporter-tcp already exists" - name: "PYNAUTOBOT_SERVICE: Test update" networktocode.nautobot.service: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: "FOR_SERVICE" - name: "node-exporter" + name: "node-exporter-tcp" ports: - 9100 - 9200 @@ -82,37 +83,37 @@ - test_service_update is changed - test_service_update['diff']['after']['tags'][0] == tag_schnozzberry['key'] - test_service_update['diff']['after']['ports'] == [9100, 9200] - - test_service_update['msg'] == "services node-exporter updated" + - test_service_update['msg'] == "services node-exporter-tcp updated" -- name: "PYNAUTOBOT_SERVICE: Test same details, but different protocol - Create" +- name: "PYNAUTOBOT_SERVICE: Test same details, but different name protocol - Create" networktocode.nautobot.service: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: "FOR_SERVICE" - name: "node-exporter" + name: "node-exporter-udp" ports: - 9100 protocol: UDP state: present register: test_service_protocol -- name: "PYNAUTOBOT_SERVICE ASSERT - Different protocol - Create" +- name: "PYNAUTOBOT_SERVICE ASSERT - Different name and protocol - Create" assert: that: - test_service_protocol is changed - test_service_protocol['diff']['after']['state'] == "present" - test_service_protocol['diff']['before']['state'] == "absent" - - test_service_protocol['services']['name'] == "node-exporter" + - test_service_protocol['services']['name'] == "node-exporter-udp" - test_service_protocol['services']['ports'] == [9100] - test_service_protocol['services']['protocol'] == "udp" - - test_service_protocol['msg'] == "services node-exporter created" + - test_service_protocol['msg'] == "services node-exporter-udp created" - name: "PYNAUTOBOT_SERVICE: Test service deletion" networktocode.nautobot.service: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: "FOR_SERVICE" - name: "node-exporter" + name: "node-exporter-udp" ports: - 9100 protocol: UDP @@ -125,18 +126,18 @@ - test_service_delete is changed - test_service_delete['diff']['after']['state'] == "absent" - test_service_delete['diff']['before']['state'] == "present" - - test_service_delete['msg'] == "services node-exporter deleted" + - test_service_delete['msg'] == "services node-exporter-udp deleted" - name: "PYNAUTOBOT_SERVICE: Test service IP addresses" networktocode.nautobot.service: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" device: "test100" - name: "node-exporter" + name: "node-exporter-udp" ports: - 9100 protocol: UDP - ipaddresses: + ip_addresses: - address: "172.16.180.1/24" state: present register: test_service_ip_addresses @@ -147,21 +148,21 @@ - test_service_ip_addresses is changed - test_service_ip_addresses['diff']['after']['state'] == "present" - test_service_ip_addresses['diff']['before']['state'] == "absent" - - test_service_ip_addresses['services']['name'] == "node-exporter" + - test_service_ip_addresses['services']['name'] == "node-exporter-udp" - test_service_ip_addresses['services']['ports'] == [9100] - test_service_ip_addresses['services']['protocol'] == "udp" - - test_service_ip_addresses['services']['ipaddresses'] is defined - - test_service_ip_addresses['msg'] == "services node-exporter created" + - test_service_ip_addresses['services']['ip_addresses'] is defined + - test_service_ip_addresses['msg'] == "services node-exporter-udp created" - name: "PYNAUTOBOT_SERVICE: Missing both device & virtual_machine options - Tests required_one_of" networktocode.nautobot.service: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - name: "node-exporter" + name: "node-exporter-udp" ports: - 9100 protocol: UDP - ipaddresses: + ip_addresses: - address: "172.16.180.1/24" state: present ignore_errors: yes @@ -178,7 +179,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" virtual_machine: "test100-vm" - name: "node-exporter" + name: "node-exporter-tcp" ports: - 9100 protocol: TCP @@ -189,9 +190,9 @@ assert: that: - test_service_create_vm is changed - - test_service_create_vm['services']['name'] == "node-exporter" + - test_service_create_vm['services']['name'] == "node-exporter-tcp" - test_service_create_vm['services']['ports'] == [9100] - test_service_create_vm['services']['protocol'] == "tcp" - test_service_create_vm['diff']['after']['state'] == "present" - test_service_create_vm['diff']['before']['state'] == "absent" - - test_service_create_vm['msg'] == "services node-exporter created" + - test_service_create_vm['msg'] == "services node-exporter-tcp created" diff --git a/tests/integration/targets/latest/tasks/site.yml b/tests/integration/targets/latest/tasks/site.yml deleted file mode 100644 index 856ddf68..00000000 --- a/tests/integration/targets/latest/tasks/site.yml +++ /dev/null @@ -1,180 +0,0 @@ ---- -## -## -### PYNAUTOBOT_SITE -## -## -- set_fact: - region: "{{ lookup('networktocode.nautobot.lookup', 'regions', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-region') }}" - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - -- name: "1 - Create site within Nautobot with only required information" - networktocode.nautobot.site: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test - Colorado - status: "Active" - state: present - register: test_one - -- name: "1 - ASSERT" - assert: - that: - - test_one is changed - - test_one['diff']['before']['state'] == "absent" - - test_one['diff']['after']['state'] == "present" - - test_one['site']['name'] == "Test - Colorado" - - test_one['msg'] == "site Test - Colorado created" - -- name: "2 - Duplicate" - networktocode.nautobot.site: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test - Colorado - status: "Active" - state: present - register: test_two - -- name: "2 - ASSERT" - assert: - that: - - not test_two['changed'] - - test_two['msg'] == "site Test - Colorado already exists" - - test_two['site']['name'] == "Test - Colorado" - -- name: "3 - Update Test - Colorado" - networktocode.nautobot.site: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test - Colorado - status: Planned - region: Test Region - contact_name: Mikhail - state: present - register: test_three - -- name: "3 - ASSERT" - assert: - that: - - test_three is changed - - test_three['diff']['after']['status'] == "planned" - - test_three['diff']['after']['contact_name'] == "Mikhail" - - test_three['diff']['after']['region'] == region['key'] - - test_three['msg'] == "site Test - Colorado updated" - - test_three['site']['name'] == "Test - Colorado" - - test_three['site']['status'] == "planned" - - test_three['site']['contact_name'] == "Mikhail" - - test_three['site']['region'] == region['key'] - -- name: "4 - Create site with all parameters" - networktocode.nautobot.site: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test - California - status: Planned - region: Test Region - tenant: Test Tenant - facility: EquinoxCA7 - asn: 65001 - time_zone: America/Los Angeles - description: This is a test description - physical_address: Hollywood, CA, 90210 - shipping_address: Hollywood, CA, 90210 - latitude: "22.169141" - longitude: "-100.994041" - contact_name: Jenny - contact_phone: 867-5309 - contact_email: jenny@changednumber.com - comments: "### Placeholder" - slug: "test_california" - state: present - register: test_four - -- name: "4 - ASSERT" - assert: - that: - - test_four is changed - - test_four['diff']['before']['state'] == "absent" - - test_four['diff']['after']['state'] == "present" - - test_four['site']['name'] == "Test - California" - - test_four['msg'] == "site Test - California created" - - test_four['site']['status'] == "planned" - - test_four['site']['region'] == region['key'] - - test_four['site']['tenant'] == tenant['key'] - - test_four['site']['facility'] == "EquinoxCA7" - - test_four['site']['asn'] == 65001 - - test_four['site']['time_zone'] == "America/Los_Angeles" - - test_four['site']['description'] == "This is a test description" - - test_four['site']['physical_address'] == "Hollywood, CA, 90210" - - test_four['site']['shipping_address'] == "Hollywood, CA, 90210" - - test_four['site']['latitude'] == "22.169141" - - test_four['site']['longitude'] == "-100.994041" - - test_four['site']['contact_name'] == "Jenny" - - test_four['site']['contact_phone'] == "867-5309" - - test_four['site']['contact_email'] == "jenny@changednumber.com" - - test_four['site']['comments'] == "### Placeholder" - - test_four['site']['slug'] == "test_california" - -- name: "PYNAUTOBOT_SITE_IDEM: Idempotency - Create duplicate site with all parameters" - networktocode.nautobot.site: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test - California - status: Planned - region: Test Region - tenant: Test Tenant - facility: EquinoxCA7 - asn: 65001 - time_zone: America/Los Angeles - description: This is a test description - physical_address: Hollywood, CA, 90210 - shipping_address: Hollywood, CA, 90210 - latitude: "22.169141" - longitude: "-100.994041" - contact_name: Jenny - contact_phone: 867-5309 - contact_email: jenny@changednumber.com - comments: "### Placeholder" - slug: "test_california" - state: present - register: test_results - -- name: "PYNAUTOBOT_SITE_IDEM: (ASSERT) Idempotency - Duplicate device site with all parameters" - assert: - that: - - test_results is not changed - - test_results['site']['name'] == "Test - California" - - test_results['msg'] == "site Test - California already exists" - - test_results['site']['status'] == "planned" - - test_results['site']['region'] == region['key'] - - test_results['site']['tenant'] == tenant['key'] - - test_results['site']['facility'] == "EquinoxCA7" - - test_results['site']['asn'] == 65001 - - test_results['site']['time_zone'] == "America/Los_Angeles" - - test_results['site']['description'] == "This is a test description" - - test_results['site']['physical_address'] == "Hollywood, CA, 90210" - - test_results['site']['shipping_address'] == "Hollywood, CA, 90210" - - test_results['site']['latitude'] == "22.169141" - - test_results['site']['longitude'] == "-100.994041" - - test_results['site']['contact_name'] == "Jenny" - - test_results['site']['contact_phone'] == "867-5309" - - test_results['site']['contact_email'] == "jenny@changednumber.com" - - test_results['site']['comments'] == "### Placeholder" - - test_results['site']['slug'] == "test_california" - -- name: "5 - Delete site within nautobot" - networktocode.nautobot.site: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: Test - Colorado - state: absent - register: test_five - -- name: "5 - ASSERT" - assert: - that: - - test_five is changed - - test_five['diff']['before']['state'] == "present" - - test_five['diff']['after']['state'] == "absent" - - test_five['site']['name'] == "Test - Colorado" - - test_five['msg'] == "site Test - Colorado deleted" diff --git a/tests/integration/targets/latest/tasks/tag.yml b/tests/integration/targets/latest/tasks/tag.yml index eb3a387c..e0aa5f54 100644 --- a/tests/integration/targets/latest/tasks/tag.yml +++ b/tests/integration/targets/latest/tasks/tag.yml @@ -11,6 +11,8 @@ name: "Test Tag 1" description: "Tag 1 test" color: "0000ff" + content_types: + - "dcim.device" state: present register: test_one @@ -23,7 +25,7 @@ - test_one['tags']['color'] == "0000ff" - test_one['tags']['description'] == "Tag 1 test" - test_one['tags']['name'] == "Test Tag 1" - - test_one['tags']['slug'] == "test-tag-1" + - test_one['tags']['content_types'] == ["dcim.device"] - test_one['msg'] == "tags Test Tag 1 created" - name: "TAG 2: Create duplicate" @@ -33,6 +35,8 @@ name: "Test Tag 1" description: "Tag 1 test" color: "0000ff" + content_types: + - "dcim.device" state: present register: test_two @@ -62,6 +66,7 @@ - test_three['tags']['name'] == "Test Tag 1" - test_three['tags']['description'] == "Tag 1 update test" - test_three['tags']['color'] == "00ff00" + - test_three['tags']['content_types'] == ["dcim.device"] - test_three['msg'] == "tags Test Tag 1 updated" - name: "TAG 4: ASSERT - Delete" @@ -78,28 +83,4 @@ - test_four is changed - test_four['diff']['after']['state'] == "absent" - test_four['tags']['name'] == "Test Tag 1" - - test_four['tags']['slug'] == "test-tag-1" - test_four['msg'] == "tags Test Tag 1 deleted" - -- name: "TAG 5: ASSERT - Necessary info creation" - networktocode.nautobot.tag: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - name: "Test Tag 5" - slug: "test-tag-five" - description: "Tag 5 test" - color: "0000ff" - state: present - register: test_five - -- name: "TAG 5: ASSERT - Necessary info creation" - assert: - that: - - test_five is changed - - test_five['diff']['before']['state'] == "absent" - - test_five['diff']['after']['state'] == "present" - - test_five['tags']['color'] == "0000ff" - - test_five['tags']['description'] == "Tag 5 test" - - test_five['tags']['name'] == "Test Tag 5" - - test_five['tags']['slug'] == "test-tag-five" - - test_five['msg'] == "tags Test Tag 5 created" diff --git a/tests/integration/targets/latest/tasks/tenant.yml b/tests/integration/targets/latest/tasks/tenant.yml index 304d6734..7c9eaa7a 100644 --- a/tests/integration/targets/latest/tasks/tenant.yml +++ b/tests/integration/targets/latest/tasks/tenant.yml @@ -18,7 +18,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['tenant']['name'] == "Tenant ABC" - - test_one['tenant']['slug'] == "tenant-abc" - test_one['msg'] == "tenant Tenant ABC created" - name: "Test duplicate tenant" @@ -33,7 +32,6 @@ that: - not test_two['changed'] - test_two['tenant']['name'] == "Tenant ABC" - - test_two['tenant']['slug'] == "tenant-abc" - test_two['msg'] == "tenant Tenant ABC already exists" - name: "3 - Test update" @@ -50,7 +48,6 @@ - test_three is changed - test_three['diff']['after']['description'] == "Updated description" - test_three['tenant']['name'] == "Tenant ABC" - - test_three['tenant']['slug'] == "tenant-abc" - test_three['tenant']['description'] == "Updated description" - test_three['msg'] == "tenant Tenant ABC updated" @@ -78,7 +75,6 @@ description: "ABC Incorporated" comments: "### This tenant is super cool" tenant_group: "Test Tenant Group" - slug: "tenant_abc" tags: - "tagA" - "tagB" @@ -93,11 +89,10 @@ - test_five['diff']['before']['state'] == "absent" - test_five['diff']['after']['state'] == "present" - test_five['tenant']['name'] == "Tenant ABC" - - test_five['tenant']['slug'] == "tenant_abc" - test_five['tenant']['description'] == "ABC Incorporated" - test_five['tenant']['comments'] == "### This tenant is super cool" - - test_five['tenant']['group'] == group['key'] + - test_five['tenant']['tenant_group'] == tenant_group['key'] - test_five['tenant']['tags'] | length == 3 - test_five['msg'] == "tenant Tenant ABC created" vars: - group: "{{ lookup('networktocode.nautobot.lookup', 'tenant-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant-group') }}" + tenant_group: "{{ lookup('networktocode.nautobot.lookup', 'tenant-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant Group\"') }}" diff --git a/tests/integration/targets/latest/tasks/tenant_group.yml b/tests/integration/targets/latest/tasks/tenant_group.yml index 4f77156f..459197ad 100644 --- a/tests/integration/targets/latest/tasks/tenant_group.yml +++ b/tests/integration/targets/latest/tasks/tenant_group.yml @@ -6,14 +6,14 @@ ## - set_fact: - tenant_group_object: "{{ lookup('networktocode.nautobot.lookup', 'tenant-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant-group') }}" + tenant_group_object: "{{ lookup('networktocode.nautobot.lookup', 'tenant-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant Group\"') }}" - name: "1 - Test tenant group creation" networktocode.nautobot.tenant_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test Tenant Group Two" - parent_tenant_group: "test-tenant-group" + parent_tenant_group: "Test Tenant Group" register: test_one - name: "1 - ASSERT" @@ -23,7 +23,6 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['tenant_group']['name'] == "Test Tenant Group Two" - - test_one['tenant_group']['slug'] == "test-tenant-group-two" - test_one['msg'] == "tenant_group Test Tenant Group Two created" - test_one['tenant_group']['parent'] == tenant_group_object['value']['id'] @@ -32,7 +31,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test Tenant Group Two" - parent_tenant_group: "test-tenant-group" + parent_tenant_group: "Test Tenant Group" register: test_two - name: "2 - ASSERT" @@ -40,7 +39,6 @@ that: - not test_two['changed'] - test_two['tenant_group']['name'] == "Test Tenant Group Two" - - test_two['tenant_group']['slug'] == "test-tenant-group-two" - test_two['msg'] == "tenant_group Test Tenant Group Two already exists" - test_two['tenant_group']['parent'] == tenant_group_object['value']['id'] @@ -65,7 +63,6 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test Tenant Group ABC" - slug: "test_tenant_group_four" register: test_four - name: "4 - ASSERT" @@ -75,5 +72,4 @@ - test_four['diff']['before']['state'] == "absent" - test_four['diff']['after']['state'] == "present" - test_four['tenant_group']['name'] == "Test Tenant Group ABC" - - test_four['tenant_group']['slug'] == "test_tenant_group_four" - test_four['msg'] == "tenant_group Test Tenant Group ABC created" diff --git a/tests/integration/targets/latest/tasks/virtual_chassis.yml b/tests/integration/targets/latest/tasks/virtual_chassis.yml index 151e17d6..74a66bd5 100644 --- a/tests/integration/targets/latest/tasks/virtual_chassis.yml +++ b/tests/integration/targets/latest/tasks/virtual_chassis.yml @@ -7,14 +7,17 @@ ### PYNAUTOBOT_VIRTUAL_CHASSIS ## ## +- set_fact: + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + - name: "VIRTUAL_CHASSIS 0: Create device for testing virtual chassis" networktocode.nautobot.device: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Device Virtual Chassis Tests device_type: Cisco Test - device_role: Core Switch - site: Test Site + role: Core Switch + location: "{{ test_location['key'] }}" vc_position: 1 vc_priority: 1 status: "Active" @@ -85,8 +88,8 @@ token: "{{ nautobot_token }}" name: Device Virtual Chassis Tests 2 device_type: Cisco Test - device_role: Core Switch - site: Test Site + role: Core Switch + location: "{{ test_location['key'] }}" vc_position: 1 vc_priority: 15 status: "Active" diff --git a/tests/integration/targets/latest/tasks/virtual_machine.yml b/tests/integration/targets/latest/tasks/virtual_machine.yml index 30a312c4..f69a267e 100644 --- a/tests/integration/targets/latest/tasks/virtual_machine.yml +++ b/tests/integration/targets/latest/tasks/virtual_machine.yml @@ -6,9 +6,10 @@ ## - set_fact: test_cluster: '{{ lookup(''networktocode.nautobot.lookup'', ''clusters'', api_endpoint=nautobot_url, token=nautobot_token, api_filter=''name="Test Cluster"'') }}' - manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" - role: "{{ lookup('networktocode.nautobot.lookup', 'device-roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-vm-role') }}" + manufacturer: "{{ lookup('networktocode.nautobot.lookup', 'manufacturers', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Cisco') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" + role: "{{ lookup('networktocode.nautobot.lookup', 'roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test VM Role\"') }}" + planned: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Planned') }}" - name: "VIRTUAL_MACHINE 1: Necessary info creation" networktocode.nautobot.virtual_machine: @@ -57,7 +58,7 @@ vcpus: 8 memory: 8 status: "Planned" - virtual_machine_role: "Test VM Role" + role: "Test VM Role" tags: - "Schnozzberry" state: present @@ -69,14 +70,14 @@ - test_three is changed - test_three['diff']['after']['vcpus'] == 8 - test_three['diff']['after']['memory'] == 8 - - test_three['diff']['after']['status'] == "planned" + - test_three['diff']['after']['status'] == planned['key'] - test_three['diff']['after']['role'] == role['key'] - test_three['diff']['after']['tags'][0] == tag_schnozzberry['key'] - test_three['virtual_machine']['name'] == "Test VM One" - test_three['virtual_machine']['cluster'] == test_cluster['key'] - test_three['virtual_machine']['vcpus'] == 8 - test_three['virtual_machine']['memory'] == 8 - - test_three['virtual_machine']['status'] == "planned" + - test_three['virtual_machine']['status'] == planned['key'] - test_three['virtual_machine']['role'] == role['key'] - test_three['virtual_machine']['tags'][0] == tag_schnozzberry['key'] - test_three['msg'] == "virtual_machine Test VM One updated" @@ -97,7 +98,7 @@ - test_four['virtual_machine']['cluster'] == test_cluster['key'] - test_four['virtual_machine']['vcpus'] == 8 - test_four['virtual_machine']['memory'] == 8 - - test_four['virtual_machine']['status'] == "planned" + - test_four['virtual_machine']['status'] == planned['key'] - test_four['virtual_machine']['role'] == role['key'] - test_four['virtual_machine']['tags'][0] == tag_schnozzberry['key'] - test_four['msg'] == "virtual_machine Test VM One deleted" diff --git a/tests/integration/targets/latest/tasks/vlan.yml b/tests/integration/targets/latest/tasks/vlan.yml index ffe125c3..6d83431c 100644 --- a/tests/integration/targets/latest/tasks/vlan.yml +++ b/tests/integration/targets/latest/tasks/vlan.yml @@ -5,11 +5,12 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" - vlan_group: "{{ lookup('networktocode.nautobot.lookup', 'vlan-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-vlan-group') }}" - vlan_role: "{{ lookup('networktocode.nautobot.lookup', 'roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=network-of-care') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" + vlan_group: "{{ lookup('networktocode.nautobot.lookup', 'vlan-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Vlan Group\"') }}" + role: "{{ lookup('networktocode.nautobot.lookup', 'roles', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Network of care\"') }}" + reserved: "{{ lookup('networktocode.nautobot.lookup', 'statuses', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Reserved') }}" - name: "VLAN 1: Necessary info creation" networktocode.nautobot.vlan: @@ -49,20 +50,20 @@ - test_two['vlan']['vid'] == 500 - test_two['msg'] == "vlan Test VLAN 500 already exists" -- name: "VLAN 3: Create VLAN with same name, but different site" +- name: "VLAN 3: Create VLAN with same name, but different location" networktocode.nautobot.vlan: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test VLAN 500 vid: 500 - site: Test Site + location: "{{ test_location['key'] }}" tenant: Test Tenant - vlan_group: "Test VLAN Group" + vlan_group: "Test Vlan Group" status: "Active" state: present register: test_three -- name: "VLAN 3: ASSERT - Create VLAN with same name, but different site" +- name: "VLAN 3: ASSERT - Create VLAN with same name, but different location" assert: that: - test_three is changed @@ -70,23 +71,23 @@ - test_three['diff']['after']['state'] == "present" - test_three['vlan']['name'] == "Test VLAN 500" - test_three['vlan']['vid'] == 500 - - test_three['vlan']['site'] == test_site['key'] - - test_three['vlan']['group'] == vlan_group['key'] + - test_three['vlan']['location'] == test_location['key'] + - test_three['vlan']['vlan_group'] == vlan_group['key'] - test_three['vlan']['tenant'] == tenant['key'] - test_three['msg'] == "vlan Test VLAN 500 created" -- name: "VLAN 4: ASSERT - Update" +- name: "VLAN 4: Update" networktocode.nautobot.vlan: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test VLAN 500" vid: 500 tenant: "Test Tenant" - vlan_group: "Test VLAN Group" + vlan_group: "Test Vlan Group" status: Reserved - vlan_role: Network of care + role: Network of care description: Updated description - site: "Test Site" + location: "{{ test_location['key'] }}" tags: - "Schnozzberry" state: present @@ -96,16 +97,16 @@ assert: that: - test_four is changed - - test_four['diff']['after']['status'] == "reserved" - - test_four['diff']['after']['role'] == vlan_role['key'] + - test_four['diff']['after']['status'] == reserved['key'] + - test_four['diff']['after']['role'] == role['key'] - test_four['diff']['after']['description'] == "Updated description" - test_four['diff']['after']['tags'][0] == tag_schnozzberry['key'] - test_four['vlan']['name'] == "Test VLAN 500" - test_four['vlan']['tenant'] == tenant['key'] - - test_four['vlan']['site'] == test_site['key'] - - test_four['vlan']['group'] == vlan_group['key'] - - test_four['vlan']['status'] == "reserved" - - test_four['vlan']['role'] == vlan_role['key'] + - test_four['vlan']['location'] == test_location['key'] + - test_four['vlan']['vlan_group'] == vlan_group['key'] + - test_four['vlan']['status'] == reserved['key'] + - test_four['vlan']['role'] == role['key'] - test_four['vlan']['description'] == "Updated description" - test_four['vlan']['tags'][0] == tag_schnozzberry['key'] - test_four['msg'] == "vlan Test VLAN 500 updated" @@ -117,11 +118,11 @@ name: "Test VLAN 500" vid: 500 tenant: "Test Tenant" - vlan_group: "Test VLAN Group" + vlan_group: "Test Vlan Group" status: Reserved - vlan_role: Network of care + role: Network of care description: Updated description - site: "Test Site" + location: "{{ test_location['key'] }}" tags: - "Schnozzberry" state: present @@ -138,10 +139,10 @@ token: "{{ nautobot_token }}" name: Test VLAN 500 vid: 500 - site: Test Site + location: "{{ test_location['key'] }}" tenant: Test Tenant status: "Active" - vlan_group: "Test VLAN Group 2" + vlan_group: "Test Vlan Group 2" state: present register: new_vlan_group @@ -153,12 +154,12 @@ - new_vlan_group['diff']['after']['state'] == "present" - new_vlan_group['vlan']['name'] == "Test VLAN 500" - new_vlan_group['vlan']['vid'] == 500 - - new_vlan_group['vlan']['site'] == test_site['key'] + - new_vlan_group['vlan']['location'] == test_location['key'] - new_vlan_group['vlan']['tenant'] == tenant['key'] - - new_vlan_group['vlan']['group'] == vlan_group2['key'] + - new_vlan_group['vlan']['vlan_group'] == vlan_group2['key'] - new_vlan_group['msg'] == "vlan Test VLAN 500 created" vars: - vlan_group2: "{{ lookup('networktocode.nautobot.lookup', 'vlan-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-vlan-group-2') }}" + vlan_group2: "{{ lookup('networktocode.nautobot.lookup', 'vlan-groups', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Vlan Group 2\"') }}" - name: "VLAN 5: ASSERT - Delete more than one result" networktocode.nautobot.vlan: @@ -180,8 +181,8 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test VLAN 500" - site: Test Site - vlan_group: "Test VLAN Group" + location: "{{ test_location['key'] }}" + vlan_group: "Test Vlan Group" state: absent register: test_six @@ -191,10 +192,10 @@ - test_six is changed - test_six['vlan']['name'] == "Test VLAN 500" - test_six['vlan']['tenant'] == tenant['key'] - - test_six['vlan']['site'] == test_site['key'] - - test_six['vlan']['group'] == vlan_group['key'] - - test_six['vlan']['status'] == "reserved" - - test_six['vlan']['role'] == vlan_role['key'] + - test_six['vlan']['location'] == test_location['key'] + - test_six['vlan']['vlan_group'] == vlan_group['key'] + - test_six['vlan']['status'] == reserved['key'] + - test_six['vlan']['role'] == role['key'] - test_six['vlan']['description'] == "Updated description" - test_six['vlan']['tags'][0] == tag_schnozzberry['key'] - test_six['msg'] == "vlan Test VLAN 500 deleted" diff --git a/tests/integration/targets/latest/tasks/vlan_group.yml b/tests/integration/targets/latest/tasks/vlan_group.yml index a1d7a069..4e7eda45 100644 --- a/tests/integration/targets/latest/tasks/vlan_group.yml +++ b/tests/integration/targets/latest/tasks/vlan_group.yml @@ -5,15 +5,15 @@ ## ## - set_fact: - test_site: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site') }}" - test_site2: "{{ lookup('networktocode.nautobot.lookup', 'sites', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-site2') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + test_location2: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child-Child Test Location\"') }}" - name: "VLAN_GROUP 1: Necessary info creation" networktocode.nautobot.vlan_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "VLAN Group One" - site: Test Site + location: "{{ test_location['key'] }}" state: present register: test_one @@ -24,8 +24,7 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['vlan_group']['name'] == "VLAN Group One" - - test_one['vlan_group']['slug'] == "vlan-group-one" - - test_one['vlan_group']['site'] == test_site['key'] + - test_one['vlan_group']['location'] == test_location['key'] - test_one['msg'] == "vlan_group VLAN Group One created" - name: "VLAN_GROUP 2: Create duplicate" @@ -33,7 +32,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "VLAN Group One" - site: Test Site + location: "{{ test_location['key'] }}" state: present register: test_two @@ -42,49 +41,44 @@ that: - not test_two['changed'] - test_two['vlan_group']['name'] == "VLAN Group One" - - test_two['vlan_group']['slug'] == "vlan-group-one" - - test_two['vlan_group']['site'] == test_site['key'] + - test_two['vlan_group']['location'] == test_location['key'] - test_two['msg'] == "vlan_group VLAN Group One already exists" -- name: "VLAN_GROUP 3: ASSERT - Create with same name, different site" +- name: "VLAN_GROUP 3: ASSERT - Create with same name, different location" networktocode.nautobot.vlan_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "VLAN Group One" - site: "Test Site2" + location: "{{ test_location2['key'] }}" state: present register: test_three + ignore_errors: true -- name: "VLAN_GROUP 3: ASSERT - Create with same name, different site" +- name: "VLAN_GROUP 3: ASSERT - Create with same name, different location" assert: that: - - test_three is changed - - test_three['vlan_group']['name'] == "VLAN Group One" - - test_three['vlan_group']['slug'] == "vlan-group-one" - - test_three['vlan_group']['site'] == test_site2['key'] - - test_three['msg'] == "vlan_group VLAN Group One created" + - test_three is failed + - test_three['msg'] == "{\"name\":[\"VLAN group with this name already exists.\"]}" -- name: "VLAN_GROUP 4: ASSERT - Create vlan group, no site" +- name: "VLAN_GROUP 4: ASSERT - Create vlan group, no location" networktocode.nautobot.vlan_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "VLAN Group One" state: present - ignore_errors: yes register: test_four -- name: "VLAN_GROUP 4: ASSERT - Create with same name, different site" +- name: "VLAN_GROUP 4: ASSERT - Create with same name, different location" assert: that: - - test_four is failed - - test_four['msg'] == "More than one result returned for VLAN Group One" + - not test_four is changed + - test_four['msg'] == "vlan_group VLAN Group One already exists" - name: "VLAN_GROUP 5: ASSERT - Delete" networktocode.nautobot.vlan_group: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: VLAN Group One - site: Test Site2 state: absent register: test_five @@ -95,8 +89,7 @@ - test_five['diff']['before']['state'] == "present" - test_five['diff']['after']['state'] == "absent" - test_five['vlan_group']['name'] == "VLAN Group One" - - test_five['vlan_group']['slug'] == "vlan-group-one" - - test_five['vlan_group']['site'] == test_site2['key'] + - test_five['vlan_group']['location'] == test_location['key'] - test_five['msg'] == "vlan_group VLAN Group One deleted" - name: "VLAN_GROUP 6: ASSERT - Delete non existing" @@ -104,7 +97,6 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: VLAN Group One - site: Test Site2 state: absent register: test_six diff --git a/tests/integration/targets/latest/tasks/vm_interface.yml b/tests/integration/targets/latest/tasks/vm_interface.yml index 70af71e1..80829942 100644 --- a/tests/integration/targets/latest/tasks/vm_interface.yml +++ b/tests/integration/targets/latest/tasks/vm_interface.yml @@ -6,8 +6,9 @@ ## - set_fact: vm100: "{{ lookup('networktocode.nautobot.lookup', 'virtual-machines', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=test100-vm') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" wireless: "{{ lookup('networktocode.nautobot.lookup', 'vlans', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Wireless') }}" + test_location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" - name: "PYNAUTOBOT_VM_INTERFACE 1: Necessary info creation" networktocode.nautobot.vm_interface: @@ -15,6 +16,7 @@ token: "{{ nautobot_token }}" virtual_machine: "test100-vm" name: "Eth10" + status: "Active" state: present register: test_one @@ -34,6 +36,7 @@ token: "{{ nautobot_token }}" virtual_machine: "test100-vm" name: "Eth10" + status: "Active" state: present register: test_two @@ -51,6 +54,7 @@ token: "{{ nautobot_token }}" virtual_machine: "test100-vm" name: "Eth10" + status: "Active" enabled: false mtu: 9000 mac_address: "00:00:00:AA:AA:01" @@ -58,12 +62,12 @@ mode: Tagged untagged_vlan: name: Wireless - site: Test Site + location: "{{ test_location['key'] }}" tagged_vlans: - name: Data - site: Test Site + location: "{{ test_location['key'] }}" - name: VoIP - site: Test Site + location: "{{ test_location['key'] }}" tags: - "Schnozzberry" state: present @@ -116,6 +120,7 @@ token: "{{ nautobot_token }}" virtual_machine: "test100-vm" name: "Eth0" + status: "Active" enabled: false mtu: 9000 mac_address: "00:00:00:AA:AA:01" @@ -123,12 +128,12 @@ mode: Tagged untagged_vlan: name: Wireless - site: Test Site + location: "{{ test_location['key'] }}" tagged_vlans: - name: Data - site: Test Site + location: "{{ test_location['key'] }}" - name: VoIP - site: Test Site + location: "{{ test_location['key'] }}" tags: - "Schnozzberry" state: present diff --git a/tests/integration/targets/latest/tasks/vrf.yml b/tests/integration/targets/latest/tasks/vrf.yml index b6bb1e65..bff28492 100644 --- a/tests/integration/targets/latest/tasks/vrf.yml +++ b/tests/integration/targets/latest/tasks/vrf.yml @@ -5,14 +5,17 @@ ## ## - set_fact: - tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=test-tenant') }}" - tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=schnozzberry') }}" + tenant: "{{ lookup('networktocode.nautobot.lookup', 'tenants', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Test Tenant\"') }}" + ns_global: "{{ lookup('networktocode.nautobot.lookup', 'namespaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Global') }}" + ns_private: "{{ lookup('networktocode.nautobot.lookup', 'namespaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Private') }}" + tag_schnozzberry: "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Schnozzberry') }}" - name: "VRF 1: Necessary info creation" networktocode.nautobot.vrf: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test VRF One + rd: "65001:1" state: present register: test_one @@ -23,6 +26,8 @@ - test_one['diff']['before']['state'] == "absent" - test_one['diff']['after']['state'] == "present" - test_one['vrf']['name'] == "Test VRF One" + - test_one['vrf']['rd'] == "65001:1" + - test_one['vrf']['namespace'] == ns_global['key'] - test_one['msg'] == "vrf Test VRF One created" - name: "VRF 2: Create duplicate" @@ -30,6 +35,7 @@ url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test VRF One + rd: "65001:1" state: present register: test_two @@ -38,34 +44,37 @@ that: - not test_two['changed'] - test_two['vrf']['name'] == "Test VRF One" + - test_two['vrf']['rd'] == "65001:1" + - test_two['vrf']['namespace'] == ns_global['key'] - test_two['msg'] == "vrf Test VRF One already exists" -- name: "VRF 3: Create VRF with same name, but different tenant" +- name: "VRF 3: Create VRF with same name, but different namespace" networktocode.nautobot.vrf: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: Test VRF One - tenant: Test Tenant + rd: "65001:1" + namespace: Private state: present register: test_three -- name: "VRF 3: ASSERT - Create VRF with same name, but different site" +- name: "VRF 3: ASSERT - Create VRF with same name, but different namespace" assert: that: - test_three is changed - test_three['diff']['before']['state'] == "absent" - test_three['diff']['after']['state'] == "present" - test_three['vrf']['name'] == "Test VRF One" - - test_three['vrf']['tenant'] == tenant['key'] + - test_three['vrf']['namespace'] == ns_private['key'] + - test_three['vrf']['rd'] == "65001:1" - test_three['msg'] == "vrf Test VRF One created" -- name: "VRF 4: ASSERT - Update" +- name: "VRF 4: Update VRF Global" networktocode.nautobot.vrf: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test VRF One" rd: "65001:1" - enforce_unique: False tenant: "Test Tenant" description: Updated description import_targets: @@ -77,58 +86,61 @@ state: present register: test_four -- name: "VRF 4: ASSERT - Updated" +- name: "VRF 4: ASSERT - Update VRF Global" assert: that: - test_four is changed - - test_four['diff']['after']['rd'] == "65001:1" - - test_four['diff']['after']['enforce_unique'] == false - test_four['diff']['after']['description'] == "Updated description" - test_four['diff']['after']['tags'][0] == tag_schnozzberry['key'] + - test_four['diff']['after']['tenant'] == tenant['key'] - test_four['diff']['after']['import_targets'] | length == 1 - test_four['diff']['after']['export_targets'] | length == 1 - test_four['vrf']['name'] == "Test VRF One" + - test_four['vrf']['namespace'] == ns_global['key'] - test_four['vrf']['tenant'] == tenant['key'] - test_four['vrf']['rd'] == "65001:1" - - test_four['vrf']['enforce_unique'] == false - test_four['vrf']['description'] == "Updated description" - test_four['vrf']['tags'][0] == tag_schnozzberry['key'] - test_four['vrf']['import_targets'] | length == 1 - test_four['vrf']['export_targets'] | length == 1 - test_four['msg'] == "vrf Test VRF One updated" -- name: "VRF 5: ASSERT - Delete more than one result" +- name: "VRF 5: Delete VRF Global" networktocode.nautobot.vrf: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test VRF One" + rd: "65001:1" state: absent - ignore_errors: yes register: test_five -- name: "VRF 5: ASSERT - Delete more than one result" +- name: "VRF 5: ASSERT - Delete VRF Global" assert: that: - - test_five is failed - - test_five['msg'] == "More than one result returned for Test VRF One" + - test_five is changed + - test_five['vrf']['name'] == "Test VRF One" + - test_five['vrf']['tenant'] == tenant['key'] + - test_five['vrf']['namespace'] == ns_global['key'] + - test_five['vrf']['rd'] == "65001:1" + - test_five['vrf']['description'] == "Updated description" + - test_five['vrf']['tags'][0] == tag_schnozzberry['key'] + - test_five['msg'] == "vrf Test VRF One deleted" -- name: "VRF 6: ASSERT - Delete" +- name: "VRF 6: ASSERT - Delete VRF Private" networktocode.nautobot.vrf: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" name: "Test VRF One" - tenant: Test Tenant + rd: "65001:1" + namespace: Private state: absent register: test_six -- name: "VRF 6: ASSERT - Delete" +- name: "VRF 6: ASSERT - Delete VRF Private" assert: that: - test_six is changed - test_six['vrf']['name'] == "Test VRF One" - - test_six['vrf']['tenant'] == tenant['key'] + - test_six['vrf']['namespace'] == ns_private['key'] - test_six['vrf']['rd'] == "65001:1" - - test_six['vrf']['enforce_unique'] == false - - test_six['vrf']['description'] == "Updated description" - - test_six['vrf']['tags'][0] == tag_schnozzberry['key'] - test_six['msg'] == "vrf Test VRF One deleted" diff --git a/tests/integration/targets/regression-latest/tasks/main.yml b/tests/integration/targets/regression-latest/tasks/main.yml index c7e915ac..5957ac69 100644 --- a/tests/integration/targets/regression-latest/tasks/main.yml +++ b/tests/integration/targets/regression-latest/tasks/main.yml @@ -4,6 +4,9 @@ ### TEST PYNAUTOBOT CONNECTION FAILURE ## ## +- set_fact: + location: "{{ lookup('networktocode.nautobot.lookup', 'locations', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=\"Child Test Location\"') }}" + - name: "TEST PYNAUTOBOT CONNECTION FAILURE" connection: local block: @@ -13,8 +16,8 @@ token: "{{ nautobot_token }}" name: "R1" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ location['key'] }}" status: "Staged" state: present register: test_one @@ -34,7 +37,7 @@ parent: "10.10.0.0/16" prefix_length: 24 first_available: yes - status: "active" + status: "Active" state: present register: test_two check_mode: yes @@ -51,12 +54,12 @@ token: "{{ nautobot_token }}" name: "issue-242" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ location['key'] }}" status: "Staged" tags: - - slug: first - - slug: second + - name: First + - name: Second - name: "4 - Add device with tags out of order - shouldn't change - Tests #242 is fixed" networktocode.nautobot.device: @@ -64,12 +67,12 @@ token: "{{ nautobot_token }}" name: "issue-242" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ location['key'] }}" status: "Staged" tags: - - slug: second - - slug: first + - name: Second + - name: First register: test_four diff: yes @@ -84,14 +87,14 @@ token: "{{ nautobot_token }}" name: "issue-242" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ location['key'] }}" status: "Staged" asset_tag: "1234" tags: - - slug: second - - slug: third - - slug: first + - name: Second + - name: Third + - name: First register: test_five diff: yes @@ -132,10 +135,10 @@ - test_six.results[3]["diff"]["after"]["state"] == "present" - test_six.results[3]["interface_template"]["device_type"] == nexus_parent['key'] vars: - cisco: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=cisco-test') }}" - arista: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=arista-test') }}" - nexus_child: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=nexus-child') }}" - nexus_parent: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=nexus-parent') }}" + cisco: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Cisco Test\"') }}" + arista: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Arista Test\"') }}" + nexus_child: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Nexus Child\"') }}" + nexus_parent: "{{ lookup('networktocode.nautobot.lookup', 'device-types', api_endpoint=nautobot_url, token=nautobot_token, api_filter='model=\"Nexus Parent\"') }}" # Commented out due to not know the IDs, but I'm sure we can re-enable with lookup plugin - name: "7 - Don't prevent updates to other params if tags are specified" @@ -144,15 +147,15 @@ token: "{{ nautobot_token }}" name: "issue-242" device_type: "Cisco Test" - device_role: "Core Switch" - site: "Test Site" + role: "Core Switch" + location: "{{ location['key'] }}" status: "Staged" asset_tag: "Null" tags: # Changed these for issue #407 to be UUIDs - - "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=second')['key'] }}" - - "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=third')['key'] }}" - - "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='slug=first')['key'] }}" + - "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Second')['key'] }}" + - "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=Third')['key'] }}" + - "{{ lookup('networktocode.nautobot.lookup', 'tags', api_endpoint=nautobot_url, token=nautobot_token, api_filter='name=First')['key'] }}" register: test_seven - name: "5 - Assert added tag - Tests #242 is fixed" @@ -161,43 +164,40 @@ - test_seven is changed - test_seven["diff"]["after"]["asset_tag"] == "Null" - test_seven["device"]["asset_tag"] == "Null" + - test_seven["device"]['tags'] | length == 3 - name: Add ip address to nautobot and don't assign it to a device (Issue 372) networktocode.nautobot.ip_address: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" address: 10.255.255.1/24 - status: "active" + status: "Active" query_params: - address - vrf state: present + register: ip_address - - name: Update same ip address to attach to a device interface (Issue 372) - networktocode.nautobot.ip_address: + - name: Attach same ip address to a device interface (Issue 372) + networktocode.nautobot.ip_address_to_interface: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" - address: 10.255.255.1/24 - status: "active" - assigned_object: + ip_address: "{{ ip_address['ip_address']['id'] }}" + interface: device: test100 - name: GigabitEthernet1 - query_params: - - address - - vrf + name: GigabitEthernet3 state: present - register: query_params_372 + register: ip_to_intf - - name: Assert ip address was updated and added to device interface + - name: Assert ip address was added to device interface assert: that: - - query_params_372 is changed - - query_params_372['msg'] == 'ip_address 10.255.255.1/24 updated' - - query_params_372['diff']['after']['assigned_object'] == interface['key'] - - query_params_372['diff']['after']['assigned_object_id'] == interface['key'] - - query_params_372['diff']['after']['assigned_object_type'] == 'dcim.interface' + - ip_to_intf is changed + - ip_to_intf['msg'] == 'ip_address_to_interface None created' + - ip_to_intf['ip_address_to_interface']['interface'] == interface['key'] + - ip_to_intf['ip_address_to_interface']['ip_address'] == ip_address['ip_address']['id'] vars: - interface: "{{ lookup('networktocode.nautobot.lookup', 'interfaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='device=test100 name=GigabitEthernet1') }}" + interface: "{{ lookup('networktocode.nautobot.lookup', 'interfaces', api_endpoint=nautobot_url, token=nautobot_token, api_filter='device=test100 name=GigabitEthernet3') }}" - name: "Validate failure due to invalid child params provided by user" networktocode.nautobot.cable: @@ -220,66 +220,12 @@ - test_results is failed - 'test_results["msg"] == "One or more of the kwargs provided are invalid for circuits.circuittermination, provided kwargs: name. Acceptable kwargs: circuit, term_side"' - - name: "Issue #432 - Make sure same IPs get assigned to different device interfaces" - networktocode.nautobot.ip_address: - url: "{{ nautobot_url }}" - token: "{{ nautobot_token }}" - address: "{{ item['address'] }}" - assigned_object: "{{ item['assigned_object'] }}" - description: "{{ item['description'] }}" - dns_name: "{{ item['dns_name'] }}" - role: "{{ item['role'] }}" - status: "{{ item['status'] }}" - loop: "{{ data }}" - register: "test_results" - vars: - data: - - address: 121.121.121.121/32 - assigned_object: - device: "Test Nexus One" - name: "Ethernet1/1" - description: ansible-nautobot-1.2.1 - dns_name: ansible-nautobot-1.2.1 - role: HSRP - status: active - - address: 121.121.121.121/32 - assigned_object: - device: "Test Nexus Child One" - name: "Ethernet2/1" - description: ansible-nautobot-1.2.1 - dns_name: ansible-nautobot-1.2.1 - role: HSRP - status: active - - address: 1.121.121.121/32 - assigned_object: - device: "Test Nexus One" - name: "Ethernet1/1" - description: ansible-nautobot-1.2.1 - dns_name: ansible-nautobot-1.2.1 - role: HSRP - status: active - - address: 1.121.121.121/32 - assigned_object: - device: "Test Nexus Child One" - name: "Ethernet2/1" - description: ansible-nautobot-1.2.1 - dns_name: ansible-nautobot-1.2.1 - role: HSRP - status: active - - - name: "ASSERT Issue #432 changes reflect correct device" - assert: - that: - - test_results | json_query('results[?ip_address.address==`1.121.121.121/32`]') | length == 2 - - test_results | json_query('results[?ip_address.address==`121.121.121.121/32`]') | length == 2 - - name: "Invalid API version" networktocode.nautobot.tag: url: "{{ nautobot_url }}" token: "{{ nautobot_token }}" api_version: 0.0 name: "Test Tag 5" - slug: "test-tag-five" ignore_errors: True register: "test_invalid_api_version" diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 49bc7cfb..2f8ce4f6 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,5 +1,6 @@ """Pytest conftest setup.""" import pytest +import pynautobot try: from plugins.module_utils.utils import NautobotApiBase @@ -11,6 +12,11 @@ from utils import NautobotApiBase +@pytest.fixture(autouse=True) +def patch_pynautobot_version_check(monkeypatch): + monkeypatch.setattr(pynautobot.api, "version", "2.0") + + @pytest.fixture def nautobot_api_base(): return NautobotApiBase(url="https://nautobot.mock.com", token="abc123", valdiate_certs=False) diff --git a/tests/unit/filter/test_data/graphql_string.json b/tests/unit/filter/test_data/graphql_string.json index 05eb7d64..faa08283 100644 --- a/tests/unit/filter/test_data/graphql_string.json +++ b/tests/unit/filter/test_data/graphql_string.json @@ -21,7 +21,7 @@ "query": { "serial": null, "asset_tag": null, - "site": { + "location": { "name": null, "contact_name": null, "description": null, @@ -33,13 +33,13 @@ } } }, - "expected": "serial\nasset_tag\nsite {\n name\n contact_name\n description\n region {\n name\n parent {\n name\n }\n }\n}" + "expected": "serial\nasset_tag\nlocation {\n name\n contact_name\n description\n region {\n name\n parent {\n name\n }\n }\n}" }, { "query": { "serial": null, "asset_tag": null, - "site": { + "location": { "filters": { "role": "core", "tenant": "den" @@ -58,7 +58,7 @@ } } }, - "expected": "serial\nasset_tag\nsite (role: \"core\", tenant: \"den\") {\n name\n contact_name\n description\n region ($tenant: den) {\n name\n parent {\n name\n }\n }\n}" + "expected": "serial\nasset_tag\nlocation (role: \"core\", tenant: \"den\") {\n name\n contact_name\n description\n region ($tenant: den) {\n name\n parent {\n name\n }\n }\n}" }, { "query": { @@ -67,11 +67,11 @@ "platform": "napalm_driver", "status": "name", "primary_ip4": "address", - "device_role": "name", - "site": "name" + "role": "name", + "location": "name" } }, - "expected": "device {\n name\n platform {\n napalm_driver\n }\n status {\n name\n }\n primary_ip4 {\n address\n }\n device_role {\n name\n }\n site {\n name\n }\n}" + "expected": "device {\n name\n platform {\n napalm_driver\n }\n status {\n name\n }\n primary_ip4 {\n address\n }\n role {\n name\n }\n location {\n name\n }\n}" }, { "query": { diff --git a/tests/unit/inventory/test_data/graphql_groups/device_data.json b/tests/unit/inventory/test_data/graphql_groups/device_data.json index e71f3b0c..b4cce772 100644 --- a/tests/unit/inventory/test_data/graphql_groups/device_data.json +++ b/tests/unit/inventory/test_data/graphql_groups/device_data.json @@ -9,27 +9,25 @@ "primary_ip4": { "host": "10.10.10.10" }, - "device_role": { + "role": { "name": "edge", "color_category": { "primary": "red" } }, - "site": { + "location": { "name": "ATL01" }, "tenant": { - "slug": "mytenant", + "name": "My Tenant", "type": "local" }, "tags": [ { - "name": "MyTag", - "slug": "mytag" + "name": "MyTag" }, { - "name": "MyTag2", - "slug": "mytag2" + "name": "MyTag2" } ] } \ No newline at end of file diff --git a/tests/unit/inventory/test_data/group_extractors/data.json b/tests/unit/inventory/test_data/group_extractors/data.json index cfa4b5de..d94c95d7 100644 --- a/tests/unit/inventory/test_data/group_extractors/data.json +++ b/tests/unit/inventory/test_data/group_extractors/data.json @@ -11,12 +11,11 @@ "vcpus", "config_context", "custom_fields", - "region", "cluster", "cluster_group", "cluster_type", + "location", "is_virtual", - "site", "tenant", "rack", "tag", @@ -26,7 +25,7 @@ "manufacturer" ], "not_expected": [ - "sites", + "locations", "tenants", "racks", "tags", @@ -52,16 +51,15 @@ "vcpus", "config_context", "custom_fields", - "region", "cluster", "cluster_group", "cluster_type", + "device_roles", "is_virtual", - "sites", + "locations", "tenants", "racks", "tags", - "device_roles", "platforms", "device_types", "manufacturers", @@ -70,7 +68,7 @@ "dns_name" ], "not_expected": [ - "site", + "location", "tenant", "rack", "tag", @@ -92,12 +90,11 @@ "vcpus", "config_context", "custom_fields", - "region", "cluster", "cluster_group", "cluster_type", "is_virtual", - "sites", + "locations", "tenants", "racks", "tags", @@ -110,7 +107,7 @@ "dns_name" ], "not_expected": [ - "site", + "location", "tenant", "rack", "tag", diff --git a/tests/unit/inventory/test_data/refresh_url/data.json b/tests/unit/inventory/test_data/refresh_url/data.json index 77f447cc..41ed7ee4 100644 --- a/tests/unit/inventory/test_data/refresh_url/data.json +++ b/tests/unit/inventory/test_data/refresh_url/data.json @@ -7,8 +7,8 @@ "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&include=config_context" ] }, { @@ -19,8 +19,8 @@ "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&include=config_context" ] }, { @@ -31,8 +31,8 @@ "config_context": false }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&exclude=config_context", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&exclude=config_context" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1" ] }, { @@ -42,7 +42,7 @@ "name": "name value" }, { - "region": "region value" + "location": "location value" } ], "device_query_filters": {}, @@ -50,8 +50,8 @@ "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&name=name+value®ion=region+value", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&name=name+value®ion=region+value" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&name=name+value&location=location+value&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&name=name+value&include=config_context" ] }, { @@ -63,19 +63,19 @@ ], "device_query_filters": [ { - "region": "device" + "location": "device" } ], "vm_query_filters": [ { - "region": "vm" + "location": "vm" } ], "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&name=name+value®ion=device", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&name=name+value®ion=vm" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&name=name+value&location=device&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&name=name+value&include=config_context" ] }, { @@ -107,8 +107,8 @@ "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&name=name+value&has_primary_ip=true", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&name=name+value&disk=42" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&name=name+value&has_primary_ip=true&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&name=name+value&disk=42&include=config_context" ] }, { @@ -123,8 +123,8 @@ "config_context": true }, "expected": [ - null, - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&disk=3" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&disk=3&include=config_context" ] }, { @@ -139,8 +139,8 @@ "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&has_primary_ip=true", - null + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&has_primary_ip=true&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&has_primary_ip=true&include=config_context" ] }, { @@ -159,8 +159,8 @@ "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&name=name+value", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&disk=3" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&name=name+value&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&disk=3&include=config_context" ] }, { @@ -179,8 +179,8 @@ "config_context": true }, "expected": [ - "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&has_primary_ip=true", - "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&name=name+value" + "https://nautobot.test.endpoint:1234/api/dcim/devices/?limit=0&depth=1&has_primary_ip=true&include=config_context", + "https://nautobot.test.endpoint:1234/api/virtualization/virtual-machines/?limit=0&depth=1&has_primary_ip=true&name=name+value&include=config_context" ] } ] diff --git a/tests/unit/inventory/test_data/validate_query_parameter/data.json b/tests/unit/inventory/test_data/validate_query_parameter/data.json index a7fca74c..42a70e58 100644 --- a/tests/unit/inventory/test_data/validate_query_parameter/data.json +++ b/tests/unit/inventory/test_data/validate_query_parameter/data.json @@ -8,7 +8,7 @@ "expected": true }, { - "parameter": "region", + "parameter": "location", "expected": true }, { diff --git a/tests/unit/inventory/test_graphql.py b/tests/unit/inventory/test_graphql.py index e7c0efb8..28ca9b0b 100644 --- a/tests/unit/inventory/test_graphql.py +++ b/tests/unit/inventory/test_graphql.py @@ -41,6 +41,7 @@ def inventory_fixture(): inventory = InventoryModule() inventory.inventory = InventoryData() inventory.inventory.add_host("mydevice") + inventory.group_names_raw = False return inventory @@ -52,7 +53,7 @@ def device_data(): def test_group_by_path_multiple(inventory_fixture, device_data): - inventory_fixture.group_by = ["device_role.color_category.primary"] + inventory_fixture.group_by = ["role.color_category.primary"] inventory_fixture.create_groups(device_data) inventory_groups = list(inventory_fixture.inventory.groups.keys()) local_device_type_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("red") @@ -70,7 +71,7 @@ def test_group_by_path(inventory_fixture, device_data): def test_group_by_string_only(inventory_fixture, device_data): - inventory_fixture.group_by = ["site"] + inventory_fixture.group_by = ["location"] inventory_fixture.create_groups(device_data) inventory_groups = list(inventory_fixture.inventory.groups.keys()) atl01_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("ATL01") @@ -80,14 +81,14 @@ def test_group_by_string_only(inventory_fixture, device_data): @patch.object(Display, "display") def test_no_parent_value(mock_display, inventory_fixture, device_data): - inventory_fixture.group_by = ["color.slug"] + inventory_fixture.group_by = ["color.unknown"] inventory_fixture.create_groups(device_data) mock_display.assert_any_call("Could not find value for color on device mydevice") @patch.object(Display, "display") def test_multiple_group_by_one_fail(mock_display, inventory_fixture, device_data): - inventory_fixture.group_by = ["color.slug", "site.name"] + inventory_fixture.group_by = ["color.name", "location.name"] inventory_fixture.create_groups(device_data) inventory_groups = list(inventory_fixture.inventory.groups.keys()) atl01_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("ATL01") @@ -97,7 +98,7 @@ def test_multiple_group_by_one_fail(mock_display, inventory_fixture, device_data def test_multiple_group_by_no_fail(inventory_fixture, device_data): - inventory_fixture.group_by = ["status.name", "site.name"] + inventory_fixture.group_by = ["status.name", "location.name"] inventory_fixture.create_groups(device_data) inventory_groups = list(inventory_fixture.inventory.groups.keys()) atl01_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("ATL01") @@ -109,23 +110,23 @@ def test_multiple_group_by_no_fail(inventory_fixture, device_data): @patch.object(Display, "display") def test_no_chain_value(mock_display, inventory_fixture, device_data): - inventory_fixture.group_by = ["site.type"] + inventory_fixture.group_by = ["location.type"] inventory_fixture.create_groups(device_data) - mock_display.assert_any_call("Could not find value for type in site.type on device mydevice.") + mock_display.assert_any_call("Could not find value for type in location.type on device mydevice.") @patch.object(Display, "display") -def test_no_name_or_slug_value(mock_display, inventory_fixture, device_data): +def test_no_name_or_display_value(mock_display, inventory_fixture, device_data): inventory_fixture.group_by = ["platform"] inventory_fixture.create_groups(device_data) - mock_display.assert_any_call("No slug or name value for {'napalm_driver': 'asa'} in platform on device mydevice.") + mock_display.assert_any_call("No display or name value for {'napalm_driver': 'asa'} in platform on device mydevice.") @patch.object(Display, "display") def test_group_name_dict(mock_display, inventory_fixture, device_data): inventory_fixture.group_by = ["platform"] inventory_fixture.create_groups(device_data) - mock_display.assert_any_call("No slug or name value for {'napalm_driver': 'asa'} in platform on device mydevice.") + mock_display.assert_any_call("No display or name value for {'napalm_driver': 'asa'} in platform on device mydevice.") def test_group_by_empty_string(inventory_fixture, device_data): @@ -137,7 +138,7 @@ def test_group_by_empty_string(inventory_fixture, device_data): def test_add_ipv4(inventory_fixture, device_data): - inventory_fixture.group_by = ["site"] + inventory_fixture.group_by = ["location"] inventory_fixture.create_groups(device_data) inventory_fixture.add_ipv4_address(device_data) mydevice_host = inventory_fixture.inventory.get_host("mydevice") @@ -145,31 +146,32 @@ def test_add_ipv4(inventory_fixture, device_data): def test_ansible_platform(inventory_fixture, device_data): - inventory_fixture.group_by = ["site"] + inventory_fixture.group_by = ["location"] inventory_fixture.create_groups(device_data) inventory_fixture.add_ansible_platform(device_data) mydevice_host = inventory_fixture.inventory.get_host("mydevice") assert mydevice_host.vars.get("ansible_network_os") == "cisco.asa.asa" -def test_ansible_group_by_tags_slug(inventory_fixture, device_data): - inventory_fixture.group_by = ["tags.slug"] +def test_ansible_group_by_tags_name(inventory_fixture, device_data): + inventory_fixture.group_by = ["tags.name"] inventory_fixture.create_groups(device_data) inventory_groups = list(inventory_fixture.inventory.groups.keys()) - mytag_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("tags_mytag") - mytag2_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("tags_mytag2") - assert ["all", "ungrouped", "tags_mytag", "tags_mytag2"] == inventory_groups + mytag_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("tags_MyTag") + mytag2_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("tags_MyTag2") + assert ["all", "ungrouped", "tags_MyTag", "tags_MyTag2"] == inventory_groups assert ["mydevice"] == mytag_inventory_hosts assert ["mydevice"] == mytag2_inventory_hosts -def test_ansible_group_by_tags_name(inventory_fixture, device_data): +def test_ansible_group_by_tags_raw(inventory_fixture, device_data): inventory_fixture.group_by = ["tags.name"] + inventory_fixture.group_names_raw = True inventory_fixture.create_groups(device_data) inventory_groups = list(inventory_fixture.inventory.groups.keys()) - mytag_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("tags_MyTag") - mytag2_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("tags_MyTag2") - assert ["all", "ungrouped", "tags_MyTag", "tags_MyTag2"] == inventory_groups + mytag_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("MyTag") + mytag2_inventory_hosts = inventory_fixture.inventory.get_groups_dict().get("MyTag2") + assert ["all", "ungrouped", "MyTag", "MyTag2"] == inventory_groups assert ["mydevice"] == mytag_inventory_hosts assert ["mydevice"] == mytag2_inventory_hosts @@ -178,7 +180,7 @@ def test_ansible_group_by_tags_name(inventory_fixture, device_data): def test_ansible_group_by_tags_invalid(mock_display, inventory_fixture, device_data): inventory_fixture.group_by = ["tags"] inventory_fixture.create_groups(device_data) - mock_display.assert_any_call("Tags must be grouped by name or slug. tags is not a valid path.") + mock_display.assert_any_call("Tags must be grouped by name or display. tags is not a valid path.") @patch.object(Display, "display") @@ -190,6 +192,6 @@ def test_ansible_group_by_tags_invalid_path(mock_display, inventory_fixture, dev @patch.object(Display, "display") def test_ansible_group_by_tags_invalid_nested_path(mock_display, inventory_fixture, device_data): - inventory_fixture.group_by = ["tags.slug.name"] + inventory_fixture.group_by = ["tags.var.name"] inventory_fixture.create_groups(device_data) - mock_display.assert_any_call("Tags must be grouped by name or slug. tags.slug.name is not a valid path.") + mock_display.assert_any_call("Tags must be grouped by name or display. tags.var.name is not a valid path.") diff --git a/tests/unit/inventory/test_nb_inventory.py b/tests/unit/inventory/test_nb_inventory.py index 7a465446..ccfee73b 100644 --- a/tests/unit/inventory/test_nb_inventory.py +++ b/tests/unit/inventory/test_nb_inventory.py @@ -48,11 +48,11 @@ def allowed_device_query_parameters_fixture(): "id", "interfaces", "has_primary_ip", + "location", "mac_address", "name", "platform", "rack_id", - "region", "role", "tag", ] @@ -63,12 +63,13 @@ def allowed_vm_query_parameters_fixture(): # Subset of parameters - real list is fetched dynamically from Nautobot openapi endpoint return [ "id", + "cluster", "interfaces", "disk", "mac_address", + "has_primary_ip", "name", "platform", - "region", "role", "tag", ] @@ -76,7 +77,6 @@ def allowed_vm_query_parameters_fixture(): @pytest.mark.parametrize("parameter, expected", load_relative_test_data("validate_query_parameter")) def test_validate_query_parameter(inventory_fixture, parameter, expected): - value = "some value, doesn't matter" result = inventory_fixture.validate_query_parameter({parameter: value}, inventory_fixture.allowed_device_query_parameters) assert (result == (parameter, value)) == expected @@ -84,7 +84,6 @@ def test_validate_query_parameter(inventory_fixture, parameter, expected): @pytest.mark.parametrize("parameters, expected", load_relative_test_data("filter_query_parameters")) def test_filter_query_parameters(inventory_fixture, parameters, expected): - result = inventory_fixture.filter_query_parameters(parameters, inventory_fixture.allowed_device_query_parameters) # Result is iterators of tuples @@ -102,7 +101,6 @@ def test_filter_query_parameters(inventory_fixture, parameters, expected): @pytest.mark.parametrize("options, expected", load_relative_test_data("refresh_url")) def test_refresh_url(inventory_fixture, options, expected): - inventory_fixture.query_filters = options["query_filters"] inventory_fixture.device_query_filters = options["device_query_filters"] inventory_fixture.vm_query_filters = options["vm_query_filters"] diff --git a/tests/unit/lookup/test_lookup_graphql.py b/tests/unit/lookup/test_lookup_graphql.py index fccfa2f8..3e17e30a 100644 --- a/tests/unit/lookup/test_lookup_graphql.py +++ b/tests/unit/lookup/test_lookup_graphql.py @@ -70,3 +70,16 @@ def test_query_api_query_variables_wrong_type(graphql_test_query_with_var, nauto ) assert str(exc.value) == "graph_variables parameter must be of key/value pairs. Please see docs for examples." + + +def test_invalid_api_version_error_handling(monkeypatch, nautobot_url): + monkeypatch.setattr(pynautobot.api, "version", "1.6") + with pytest.raises(ValueError) as exc: + nautobot_lookup_graphql( + url=nautobot_url, + token="abc123", + validate_certs=False, + query={}, + variables=None, + ) + assert str(exc.value) == "Nautobot version 1 detected, please downgrade pynautobot to version 1.x" diff --git a/tests/unit/module_utils/test_data/build_query_params_child/data.json b/tests/unit/module_utils/test_data/build_query_params_child/data.json index a6120aa8..04f83a63 100644 --- a/tests/unit/module_utils/test_data/build_query_params_child/data.json +++ b/tests/unit/module_utils/test_data/build_query_params_child/data.json @@ -6,17 +6,14 @@ "serial": "FXS1001", "comments": "Temp device", "primary_ip4": { - "address": "172.16.180.1/24", - "vrf": "Test VRF" + "address": "172.16.180.1/24" } }, "child": { - "address": "172.16.180.1/24", - "vrf": "Test VRF" + "address": "172.16.180.1/24" }, "expected": { - "address": "172.16.180.1/24", - "vrf_id": 1 + "address": "172.16.180.1/24" } }, { @@ -26,55 +23,14 @@ "serial": "FXS1001", "comments": "Temp device", "primary_ip4": { - "address": "2001::1:1/64", - "vrf": "Test VRF" + "address": "2001::1:1/64" } }, "child": { - "address": "2001::1:1/64", - "vrf": "Test VRF" + "address": "2001::1:1/64" }, "expected": { - "address": "2001::1:1/64", - "vrf_id": 1 - } - }, - { - "parent": "assigned_object", - "module_data": { - "address": "10.10.10.1/24", - "description": "Test description", - "assigned_object": { - "device": "test100", - "name": "Ethernet1/1" - } - }, - "child": { - "device": "test100", - "name": "Ethernet1/1" - }, - "expected": { - "device_id": 1, - "name": "Ethernet1/1" - } - }, - { - "parent": "assigned_object", - "module_data": { - "address": "10.10.10.1/24", - "description": "Test description", - "assigned_object": { - "virtual_machine": "test100-vm", - "name": "Ethernet1/1" - } - }, - "child": { - "virtual_machine": "test100-vm", - "name": "Ethernet1/1" - }, - "expected": { - "virtual_machine_id": 1, - "name": "Ethernet1/1" + "address": "2001::1:1/64" } }, { @@ -118,17 +74,14 @@ "module_data": { "address": "10.10.10.1/24", "nat_inside": { - "address": "192.168.1.1/24", - "vrf": "Test VRF" + "address": "192.168.1.1/24" } }, "child": { - "address": "192.168.1.1/24", - "vrf": "Test VRF" + "address": "192.168.1.1/24" }, "expected": { - "address": "192.168.1.1/24", - "vrf_id": 1 + "address": "192.168.1.1/24" } }, { @@ -138,7 +91,7 @@ "description": "Test Prefix", "vlan": { "name": "Test VLAN", - "site": "Test Site", + "location": "Test Location", "tenant": "Test Tenant", "vid": 1, "vlan_group": "Test VLAN group" @@ -146,17 +99,17 @@ }, "child": { "name": "Test VLAN", - "site": "Test Site", + "location": "Test Location", "tenant": "Test Tenant", "vid": 1, "vlan_group": "Test VLAN group" }, "expected": { "name": "Test VLAN", - "site_id": 1, + "location": "Test Location", "tenant_id": 1, "vid": 1, - "group": "Test VLAN group" + "vlan_group": "Test VLAN group" } }, { @@ -167,17 +120,16 @@ "vlan_group": { "name": "Test VLAN Group", "slug": "test-vlan-group", - "site": "Test Site" + "location": "Test Location" } }, "child": { "name": "Test VLAN Group", - "slug": "test-vlan-group", - "site": "Test Site" + "location": "Test Location" }, "expected": { - "slug": "test-vlan-group", - "site_id": 1 + "name": "Test VLAN Group", + "location": "Test Location" } }, { @@ -187,18 +139,18 @@ "description": "Test Prefix", "untagged_vlan": { "name": "Test VLAN", - "site": "Test Site", + "location": "Test Location", "vid": 1 } }, "child": { "name": "Test VLAN", - "site": "Test Site", + "location": "Test Location", "vid": 1 }, "expected": { "name": "Test VLAN", - "site_id": 1, + "location": "Test Location", "vid": 1 } }, @@ -209,16 +161,18 @@ "description": "Test Prefix", "vrf": { "name": "Test VRF", + "rd": "1:1", "tenant": "Test Tenant" } }, "child": { "name": "Test VRF", - "tenant": "Test Tenant" + "tenant": "Test Tenant", + "rd": "1:1" }, "expected": { "name": "Test VRF", - "tenant_id": 1 + "rd": "1:1" } }, { @@ -235,7 +189,7 @@ "term_side": "A" }, "expected": { - "circuit_id": 1, + "circuit": "Circuit1", "term_side": "A" } }, diff --git a/tests/unit/module_utils/test_data/build_query_params_no_child/data.json b/tests/unit/module_utils/test_data/build_query_params_no_child/data.json index 014457aa..7c8fc97e 100644 --- a/tests/unit/module_utils/test_data/build_query_params_no_child/data.json +++ b/tests/unit/module_utils/test_data/build_query_params_no_child/data.json @@ -19,30 +19,17 @@ "port_speed": 10000 }, "expected": { - "circuit_id": 1, + "circuit": "Test Circuit", "term_side": "A" } }, { "parent": "circuit_type", "module_data": { - "name": "Test Circuit Type", - "slug": "test-circuit-type" + "name": "Test Circuit Type" }, "expected": { - "slug": "test-circuit-type" - } - }, - { - "parent": "aggregate", - "module_data": { - "prefix": "192.168.0.0/16", - "rir": "Example RIR", - "date_added": "2019-01-18" - }, - "expected": { - "prefix": "192.168.0.0/16", - "rir_id": 1 + "name": "Test Circuit Type" } }, { @@ -60,21 +47,19 @@ { "parent": "cluster_group", "module_data": { - "name": "Test Cluster Group", - "slug": "test-cluster-group" + "name": "Test Cluster Group" }, "expected": { - "slug": "test-cluster-group" + "name": "Test Cluster Group" } }, { "parent": "cluster_type", "module_data": { - "name": "Test Cluster Type", - "slug": "test-cluster-type" + "name": "Test Cluster Type" }, "expected": { - "slug": "test-cluster-type" + "name": "Test Cluster Type" } }, { @@ -95,29 +80,27 @@ }, "expected": { "name": "Device Bay #1", - "device_id": 1 + "device": "test100" } }, { - "parent": "device_role", + "parent": "role", "module_data": { "name": "Test Device Role", - "slug": "test-device-role", "status": "Active" }, "expected": { - "slug": "test-device-role" + "name": "Test Device Role" } }, { "parent": "device_type", "module_data": { - "name": "Test Device Type", - "slug": "test-device-type", + "model": "Test Device Type", "status": "Active" }, "expected": { - "slug": "test-device-type" + "model": "Test Device Type" } }, { @@ -164,31 +147,27 @@ }, "expected": { "name": "10G-SFP+", - "device_id": 1 + "device": "test100" } }, { "parent": "ip_address", "module_data": { "address": "192.168.1.1/24", - "vrf": "Test VRF", "description": "Test description" }, "expected": { - "address": "192.168.1.1/24", - "vrf_id": 1 + "address": "192.168.1.1/24" } }, { "parent": "prefix", "module_data": { "prefix": "10.10.10.0/24", - "vrf": "Test VRF", "status": "Reserved" }, "expected": { - "prefix": "10.10.10.0/24", - "vrf_id": 1 + "prefix": "10.10.10.0/24" } }, { @@ -204,107 +183,81 @@ "parent": "provider", "module_data": { "name": "Test Provider", - "slug": "test-provider", "asn": 65001 }, "expected": { - "slug": "test-provider" + "name": "Test Provider" } }, { "parent": "rack", "module_data": { "name": "Test Rack", - "slug": "test-rack", - "site": "Test Site" + "location": "Test Site" }, "expected": { "name": "Test Rack", - "site_id": 1 + "location": "Test Site" } }, { "parent": "rack_group", "module_data": { - "name": "Test Rack Group", - "slug": "test-rack-group" - }, - "expected": { - "slug": "test-rack-group" - } - }, - { - "parent": "rack_role", - "module_data": { - "name": "Test Rack Role", - "slug": "test-rack-role" - }, - "expected": { - "slug": "test-rack-role" - } - }, - { - "parent": "region", - "module_data": { - "name": "Test Region", - "slug": "test-region" + "name": "Test Rack Group" }, "expected": { - "slug": "test-region" + "name": "Test Rack Group" } }, { - "parent": "parent_region", + "parent": "role", "module_data": { - "name": "Parent Region", - "slug": "parent-region" + "name": "Test Rack Role" }, "expected": { - "slug": "parent-region" + "name": "Test Rack Role" } }, { "parent": "rir", "module_data": { - "name": "Test RIR One", - "slug": "test-rir-one" + "name": "Test RIR One" }, "expected": { - "slug": "test-rir-one" + "name": "Test RIR One" } }, { - "parent": "site", + "parent": "location", "module_data": { - "name": "Test Site", - "slug": "test-site", + "id": "1", + "name": "Test Location", "asn": 65000, "contact_name": "John Smith" }, "expected": { - "slug": "test-site" + "id": "1", + "name": "Test Location" } }, { "parent": "tenant", "module_data": { "name": "Test Tenant", - "description": "Test Description", - "slug": "test-tenant" + "description": "Test Description" }, "expected": { - "slug": "test-tenant" + "name": "Test Tenant" } }, { "parent": "tenant_group", "module_data": { "name": "Test Tenant Group", - "description": "Test Description", - "slug": "test-tenant-group" + "description": "Test Description" }, "expected": { - "slug": "test-tenant-group" + "name": "Test Tenant Group" } }, { @@ -316,7 +269,7 @@ }, "expected": { "name": "SFP+ (10GBE)", - "devicetype_id": 1 + "device_type": 1 } }, { @@ -327,7 +280,7 @@ }, "expected": { "name": "Bay 1", - "devicetype_id": 1 + "device_type": 1 } }, { @@ -338,7 +291,7 @@ }, "expected": { "name": "CP 1", - "devicetype_id": 1 + "device_type": 1 } }, { @@ -349,7 +302,7 @@ }, "expected": { "name": "CP - Server 1", - "devicetype_id": 1 + "device_type": 1 } }, { @@ -360,7 +313,7 @@ }, "expected": { "name": "Dev Intf 1", - "devicetype_id": 1 + "device_type": 1 } }, { @@ -371,7 +324,7 @@ }, "expected": { "name": "FP 1", - "devicetype_id": 1 + "device_type": 1 } }, { @@ -382,7 +335,7 @@ }, "expected": { "name": "PO 1", - "devicetype_id": 1 + "device_type": 1 } }, { @@ -393,7 +346,7 @@ }, "expected": { "name": "PP 1", - "devicetype_id": 1 + "device_type": 1 } }, { diff --git a/tests/unit/module_utils/test_data/choices_id/data.json b/tests/unit/module_utils/test_data/choices_id/data.json index b99be50d..7eb6c1c1 100644 --- a/tests/unit/module_utils/test_data/choices_id/data.json +++ b/tests/unit/module_utils/test_data/choices_id/data.json @@ -1,41 +1,28 @@ [ { - "endpoint": "circuits", + "endpoint": "cables", "data": { - "status": "Active" + "type": "cat5" }, "expected": { - "status": "temp" - } - }, - { - "endpoint": "circuits", - "data": { - "status": 1 - }, - "expected": { - "status": 1 + "type": "temp" } }, { "endpoint": "devices", "data": { - "status": "Active", "face": "Front" }, "expected": { - "status": "temp", "face": "temp" } }, { "endpoint": "devices", "data": { - "status": 5, "face": 1 }, "expected": { - "status": 5, "face": 1 } }, @@ -80,52 +67,28 @@ { "endpoint": "ip_addresses", "data": { - "status": "Active", - "role": "Loopback" + "type": "dhcp" }, "expected": { - "status": "temp", - "role": "temp" + "type": "temp" } }, { "endpoint": "ip_addresses", "data": { - "status": 1, - "role": 30 - }, - "expected": { - "status": 1, - "role": 30 - } - }, - { - "endpoint": "prefixes", - "data": { - "status": "Active" + "type": 30 }, "expected": { - "status": "temp" - } - }, - { - "endpoint": "prefixes", - "data": { - "status": 2 - }, - "expected": { - "status": 2 + "type": 30 } }, { "endpoint": "racks", "data": { - "status": "Active", "outer_unit": "Inches", "type": "2-post Frame" }, "expected": { - "status": "temp", "outer_unit": "temp", "type": "temp" } @@ -133,70 +96,28 @@ { "endpoint": "racks", "data": { - "status": 0, "type": 1100 }, "expected": { - "status": 0, "type": 1100 } }, - { - "endpoint": "sites", - "data": { - "status": "Active" - }, - "expected": { - "status": "temp" - } - }, - { - "endpoint": "sites", - "data": { - "status": 2 - }, - "expected": { - "status": 2 - } - }, { "endpoint": "virtual_machines", "data": { - "status": "Offline", "face": "Front" }, "expected": { - "status": "temp", "face": "temp" } }, { "endpoint": "virtual_machines", "data": { - "status": 1, "face": 0 }, "expected": { - "status": 1, "face": 0 } - }, - { - "endpoint": "vlans", - "data": { - "status": "Active" - }, - "expected": { - "status": "temp" - } - }, - { - "endpoint": "vlans", - "data": { - "status": 2 - }, - "expected": { - "status": 2 - } } ] \ No newline at end of file diff --git a/tests/unit/module_utils/test_data/find_app/data.json b/tests/unit/module_utils/test_data/find_app/data.json index 4484fb70..28d5e6cc 100644 --- a/tests/unit/module_utils/test_data/find_app/data.json +++ b/tests/unit/module_utils/test_data/find_app/data.json @@ -15,10 +15,6 @@ "endpoint": "circuit_terminations", "app": "circuits" }, - { - "endpoint": "device_roles", - "app": "dcim" - }, { "endpoint": "device_types", "app": "dcim" @@ -31,6 +27,10 @@ "endpoint": "interfaces", "app": "dcim" }, + { + "endpoint": "locations", + "app": "dcim" + }, { "endpoint": "manufacturers", "app": "dcim" @@ -47,21 +47,9 @@ "endpoint": "rack_groups", "app": "dcim" }, - { - "endpoint": "rack_roles", - "app": "dcim" - }, - { - "endpoint": "regions", - "app": "dcim" - }, - { - "endpoint": "sites", - "app": "dcim" - }, - { - "endpoint": "aggregates", - "app": "ipam" + { + "endpoint": "roles", + "app": "extras" }, { "endpoint": "ip_addresses", @@ -71,10 +59,6 @@ "endpoint": "prefixes", "app": "ipam" }, - { - "endpoint": "roles", - "app": "ipam" - }, { "endpoint": "rirs", "app": "ipam" diff --git a/tests/unit/module_utils/test_data/normalize_data/data.json b/tests/unit/module_utils/test_data/normalize_data/data.json index 2e4cf376..c7f1ae25 100644 --- a/tests/unit/module_utils/test_data/normalize_data/data.json +++ b/tests/unit/module_utils/test_data/normalize_data/data.json @@ -28,7 +28,7 @@ "circuit_type": "Test Circuit Type" }, "after": { - "circuit_type": "test-circuit-type" + "circuit_type": "Test Circuit Type" } }, { @@ -44,7 +44,7 @@ "cluster_group": "Test Cluster_group" }, "after": { - "cluster_group": "test-cluster_group" + "cluster_group": "Test Cluster_group" } }, { @@ -52,7 +52,7 @@ "cluster_type": "Test Cluster Type" }, "after": { - "cluster_type": "test-cluster-type" + "cluster_type": "Test Cluster Type" } }, { @@ -65,10 +65,10 @@ }, { "before": { - "device_role": "Core Switch" + "role": "Core Switch" }, "after": { - "device_role": "core-switch" + "role": "Core Switch" } }, { @@ -76,7 +76,7 @@ "device_type": "Cisco Switch" }, "after": { - "device_type": "cisco-switch" + "device_type": "Cisco Switch" } }, { @@ -84,7 +84,7 @@ "group": "Test Group1" }, "after": { - "group": "test-group1" + "group": "Test Group1" } }, { @@ -100,7 +100,7 @@ "manufacturer": "Cisco" }, "after": { - "manufacturer": "cisco" + "manufacturer": "Cisco" } }, { @@ -124,15 +124,15 @@ "platform": "Cisco IOS" }, "after": { - "platform": "cisco-ios" + "platform": "Cisco IOS" } }, { "before": { - "prefix_role": "TEst Role-1" + "role": "TEst Role-1" }, "after": { - "prefix_role": "test-role-1" + "role": "TEst Role-1" } }, { @@ -164,7 +164,7 @@ "provider": "Test Provider" }, "after": { - "provider": "test-provider" + "provider": "Test Provider" } }, { @@ -180,23 +180,15 @@ "rack_group": "RacK_group" }, "after": { - "rack_group": "rack_group" - } - }, - { - "before": { - "rack_role": "Test Rack Role" - }, - "after": { - "rack_role": "test-rack-role" + "rack_group": "RacK_group" } }, { "before": { - "region": "Test Region_1" + "role": "Test Rack Role" }, "after": { - "region": "test-region_1" + "role": "Test Rack Role" } }, { @@ -204,23 +196,15 @@ "rir": "Test RIR_One" }, "after": { - "rir": "test-rir_one" - } - }, - { - "before": { - "prefix_role": "TEst Role-1" - }, - "after": { - "prefix_role": "test-role-1" + "rir": "Test RIR_One" } }, { "before": { - "slug": "Test to_slug" + "role": "TEst Role-1" }, "after": { - "slug": "test-to_slug" + "role": "TEst Role-1" } }, { @@ -228,7 +212,7 @@ "tenant": "Test Tenant" }, "after": { - "tenant": "test-tenant" + "tenant": "Test Tenant" } }, { @@ -236,7 +220,7 @@ "tenant_group": "Test Tenant Group" }, "after": { - "tenant_group": "test-tenant-group" + "tenant_group": "Test Tenant Group" } }, { @@ -268,15 +252,15 @@ "vlan_group": "Test VLAN Group" }, "after": { - "vlan_group": "test-vlan-group" + "vlan_group": "Test VLAN Group" } }, { "before": { - "vlan_role": "Access Role" + "role": "Access Role" }, "after": { - "vlan_role": "Access Role" + "role": "Access Role" } }, { @@ -325,7 +309,7 @@ }, "after": { "vlan": { - "vlan_group": "test-vlan-group" + "vlan_group": "Test VLAN Group" } } }, diff --git a/tests/unit/module_utils/test_data/slug/data.json b/tests/unit/module_utils/test_data/slug/data.json deleted file mode 100644 index 47d956f6..00000000 --- a/tests/unit/module_utils/test_data/slug/data.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "non_slug": "Test device-1_2", - "expected": "test-device-1_2" - }, - { - "non_slug": "TEST_DEVICE_1_2", - "expected": "test_device_1_2" - }, - { - "non_slug": "TEST DEVICE 1 2", - "expected": "test-device-1-2" - }, - { - "non_slug": 1, - "expected": 1 - }, - { - "non_slug": null, - "expected": null - }, - { - "non_slug": "test1.example.com", - "expected": "test1-example-com" - } -] diff --git a/tests/unit/module_utils/test_nautobot_base_class.py b/tests/unit/module_utils/test_nautobot_base_class.py index 6dd71e7a..47bca429 100644 --- a/tests/unit/module_utils/test_nautobot_base_class.py +++ b/tests/unit/module_utils/test_nautobot_base_class.py @@ -13,6 +13,7 @@ from functools import partial from unittest.mock import patch, MagicMock, Mock from ansible.module_utils.basic import AnsibleModule +import pynautobot try: from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import NautobotModule @@ -44,14 +45,14 @@ def fixture_arg_spec(): "token": "0123456789", "data": { "name": "Test Device1", - "device_role": "Core Switch", + "role": "Core Switch", "device_type": "Cisco Switch", "manufacturer": "Cisco", - "site": "Test Site", + "location": "Test Location", "asset_tag": "1001", }, "state": "present", - "api_version": "1.3", + "api_version": "2.0", "validate_certs": False, } @@ -60,10 +61,10 @@ def fixture_arg_spec(): def normalized_data(): return { "name": "Test Device1", - "device_role": "core-switch", + "role": "core-switch", "device_type": "cisco-switch", "manufacturer": "cisco", - "site": "test-site", + "location": "test-location", "asset_tag": "1001", } @@ -81,10 +82,10 @@ def mock_ansible_module(fixture_arg_spec): def find_ids_return(): return { "name": "Test Device1", - "device_role": 1, + "role": 1, "device_type": 1, "manufacturer": 1, - "site": 1, + "location": 1, "asset_tag": "1001", } @@ -161,13 +162,6 @@ def test_remove_arg_spec_defaults(mock_module, data, expected): assert new_data == expected -@pytest.mark.parametrize("non_slug, expected", load_relative_test_data("slug")) -def test_to_slug_returns_valid_slug(mock_module, non_slug, expected): - got_slug = mock_module._to_slug(non_slug) - - assert got_slug == expected - - @pytest.mark.parametrize("endpoint, app", load_relative_test_data("find_app")) def test_find_app_returns_valid_app(mock_module, endpoint, app): assert app == mock_module._find_app(endpoint), "app: %s, endpoint: %s" % ( @@ -330,3 +324,11 @@ def test_get_query_param_id_return_uuid(mock_module, value): def test_get_query_param_id_return_int(mock_module, value): data = mock_module._get_query_param_id("test", {"test": value}) assert data == value + + +@pytest.mark.parametrize("api_version, obj_type", [("1.6", type(None)), ("2.0", pynautobot.core.api.Api)]) +def test_invalid_api_version_error_handling(mock_ansible_module, monkeypatch, api_version, obj_type): + """Test if pynautobot raises ValueError when Nautobot version is lower than 2.0 and returns None from _connect_api.""" + monkeypatch.setattr(pynautobot.api, "version", api_version) + module = NautobotModule(mock_ansible_module, "devices") + assert isinstance(module.nb, obj_type)