diff options
Diffstat (limited to 'ansible_collections/vultr')
76 files changed, 3564 insertions, 1063 deletions
diff --git a/ansible_collections/vultr/cloud/.github/workflows/cleanup.yml b/ansible_collections/vultr/cloud/.github/workflows/cleanup.yml new file mode 100644 index 000000000..bb244725e --- /dev/null +++ b/ansible_collections/vultr/cloud/.github/workflows/cleanup.yml @@ -0,0 +1,69 @@ +--- +name: Cleanup + +on: + pull_request: + types: [labeled] + schedule: + - cron: 55 5 * * 2 # Run weekly + +jobs: + integration-test: + name: Cleaning up cloud test env + if: ${{ github.event.label.name == 'cleanup' || github.event_name == 'schedule' }} + runs-on: ubuntu-20.04 + defaults: + run: + working-directory: ansible_collections/vultr/cloud + strategy: + max-parallel: 1 + fail-fast: false + matrix: + ansible: + - stable-2.15 + python: + - "3.10" + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + path: ansible_collections/vultr/cloud + + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python }} + + - name: Install ansible-base (${{ matrix.ansible }}) + run: | + python -m pip install --upgrade pip + pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check + + - name: Build and install collection + run: | + ansible-galaxy collection build . + ansible-galaxy collection install *.gz + + - name: Add config file + env: + VULTR_CONFIG_FILE: ${{ secrets.VULTR_CONFIG_FILE }} + run: | + echo "$VULTR_CONFIG_FILE" > tests/integration/cloud-config-vultr.ini + + - name: Ensure no other integration test is currently running + uses: softprops/turnstyle@v1 + timeout-minutes: 60 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + same-branch-only: false + + - name: Cleanup resources + run: >- + ansible-test + integration + --docker + -v + --color + --continue-on-error + cloud/vultr/_reset_cloud diff --git a/ansible_collections/vultr/cloud/.github/workflows/integration.yml b/ansible_collections/vultr/cloud/.github/workflows/integration.yml index 689891737..a79039300 100644 --- a/ansible_collections/vultr/cloud/.github/workflows/integration.yml +++ b/ansible_collections/vultr/cloud/.github/workflows/integration.yml @@ -5,10 +5,7 @@ on: pull_request: types: [labeled] push: - branches: - - main paths: - - ".github/workflows/integration.yml" - "plugins/**" - "tests/integration/**" schedule: @@ -17,7 +14,7 @@ on: jobs: integration-test: name: Integration test Ansible ${{ matrix.ansible }} Py${{ matrix.python }} - if: ${{ github.event.label.name == 'automation' || github.ref_name == 'main' }} + if: ${{ github.event.label.name == 'automation' || github.ref_name == 'main' || github.event_name == 'schedule' }} runs-on: ubuntu-20.04 defaults: run: @@ -27,17 +24,17 @@ jobs: fail-fast: false matrix: ansible: - - stable-2.14 + - stable-2.15 python: - "3.10" steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: ansible_collections/vultr/cloud - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} diff --git a/ansible_collections/vultr/cloud/.github/workflows/publish.yml b/ansible_collections/vultr/cloud/.github/workflows/publish.yml index 8e13d6925..54c34f5e6 100644 --- a/ansible_collections/vultr/cloud/.github/workflows/publish.yml +++ b/ansible_collections/vultr/cloud/.github/workflows/publish.yml @@ -16,12 +16,12 @@ jobs: run: working-directory: ansible_collections/vultr/cloud steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: path: ansible_collections/vultr/cloud - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.x" diff --git a/ansible_collections/vultr/cloud/.github/workflows/sanity.yml b/ansible_collections/vultr/cloud/.github/workflows/sanity.yml index 386568562..ab2a3f14c 100644 --- a/ansible_collections/vultr/cloud/.github/workflows/sanity.yml +++ b/ansible_collections/vultr/cloud/.github/workflows/sanity.yml @@ -21,18 +21,18 @@ jobs: strategy: matrix: ansible: - - stable-2.12 - stable-2.13 - stable-2.14 + - stable-2.15 - devel steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: ansible_collections/vultr/cloud - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.10" diff --git a/ansible_collections/vultr/cloud/.github/workflows/unit.yml b/ansible_collections/vultr/cloud/.github/workflows/unit.yml index 667b58c30..216a67e5f 100644 --- a/ansible_collections/vultr/cloud/.github/workflows/unit.yml +++ b/ansible_collections/vultr/cloud/.github/workflows/unit.yml @@ -7,9 +7,8 @@ on: branches: - main paths: - - '.github/workflows/unit.yml' - - 'plugins/**' - - 'tests/unit/**' + - "plugins/**" + - "tests/unit/**" workflow_call: workflow_dispatch: @@ -24,17 +23,17 @@ jobs: fail-fast: false matrix: ansible: - - stable-2.14 + - stable-2.15 python: - "3.10" steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: ansible_collections/vultr/cloud - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} diff --git a/ansible_collections/vultr/cloud/CHANGELOG.rst b/ansible_collections/vultr/cloud/CHANGELOG.rst index 9374416d8..867080cc0 100644 --- a/ansible_collections/vultr/cloud/CHANGELOG.rst +++ b/ansible_collections/vultr/cloud/CHANGELOG.rst @@ -5,6 +5,78 @@ Vultr Collection Release Notes .. contents:: Topics +v1.12.1 +======= + +Bugfixes +-------- + +- Fixed an error while waiting for a specific state and the API returns an empty response. (https://github.com/vultr/ansible-collection-vultr/issues/108). +- instance_info - Fixed the alias ``name`` being was used on the wrong argument. (https://github.com/vultr/ansible-collection-vultr/issues/105). + +v1.12.0 +======= + +Minor Changes +------------- + +- Added retry on HTTP 504 returned by the API (https://github.com/vultr/ansible-collection-vultr/pull/104). + +Bugfixes +-------- + +- Fixed an issue with waiting for state (https://github.com/vultr/ansible-collection-vultr/pull/102). + +New Modules +----------- + +- object_storage - Manages object storages on Vultr + +v1.11.0 +======= + +Minor Changes +------------- + +- Implemented a feature to distinguish resources by region if available. This allows to have identical name per region e.g. a VPC named ``default`` in each region. (https://github.com/vultr/ansible-collection-vultr/pull/98). +- instance - Added a new param ``user_scheme`` to change user scheme to non-root on Linux while creating the instance (https://github.com/vultr/ansible-collection-vultr/issues/96). + +Bugfixes +-------- + +- reserved_ip - Fixed an issue which caused the module to fail, also enabled integration tests (https://github.com/vultr/ansible-collection-vultr/issues/92). + +v1.10.1 +======= + +Bugfixes +-------- + +- instance - Fixed an issue detecting the instance state returned by the API (https://github.com/vultr/ansible-collection-vultr/pull/89). + +v1.10.0 +======= + +Minor Changes +------------- + +- inventory - Added VPC/VPC 2.0 support by adding ``internal_ip`` to the attributes (https://github.com/vultr/ansible-collection-vultr/issues/86). + +v1.9.0 +====== + +Bugfixes +-------- + +- firewall_rule - Fixed an idempotency issue if parameter ``port`` is set on protocols other than TCP/UDP (https://github.com/vultr/ansible-collection-vultr/issues/76). + +New Modules +----------- + +- bare_metal - Manages bare metal machines on Vultr. +- vpc2 - Manages VPCs 2.0 on Vultr +- vpc2_info - Gather information about the Vultr VPCs 2.0 + v1.8.0 ====== diff --git a/ansible_collections/vultr/cloud/FILES.json b/ansible_collections/vultr/cloud/FILES.json index e4c120fb8..efb60cea2 100644 --- a/ansible_collections/vultr/cloud/FILES.json +++ b/ansible_collections/vultr/cloud/FILES.json @@ -8,1515 +8,1746 @@ "format": 1 }, { - "name": ".ansible-lint", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8e858e68d7c1937d65dfcad8b39b28b8d7e41aac65eff967772fba0c3a882a15", + "name": "changelogs", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "codecov.yml", + "name": "changelogs/fragments", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "changelogs/fragments/.keep", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0271dcfe609d71afb466112f2d1c4c13943580fa97bb42b2baa08a1c37bb1c14", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "format": 1 }, { - "name": "README.md", + "name": "changelogs/.gitignore", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d0781fe71bb74c2b2aaef28dc2c5e081dd0f4b3977a1247c72b22827d5dc6726", + "chksum_sha256": "919ef00776e7d2ff349950ac4b806132aa9faf006e214d5285de54533e443b33", "format": 1 }, { - "name": "meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "changelogs/changelog.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4c3acebdf5e2a94572a3152197fa488806a5cc61b797220092efc9c7a10085f2", "format": 1 }, { - "name": "meta/runtime.yml", + "name": "changelogs/config.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "491775c582aeecf06f52f7ed2c3764ebe5e6c35476c8f02c9a4068745385ccac", + "chksum_sha256": "0d1c790424791b634a9c7704aa0e9ec56e3ff34a602f269d68a356d87c777b3a", "format": 1 }, { - "name": "tests", + "name": ".github", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration", + "name": ".github/workflows", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/cloud-config-vultr.ini.template", + "name": ".github/workflows/unit.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "13818bbda928f18107c0e94118d0bd1f52fc805751aeba8f278140c7dc6e5e29", - "format": 1 - }, - { - "name": "tests/integration/targets", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "chksum_sha256": "5b6f66b465bab31feebc85b6add960def2e50f82d5bcafa408873d2be5f2e722", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": ".github/workflows/cleanup.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "300af2b95f5604bb00257206a589e731d4b36ceab75685d32975a0cddc6dae8d", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": ".github/workflows/integration.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b197d1be7422ff61a7aab5bad0d4dffc7c741990abab6132abe65db1a1f38586", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/meta/main.yml", + "name": ".github/workflows/sanity.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "5be1c7e95ed12ccc882570d1504b2273cf11104b0fa1167791cf1da12c97edda", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": ".github/workflows/publish.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "25ae9a6854a6ae27d4d9e41fcfde14d07d4272e4364deb5649abfb0db42ddb4d", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/tasks/tests.yml", + "name": ".github/dependabot.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "78b2bbacaa516217cf90de007da05136b7f08ef90bcb8c6d9e6320eaee45ee52", + "chksum_sha256": "d207e80d10726360f2046d4b2473a3cfd9f9eca99590281fa39d88f78e745145", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/tasks/main.yml", + "name": "CHANGELOG.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b3a529e7fe7a88bd74d28e0d1a59444ff919861c898ce936304aa3cf905226", + "chksum_sha256": "6efbfe17a2c629dd958e13979053d0533e3d9c58aeecd9387e2e9ef4a465df26", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "COPYING", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c61f12da7cdad526bdcbed47a4c0a603e60dbbfdaf8b66933cd088e9132c303f", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/defaults/main.yml", + "name": "CONTRIBUTING.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "10b22387a8147bd98ea199fa7e8866837cb3742dd173a2bb2f1c4bfefb326741", + "chksum_sha256": "d61725d614410e2ee0a900fb0f6b6d742ad8fb689ae27c4d6a3a7f89e82fc791", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule_info/aliases", + "name": ".gitignore", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "1467ad38919911ec5759af24376728faf2361c0335d52fb8bea4853e7b698b48", "format": 1 }, { - "name": "tests/integration/targets/common", + "name": "plugins", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/common/default", + "name": "plugins/modules", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/common/default/main.yml", + "name": "plugins/modules/dns_domain.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "11f87c1aa19551822d0b8585fcbb27151354e93cca5298e419581a349a23896d", + "chksum_sha256": "de781d3439aba96749c83b24b29c15e1f62ac807c8cc793e08ea374ece4c3c68", "format": 1 }, { - "name": "tests/integration/targets/common/aliases", + "name": "plugins/modules/account_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e084a3683ef795d1cdbf5e9b253f2ca1f783ae0d0d6e47e419acbbc4fc80bbfa", - "format": 1 - }, - { - "name": "tests/integration/targets/instance", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, - "format": 1 - }, - { - "name": "tests/integration/targets/instance/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "chksum_sha256": "234df324cb37004dff1e9d5847998f97304c9228e67815f05b5087ab5709e911", "format": 1 }, { - "name": "tests/integration/targets/instance/meta/main.yml", + "name": "plugins/modules/instance.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "eea21385ceae95edf0115ad3364bf161232ee50119b5b2ef5480fae6d9cef30b", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/firewall_group.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7e5482639e8b600dff912fc03f7b0baa24a3cfa70f807eeeeb6c1ebfcf354f94", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks/tests.yml", + "name": "plugins/modules/object_storage.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "025d35e438e475b5cae504dcf1dcb8a425de2a5cbff0502018c99ad6780b2960", + "chksum_sha256": "e69e499783341fb8ec78c21d2d9976d96185c140e18f22864da3993c9774e1bc", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks/stop-start.yml", + "name": "plugins/modules/firewall_rule_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "217770633862454ea3c34efe13e29e29a8fb5cd297807c8dd49065f3beec39c3", + "chksum_sha256": "267c9f763168ce7b6c938e874b4048d6492add6766406d3a6cbc3d227ed14da3", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks/failures.yml", + "name": "plugins/modules/snapshot_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b1180d83e69df042e848919bbd93967f6a316ffe983c2d7ad0838b26140d46f4", + "chksum_sha256": "a60ecc36574d60168903ee239185d42e636c8d26356bb84d6c666d8ab7368e50", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks/main.yml", + "name": "plugins/modules/instance_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "98d1c97130c60cd0b5b7594edbf892f99b2d6a5ae73fd24d71e4effdfd415de6", + "chksum_sha256": "fc787595fdeecaf68aa253d7eff5ce08ab0b2b937c8cc180ae7d1e59c7139adc", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks/reinstall.yml", + "name": "plugins/modules/user_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0cc5b6784d2d8030444d57d871f80b2f1a453132fccdeb002142eb027576ebbe", + "chksum_sha256": "ae4e7899a1107f0d9a2dbfac410209528d687ceef6c9f587b3d78cdb974d8e7f", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks/present.yml", + "name": "plugins/modules/vpc2.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "96e9c85025aa4aa2b6bd614718d698d0174563a27d7c9af1927428a40b31528d", + "chksum_sha256": "6c77428c298b1cde682cdf39e707d4dae26bc5efd9b056850a85d40b8226b8bd", "format": 1 }, { - "name": "tests/integration/targets/instance/tasks/absent.yml", + "name": "plugins/modules/bare_metal.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2d33951d4d498963a2311fea64fdf4a1a50b39ea9712ed72b4955393fc1a90c4", + "chksum_sha256": "c16bbdcc107023e4ac71c5cc352d9eee650df7b26a30c2b7f950a63ae557d528", "format": 1 }, { - "name": "tests/integration/targets/instance/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/region_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ee6e31f3192bbe6e0db69cd7efef79a3a3fee40763071aa5c674f5c6951d7bdb", "format": 1 }, { - "name": "tests/integration/targets/instance/defaults/main.yml", + "name": "plugins/modules/plan_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a30d3095617347fb25ffcada3fa1d94729d2e53f0149f1d3379d93270b7a4359", + "chksum_sha256": "3648af6b8fd69f3bb66faf265767fd39a7afd5bebd5f88964db42dc6d0d8d392", "format": 1 }, { - "name": "tests/integration/targets/instance/aliases", + "name": "plugins/modules/vpc_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "903efd1d0f822de7aaaf659d968e13e9104d6af4c3667a782efd8bf056662829", "format": 1 }, { - "name": "tests/integration/targets/instance_info", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/block_storage.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d2a98391d3d84671552b48b0fad61811f753420f09b5b94626e511b3c74cf93f", "format": 1 }, { - "name": "tests/integration/targets/instance_info/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/os_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0143ad73c6b10692c6577730523b0159782bb6a678d3946dc920b3b758565155", "format": 1 }, { - "name": "tests/integration/targets/instance_info/meta/main.yml", + "name": "plugins/modules/startup_script.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "14be407f3eb256735311fde075a3c983abb9b6932925d412e5782cec26c3e23f", "format": 1 }, { - "name": "tests/integration/targets/instance_info/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/snapshot.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "361a3cdac8de6b7ff2ba98859389d9d53e6a45b5f003bd069d9ea78a2759bcfc", "format": 1 }, { - "name": "tests/integration/targets/instance_info/tasks/tests.yml", + "name": "plugins/modules/startup_script_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "008e0933f58e74fd98a4b0600ff49d5ac7e862fe19439be701d180435472c87d", + "chksum_sha256": "23134fcb25c56ab61a08afe195100cd4f2eb5ef14b1a8ba6bfc7b82cdea57859", "format": 1 }, { - "name": "tests/integration/targets/instance_info/tasks/main.yml", + "name": "plugins/modules/ssh_key_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "158f45cabb1bb2f67511f1885c51b65872642bbcaa2915b8605d1f763ce1f832", + "chksum_sha256": "5cedb298db9d7b8b3888eed9a734309a5ef0b0cae1052211cc0a571a9c2ada22", "format": 1 }, { - "name": "tests/integration/targets/instance_info/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/dns_domain_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f76e554deed6163146c291612e807058309f4553b8d5ff9798a0fabe27717307", "format": 1 }, { - "name": "tests/integration/targets/instance_info/defaults/main.yml", + "name": "plugins/modules/user.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3a42de11dbbb07c09b93bfbb2d99d641f66dacb9aa96752234cb55db517f9e89", + "chksum_sha256": "38d3651f9b624fe512dae40c4ef24e4ccb0eae4ea9c394d260b851ff57dc8365", "format": 1 }, { - "name": "tests/integration/targets/instance_info/aliases", + "name": "plugins/modules/plan_metal_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "93bda0d2911f927951c30540a54a8da71a61a20c7f9cafc7368097d335c47aa5", "format": 1 }, { - "name": "tests/integration/targets/snapshot", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/__init__.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "format": 1 }, { - "name": "tests/integration/targets/snapshot/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/firewall_group_info.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2e4dce46bd2ddbbd7ded11f11f8d4b57f15f603595f69d142e1c10bc8532e936", "format": 1 }, { - "name": "tests/integration/targets/snapshot/meta/main.yml", + "name": "plugins/modules/ssh_key.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "5e1a8e741f196a6b080077b88aa14ec6595878108978ef230224592b161ca44b", "format": 1 }, { - "name": "tests/integration/targets/snapshot/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "plugins/modules/firewall_rule.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "930069d8a2f087f4e7cb1b7b853e42fded5dfa8fbb9c532836132438049125fa", "format": 1 }, { - "name": "tests/integration/targets/snapshot/tasks/tests.yml", + "name": "plugins/modules/dns_record.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0284c806f32966951ab87baa051d3be2fe9a8839e37c55c760c695730db110cd", + "chksum_sha256": "4b29de118b42237350431b7bef3dbf92ff98bfe989183756aea92efb0b73589d", "format": 1 }, { - "name": "tests/integration/targets/snapshot/tasks/failures.yml", + "name": "plugins/modules/reserved_ip.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bb2a0533a657d8ccdc7d750a4e6607648123016a127b9a8337c92bcfd4faf7dc", + "chksum_sha256": "98c4609e5b2183915afef8d49fe3f2f62407f5faeaa1d92da7ff8fd8eaa8375e", "format": 1 }, { - "name": "tests/integration/targets/snapshot/tasks/main.yml", + "name": "plugins/modules/vpc2_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7ce50b2181ffe6e2121e1692900fdb107636f90e048c195327fcc13737816a31", + "chksum_sha256": "4d4a3f916a93826f20ed75d12557941dc2da27144bf882f9a68bf378f40bb88b", "format": 1 }, { - "name": "tests/integration/targets/snapshot/tasks/present.yml", + "name": "plugins/modules/vpc.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "30c0334aed12e3f1d1d319de71c91e8faa7e90c0ba23ea8af12e7f66eb1dfb9f", + "chksum_sha256": "9ea848792c5ac44d5d25f366dbab63916f6797c977238ede08a2b2e08f74933b", "format": 1 }, { - "name": "tests/integration/targets/snapshot/tasks/absent.yml", + "name": "plugins/modules/block_storage_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "63b358651e57593af74d74bf7ab7e7812a77443ba1628f321830199245f55760", + "chksum_sha256": "d2677e90317fc892df48133c755f1c9cf8e1281d610f43937abc54e79f78ee81", "format": 1 }, { - "name": "tests/integration/targets/snapshot/defaults", + "name": "plugins/module_utils", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/snapshot/defaults/main.yml", + "name": "plugins/module_utils/common_instance.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6a784801be127bde96b005e775b8981f116875928902348ec6c9384de1b5097b", + "chksum_sha256": "3db5675896b5b2a842f34edcaa022e0562ff0e0fc03c976afd602c2de5792527", "format": 1 }, { - "name": "tests/integration/targets/snapshot/aliases", + "name": "plugins/module_utils/vultr_v2.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "adc7cacc8f196b524b1b56fadd81ca90e4901edd5c3f186297752eaaec8fffc6", "format": 1 }, { - "name": "tests/integration/targets/plan_info", + "name": "plugins/inventory", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/plan_info/tasks", + "name": "plugins/inventory/vultr.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "89603559be67b63ffde3fd25a0adb19e7de94cc90f9a9c1305e264a173f24f3f", + "format": 1 + }, + { + "name": "plugins/doc_fragments", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/plan_info/tasks/main.yml", + "name": "plugins/doc_fragments/__init__.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "501533396ed8009dc79e310c95d764591704b6cd32091ee08eebd005f8a4b87b", + "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "format": 1 }, { - "name": "tests/integration/targets/plan_info/aliases", + "name": "plugins/doc_fragments/vultr_v2.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", + "chksum_sha256": "64f7eb39cbe633e26394afeb6d125d440046ec37f1cf82d4a4ea072092954afa", "format": 1 }, { - "name": "tests/integration/targets/startup_script_info", + "name": "tests", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/meta", + "name": "tests/integration", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/meta/main.yml", + "name": "tests/integration/cloud-config-vultr.ini.template", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "13818bbda928f18107c0e94118d0bd1f52fc805751aeba8f278140c7dc6e5e29", "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/tasks", + "name": "tests/integration/targets", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/tasks/tests.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "20e5a94cc522ef7c6a387acaacce5c6d1a4127524fda45937a22b58e83a38c42", + "name": "tests/integration/targets/firewall_group", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/tasks/main.yml", + "name": "tests/integration/targets/firewall_group/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d5738ca7eeca0a524a80197d73b1d677913903103d5bea0663c8fdc66eb6c09c", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/defaults", + "name": "tests/integration/targets/firewall_group/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/defaults/main.yml", + "name": "tests/integration/targets/firewall_group/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "81ba8e5671cf9d77b15558eb21489b807a60b071c19dc5a16cbfd9ba6ccfe835", + "chksum_sha256": "6f163960098273136e9b6baf9c853e6178c8c34329d584e0b33e41250cd19483", "format": 1 }, { - "name": "tests/integration/targets/startup_script_info/aliases", + "name": "tests/integration/targets/firewall_group/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "e3b3a529e7fe7a88bd74d28e0d1a59444ff919861c898ce936304aa3cf905226", "format": 1 }, { - "name": "tests/integration/targets/region_info", + "name": "tests/integration/targets/firewall_group/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/region_info/tasks", + "name": "tests/integration/targets/firewall_group/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_group/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/region_info/tasks/main.yml", + "name": "tests/integration/targets/firewall_group/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1e9238ef3b628e9be3f45f1907eb44d53a34f973b548064abff1f36d525a8bab", + "chksum_sha256": "ce7cb163662ec14873afee9b83c34874bd0eaf496890d7b7b35d488bf094461b", "format": 1 }, { - "name": "tests/integration/targets/region_info/aliases", + "name": "tests/integration/targets/account_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/account_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", + "chksum_sha256": "a9f61a9487700a83508395d74ce06374baecfcaf4306b30f008d8b726c626a69", "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info", + "name": "tests/integration/targets/account_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/meta", + "name": "tests/integration/targets/account_info/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2b49a94c64afb9d4d95f3cacf9ea2667390dd014585eb65ff4d15e026e346e2e", + "format": 1 + }, + { + "name": "tests/integration/targets/cleanup", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/meta/main.yml", + "name": "tests/integration/targets/cleanup/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "e084a3683ef795d1cdbf5e9b253f2ca1f783ae0d0d6e47e419acbbc4fc80bbfa", "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/tasks", + "name": "tests/integration/targets/cleanup/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/tasks/tests.yml", + "name": "tests/integration/targets/cleanup/tasks/cleanup_firewall_group.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "58728de0ce48a0024eeadf07e4b738b68aa1533ebdad396c9bf0bf0857475365", + "chksum_sha256": "c0c8fb99ae5f40480ba7b0da24f35632388c3865108d7d5148e87dace9adc816", "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/tasks/main.yml", + "name": "tests/integration/targets/cleanup/tasks/cleanup_bare_metal.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "44ed0d376e3a684d03aca3056db7bd74b63451f5334639ae37970b4b468e900d", + "chksum_sha256": "3b74c0f2781eec35a6e75b14be81c287367dbf7a42afa0c276db0f0a56393b28", "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/cleanup/tasks/cleanup_vpc.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8cb8e6f9ea326d780e4565a67a967911fdf9ca09a039b904b600f4674955eb59", "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/defaults/main.yml", + "name": "tests/integration/targets/cleanup/tasks/cleanup_reserved_ip.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f09f3081e9a29164ed5d17114a52e97f2b8190d31c8c99cd23601d9f53c50e01", + "chksum_sha256": "7f55ef9910de1c95c3f152822b02b1dcc77bc347c559f4d0ea9850ed67ed0466", "format": 1 }, { - "name": "tests/integration/targets/ssh_key_info/aliases", + "name": "tests/integration/targets/cleanup/tasks/cleanup_block_storage.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "f1b0b7013c9ed7e03d27d7f213415654e0e57b204526029921416e1722dd8c82", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/cleanup/tasks/cleanup_user.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d045ec23fee0ba28312d3a62b2c177e40e2991bafd1363f4862585f2cbdcfb5b", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/cleanup/tasks/cleanup_object_storage.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "55f43e34c09e93cb44ff0c38d845f833ca4c3736a666851ac9ce685a25df9ddf", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/meta/main.yml", + "name": "tests/integration/targets/cleanup/tasks/cleanup_dns_domain.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "0f70151df2fe2eb1b434fccf8e2d8eba7e13db7cb110520c1e69784499bdc2a8", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/tasks", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/cleanup/tasks/cleanup_network.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1c6f111d899836a496e790770077aa92db40ceca90633a5d5b72200a388dce2e", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/tasks/tests.yml", + "name": "tests/integration/targets/cleanup/tasks/cleanup_vpc2.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1284e6369a45c85f50eb9267063e4f9bba78064dd1abb497a660e54eb9ad1e9a", + "chksum_sha256": "e004778b3bb4abcfbc4037b7c94d14df1fe5f8b72611547c88b226294a00c28c", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/tasks/main.yml", + "name": "tests/integration/targets/cleanup/tasks/cleanup_snapshot.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b3a529e7fe7a88bd74d28e0d1a59444ff919861c898ce936304aa3cf905226", + "chksum_sha256": "c4b80c0623be8fc9b3715e96c370274a9544a722c081f2cd176964e403eb70e3", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/cleanup/tasks/cleanup_ssh_key.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "26d0dc382638376f115608d46bba80b2dd36ec96d9d290115c931051532d3f76", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/defaults/main.yml", + "name": "tests/integration/targets/cleanup/tasks/cleanup_instance.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "10b22387a8147bd98ea199fa7e8866837cb3742dd173a2bb2f1c4bfefb326741", + "chksum_sha256": "ac852429779c61e3db9dcb59dbf066ee2c5e169c54665da6a679c4b60397d2fd", "format": 1 }, { - "name": "tests/integration/targets/firewall_group_info/aliases", + "name": "tests/integration/targets/cleanup/tasks/cleanup_startup_script.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "d3f428f0cdeb1bf14cac364c19580a61a845672a552d293c96b23e8f860764f7", "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/cleanup/tasks/cleanup_all.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1b38a4d3f009a2ea2f95e575e4164012bae9e741221b5cb947f49910752980ed", "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/meta", + "name": "tests/integration/targets/cleanup/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/meta/main.yml", + "name": "tests/integration/targets/cleanup/meta/main.yml", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/tasks", + "name": "tests/integration/targets/cleanup/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/tasks/tests.yml", + "name": "tests/integration/targets/cleanup/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2c3ab8f42c86c9cc15d661adfc440632272d45408ce3bae07746b2756df93d6c", + "chksum_sha256": "b9f3ec8b4e4bf39dc1301f7187db3d08097bedf77f3364c79f2044ffd5db9d12", "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/tasks/main.yml", + "name": "tests/integration/targets/user", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/user/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "87dc91ac04c12df5f20f7535d800a42a2e1336b2310b9371c2a59af44f078ce8", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/defaults", + "name": "tests/integration/targets/user/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/defaults/main.yml", + "name": "tests/integration/targets/user/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "51c5fca4c8d9360a6379827ab054a14a88137dbf75709539bf2deada8421a92f", + "chksum_sha256": "c759330d083de4c1388c2a495db6e58cb2e8de6ff80d3c54ee1982e020d4cb1a", "format": 1 }, { - "name": "tests/integration/targets/dns_domain_info/aliases", + "name": "tests/integration/targets/user/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "5caa8e411c0d84429e587e397e283e5c989c4ac2ef39965c255fbb5d18e1b3fa", "format": 1 }, { - "name": "tests/integration/targets/reserved_ip", + "name": "tests/integration/targets/user/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/meta", + "name": "tests/integration/targets/user/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "format": 1 + }, + { + "name": "tests/integration/targets/user/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/meta/main.yml", + "name": "tests/integration/targets/user/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "a554c895ee456e6b7a52b47944b6dde91718e705feae1b17240f11e709d65836", "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/tasks", + "name": "tests/integration/targets/os_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/tasks/tests.yml", + "name": "tests/integration/targets/os_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6a9fe617e2d8003cbe4538d2c1f45f27c75001c7687d17e511e3fe15186b94cf", + "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/tasks/main.yml", + "name": "tests/integration/targets/os_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/os_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ca173941bf646f76a6f8336f10b09a629e352bb355a51f62fb5c1440c55bb204", + "chksum_sha256": "ab3741f185714f47703a62373e1c60d4555a7cb0604b018ab681cab0bd63568a", "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/defaults", + "name": "tests/integration/targets/instance_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/defaults/main.yml", + "name": "tests/integration/targets/instance_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e6c4fed7783e0ab2811bd7ca6dcbf1708485d91fca4ace1397150e79159bd327", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/reserved_ip/aliases", + "name": "tests/integration/targets/instance_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/instance_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "chksum_sha256": "a2c21f33974001d7c039a003393e9f0a546723be4349c50851c639aba0f77117", "format": 1 }, { - "name": "tests/integration/targets/vpc_info", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/instance_info/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "158f45cabb1bb2f67511f1885c51b65872642bbcaa2915b8605d1f763ce1f832", "format": 1 }, { - "name": "tests/integration/targets/vpc_info/meta", + "name": "tests/integration/targets/instance_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/vpc_info/meta/main.yml", + "name": "tests/integration/targets/instance_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/vpc_info/tasks", + "name": "tests/integration/targets/instance_info/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/vpc_info/tasks/tests.yml", + "name": "tests/integration/targets/instance_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7c2a325b079272307d33edbeaa4492a3facbc9c31bb071f32d9fc7bde9ddd567", + "chksum_sha256": "3a42de11dbbb07c09b93bfbb2d99d641f66dacb9aa96752234cb55db517f9e89", "format": 1 }, { - "name": "tests/integration/targets/vpc_info/tasks/main.yml", + "name": "tests/integration/targets/block_storage", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/block_storage/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "72e3197710fa41991bd5beaeb212d73e3833ee807ae8d30c9d83fcf775180101", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/vpc_info/defaults", + "name": "tests/integration/targets/block_storage/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/vpc_info/defaults/main.yml", + "name": "tests/integration/targets/block_storage/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6d0f6b5b87f1f2f2d734750fa026610f0ecccbca7d6c7ccedf1d394daa2c0787", + "chksum_sha256": "6e9e3942703ae1ca3cfa4a8a3017fc54c0f627edc41fbcf143ea71e4c6782b72", "format": 1 }, { - "name": "tests/integration/targets/vpc_info/aliases", + "name": "tests/integration/targets/block_storage/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "52660389f63f9f8b0b0faa24bdbbf8f28ce264f8fceb31a44e4bd0aca32a904d", "format": 1 }, { - "name": "tests/integration/targets/firewall_group", + "name": "tests/integration/targets/block_storage/tasks/tests_attach_to_server.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "de45063f8ce9cd2b9a7554cdcf7f1c9596f50cd1376ef69f3bd042481b321c9a", + "format": 1 + }, + { + "name": "tests/integration/targets/block_storage/tasks/failures.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "70a2828cfc6a42aea15ca265c29c3b7c0489427f1e009ebc3e8668ce5dd505f1", + "format": 1 + }, + { + "name": "tests/integration/targets/block_storage/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/firewall_group/meta", + "name": "tests/integration/targets/block_storage/defaults/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0015e74d8ad929993ebf0840e53120cf208ae9302ddbcb4c03bef85428cd8052", + "format": 1 + }, + { + "name": "tests/integration/targets/user_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/firewall_group/meta/main.yml", + "name": "tests/integration/targets/user_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/firewall_group/tasks", + "name": "tests/integration/targets/user_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/firewall_group/tasks/tests.yml", + "name": "tests/integration/targets/user_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6f163960098273136e9b6baf9c853e6178c8c34329d584e0b33e41250cd19483", + "chksum_sha256": "e48cbcad848aa1212a02ed6db988f09267d32b6195eed356882eed9f2e4dd39a", "format": 1 }, { - "name": "tests/integration/targets/firewall_group/tasks/main.yml", + "name": "tests/integration/targets/user_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b3a529e7fe7a88bd74d28e0d1a59444ff919861c898ce936304aa3cf905226", + "chksum_sha256": "5caa8e411c0d84429e587e397e283e5c989c4ac2ef39965c255fbb5d18e1b3fa", "format": 1 }, { - "name": "tests/integration/targets/firewall_group/defaults", + "name": "tests/integration/targets/user_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/firewall_group/defaults/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ce7cb163662ec14873afee9b83c34874bd0eaf496890d7b7b35d488bf094461b", - "format": 1 - }, - { - "name": "tests/integration/targets/firewall_group/aliases", + "name": "tests/integration/targets/user_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/ssh_key", + "name": "tests/integration/targets/user_info/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/ssh_key/meta", + "name": "tests/integration/targets/user_info/defaults/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "e9a72a5ae88e71690565abf81fe1845976e98e4b60c6025f0679921da414ceac", + "format": 1 + }, + { + "name": "tests/integration/targets/region_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/ssh_key/meta/main.yml", + "name": "tests/integration/targets/region_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", "format": 1 }, { - "name": "tests/integration/targets/ssh_key/tasks", + "name": "tests/integration/targets/region_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/ssh_key/tasks/tests.yml", + "name": "tests/integration/targets/region_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8352dbed6ddb1ceecbc7f46734bfe3db7d6dda7049f6ca13601847227e524fb0", + "chksum_sha256": "1e9238ef3b628e9be3f45f1907eb44d53a34f973b548064abff1f36d525a8bab", "format": 1 }, { - "name": "tests/integration/targets/ssh_key/tasks/main.yml", + "name": "tests/integration/targets/vpc2", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/vpc2/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "44ed0d376e3a684d03aca3056db7bd74b63451f5334639ae37970b4b468e900d", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/ssh_key/defaults", + "name": "tests/integration/targets/vpc2/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/ssh_key/defaults/main.yml", + "name": "tests/integration/targets/vpc2/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2db62c7b2e06217cc6a92ca02e997ef2a276460c45d37953bba64b9f2ec3078e", + "chksum_sha256": "d4840fa2b094d50ef00423d5572b8f373d3a1009f1a8f347f1c3c253ef6bd070", "format": 1 }, { - "name": "tests/integration/targets/ssh_key/aliases", + "name": "tests/integration/targets/vpc2/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "ab1cd92c34ca65a13c41096db34aeb9ecae00bb54d5e1cde618e7ca290a3ee8b", "format": 1 }, { - "name": "tests/integration/targets/block_storage_info", + "name": "tests/integration/targets/vpc2/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/block_storage_info/tasks", + "name": "tests/integration/targets/vpc2/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "format": 1 + }, + { + "name": "tests/integration/targets/vpc2/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/block_storage_info/tasks/tests.yml", + "name": "tests/integration/targets/vpc2/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4725bc0f78af0b6fafd93ae473fdace0c3baa28527e7b65e4e63c7d5bf5790ee", + "chksum_sha256": "0854a3e8751cc27484b26a8042c2aa753d83bc970654451cfbb129194b05e82f", "format": 1 }, { - "name": "tests/integration/targets/block_storage_info/tasks/main.yml", + "name": "tests/integration/targets/startup_script", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/startup_script/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "74b565de2124e4a53853a1dc2d79d3e765bd00578f25260427c52b082a0aebba", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/block_storage_info/defaults", + "name": "tests/integration/targets/startup_script/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/block_storage_info/defaults/main.yml", + "name": "tests/integration/targets/startup_script/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7690ab5d3be0f969367e46923242bed255c52807b27c7ca97c492002e61e4056", + "chksum_sha256": "c1e7a5d54828ea8746f35c153e693af2519b51ef74ef01a016cd7ef51b578f21", "format": 1 }, { - "name": "tests/integration/targets/block_storage_info/aliases", + "name": "tests/integration/targets/startup_script/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", - "format": 1 - }, - { - "name": "tests/integration/targets/dns_record", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "chksum_sha256": "d5738ca7eeca0a524a80197d73b1d677913903103d5bea0663c8fdc66eb6c09c", "format": 1 }, { - "name": "tests/integration/targets/dns_record/meta", + "name": "tests/integration/targets/startup_script/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_record/meta/main.yml", + "name": "tests/integration/targets/startup_script/meta/main.yml", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks", + "name": "tests/integration/targets/startup_script/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks/update_record.yml", + "name": "tests/integration/targets/startup_script/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "69f1046400a3db0688ab921d4b1b707bf7fdf26ab133654d7e372627078b03c5", + "chksum_sha256": "8825f1598fe036be8c0f7259ba05ad408acb9a9bf106da582a1e0f58040e1c40", "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks/record.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ac2ce46179ea10858a1a055df4fa27652e122ca7f0cc19b7494a3028b6894af9", + "name": "tests/integration/targets/reserved_ip", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks/tests.yml", + "name": "tests/integration/targets/reserved_ip/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b17ff013393d7b1d288a2d6fc4f2c4befddd5684e41544862fc11f4db00310c5", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks/test_fail_multiple.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "efc91209a8b8d5f616816c27ee3542c437695ad7902df49d110786a75381de9a", + "name": "tests/integration/targets/reserved_ip/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks/create_record.yml", + "name": "tests/integration/targets/reserved_ip/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "45ab07fd1caf14b7427743b72e74713dcc13374067223908edfa83415c6d187e", + "chksum_sha256": "ac3fc3665287a74b94fdbfc1a34f8fc64069c1c08d9f7121f9e6282ffefa978e", "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks/remove_record.yml", + "name": "tests/integration/targets/reserved_ip/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "40ab1dc2190120e706d7dd5a51dc8dd3ce8bc7c3f347f24fe985cc77ac310ff6", + "chksum_sha256": "ca173941bf646f76a6f8336f10b09a629e352bb355a51f62fb5c1440c55bb204", "format": 1 }, { - "name": "tests/integration/targets/dns_record/tasks/main.yml", + "name": "tests/integration/targets/reserved_ip/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/reserved_ip/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2461155c079932287a72670c97c3251a2821e8ab580d9ca305fa456b02cdff13", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/dns_record/defaults", + "name": "tests/integration/targets/reserved_ip/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_record/defaults/main.yml", + "name": "tests/integration/targets/reserved_ip/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1b5619716102d8ec920db97a6988787c780ee277398afe38af1edc7b0af68a6a", + "chksum_sha256": "41ce444b326fc7a174514d6b0b478290cb0cb35ff665dbf8cc1c96426f1bcf53", "format": 1 }, { - "name": "tests/integration/targets/dns_record/aliases", + "name": "tests/integration/targets/plan_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/plan_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", "format": 1 }, { - "name": "tests/integration/targets/user_info", + "name": "tests/integration/targets/plan_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user_info/meta", + "name": "tests/integration/targets/plan_info/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "501533396ed8009dc79e310c95d764591704b6cd32091ee08eebd005f8a4b87b", + "format": 1 + }, + { + "name": "tests/integration/targets/ssh_key_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user_info/meta/main.yml", + "name": "tests/integration/targets/ssh_key_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/user_info/tasks", + "name": "tests/integration/targets/ssh_key_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user_info/tasks/tests.yml", + "name": "tests/integration/targets/ssh_key_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e48cbcad848aa1212a02ed6db988f09267d32b6195eed356882eed9f2e4dd39a", + "chksum_sha256": "8a08daf014910331e76b5386c45206e2bb3448692f153dd0e28afba215660fc2", "format": 1 }, { - "name": "tests/integration/targets/user_info/tasks/main.yml", + "name": "tests/integration/targets/ssh_key_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5caa8e411c0d84429e587e397e283e5c989c4ac2ef39965c255fbb5d18e1b3fa", + "chksum_sha256": "44ed0d376e3a684d03aca3056db7bd74b63451f5334639ae37970b4b468e900d", "format": 1 }, { - "name": "tests/integration/targets/user_info/defaults", + "name": "tests/integration/targets/ssh_key_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user_info/defaults/main.yml", + "name": "tests/integration/targets/ssh_key_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e9a72a5ae88e71690565abf81fe1845976e98e4b60c6025f0679921da414ceac", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/user_info/aliases", + "name": "tests/integration/targets/ssh_key_info/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/ssh_key_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "f09f3081e9a29164ed5d17114a52e97f2b8190d31c8c99cd23601d9f53c50e01", "format": 1 }, { - "name": "tests/integration/targets/plan_metal_info", + "name": "tests/integration/targets/firewall_group_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/plan_metal_info/tasks", + "name": "tests/integration/targets/firewall_group_info/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_group_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/plan_metal_info/tasks/main.yml", + "name": "tests/integration/targets/firewall_group_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "30fa2cd68fb86755e1ba3ba2ef676feea82c54901bfaa77897364e2877d2d8af", + "chksum_sha256": "dae200ffc061db7868ab082d3d5d6c1cc17c81d365d81a95eda5e6854bb08da3", "format": 1 }, { - "name": "tests/integration/targets/plan_metal_info/aliases", + "name": "tests/integration/targets/firewall_group_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", + "chksum_sha256": "e3b3a529e7fe7a88bd74d28e0d1a59444ff919861c898ce936304aa3cf905226", "format": 1 }, { - "name": "tests/integration/targets/account_info", + "name": "tests/integration/targets/firewall_group_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/account_info/tasks", + "name": "tests/integration/targets/firewall_group_info/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_group_info/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/account_info/tasks/main.yml", + "name": "tests/integration/targets/firewall_group_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2b49a94c64afb9d4d95f3cacf9ea2667390dd014585eb65ff4d15e026e346e2e", + "chksum_sha256": "10b22387a8147bd98ea199fa7e8866837cb3742dd173a2bb2f1c4bfefb326741", "format": 1 }, { - "name": "tests/integration/targets/account_info/aliases", + "name": "tests/integration/targets/snapshot_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/snapshot_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a9f61a9487700a83508395d74ce06374baecfcaf4306b30f008d8b726c626a69", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/os_info", + "name": "tests/integration/targets/snapshot_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/os_info/tasks", + "name": "tests/integration/targets/snapshot_info/tasks/tests.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a175aee81120e75678aa6477456460b03200a4ef79db94e0828fe737bfa65afa", + "format": 1 + }, + { + "name": "tests/integration/targets/snapshot_info/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "00c1b19510489064de57f159c3cfae2ed964ad5064e770cff0849b5243cc417e", + "format": 1 + }, + { + "name": "tests/integration/targets/snapshot_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/os_info/tasks/main.yml", + "name": "tests/integration/targets/snapshot_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ab3741f185714f47703a62373e1c60d4555a7cb0604b018ab681cab0bd63568a", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/os_info/aliases", + "name": "tests/integration/targets/snapshot_info/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/snapshot_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", + "chksum_sha256": "f7167834ffb188e37b48bf50ed7112fa6b3854c473f9a27d925f0ff059aa2686", "format": 1 }, { - "name": "tests/integration/targets/block_storage", + "name": "tests/integration/targets/dns_domain", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/block_storage/tasks", + "name": "tests/integration/targets/dns_domain/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "format": 1 + }, + { + "name": "tests/integration/targets/dns_domain/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/block_storage/tasks/tests.yml", + "name": "tests/integration/targets/dns_domain/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6e9e3942703ae1ca3cfa4a8a3017fc54c0f627edc41fbcf143ea71e4c6782b72", + "chksum_sha256": "40df39c4e807905c239b84032700f2f8afef295404a81d33f456bb8d7d2de2db", "format": 1 }, { - "name": "tests/integration/targets/block_storage/tasks/failures.yml", + "name": "tests/integration/targets/dns_domain/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "70a2828cfc6a42aea15ca265c29c3b7c0489427f1e009ebc3e8668ce5dd505f1", + "chksum_sha256": "2461155c079932287a72670c97c3251a2821e8ab580d9ca305fa456b02cdff13", "format": 1 }, { - "name": "tests/integration/targets/block_storage/tasks/main.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "52660389f63f9f8b0b0faa24bdbbf8f28ce264f8fceb31a44e4bd0aca32a904d", + "name": "tests/integration/targets/dns_domain/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/block_storage/tasks/tests_attach_to_server.yml", + "name": "tests/integration/targets/dns_domain/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "de45063f8ce9cd2b9a7554cdcf7f1c9596f50cd1376ef69f3bd042481b321c9a", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/block_storage/defaults", + "name": "tests/integration/targets/dns_domain/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/block_storage/defaults/main.yml", + "name": "tests/integration/targets/dns_domain/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0015e74d8ad929993ebf0840e53120cf208ae9302ddbcb4c03bef85428cd8052", + "chksum_sha256": "897005cc5012d5148cb547b674f0cdd1883702dd5bf7e06ce57e0df4937eee31", "format": 1 }, { - "name": "tests/integration/targets/block_storage/aliases", + "name": "tests/integration/targets/ssh_key", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/ssh_key/aliases", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/user", + "name": "tests/integration/targets/ssh_key/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user/meta", + "name": "tests/integration/targets/ssh_key/tasks/tests.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8352dbed6ddb1ceecbc7f46734bfe3db7d6dda7049f6ca13601847227e524fb0", + "format": 1 + }, + { + "name": "tests/integration/targets/ssh_key/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "44ed0d376e3a684d03aca3056db7bd74b63451f5334639ae37970b4b468e900d", + "format": 1 + }, + { + "name": "tests/integration/targets/ssh_key/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user/meta/main.yml", + "name": "tests/integration/targets/ssh_key/meta/main.yml", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/user/tasks", + "name": "tests/integration/targets/ssh_key/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user/tasks/tests.yml", + "name": "tests/integration/targets/ssh_key/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c759330d083de4c1388c2a495db6e58cb2e8de6ff80d3c54ee1982e020d4cb1a", + "chksum_sha256": "2db62c7b2e06217cc6a92ca02e997ef2a276460c45d37953bba64b9f2ec3078e", "format": 1 }, { - "name": "tests/integration/targets/user/tasks/main.yml", + "name": "tests/integration/targets/vpc2_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/vpc2_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5caa8e411c0d84429e587e397e283e5c989c4ac2ef39965c255fbb5d18e1b3fa", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/user/defaults", + "name": "tests/integration/targets/vpc2_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/user/defaults/main.yml", + "name": "tests/integration/targets/vpc2_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a554c895ee456e6b7a52b47944b6dde91718e705feae1b17240f11e709d65836", + "chksum_sha256": "b3b6826f2bf93e2a16351af89d4b9f8f853e1306da6d750c43161157ba723e3a", "format": 1 }, { - "name": "tests/integration/targets/user/aliases", + "name": "tests/integration/targets/vpc2_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "ab1cd92c34ca65a13c41096db34aeb9ecae00bb54d5e1cde618e7ca290a3ee8b", "format": 1 }, { - "name": "tests/integration/targets/dns_domain", + "name": "tests/integration/targets/vpc2_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_domain/meta", + "name": "tests/integration/targets/vpc2_info/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "format": 1 + }, + { + "name": "tests/integration/targets/vpc2_info/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_domain/meta/main.yml", + "name": "tests/integration/targets/vpc2_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "c222144728517c257e2605781d462d26d3e5aafcb631644dd48e51f3447562b1", "format": 1 }, { - "name": "tests/integration/targets/dns_domain/tasks", + "name": "tests/integration/targets/dns_record", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/dns_domain/tasks/tests.yml", + "name": "tests/integration/targets/dns_record/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "40df39c4e807905c239b84032700f2f8afef295404a81d33f456bb8d7d2de2db", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/dns_domain/tasks/main.yml", + "name": "tests/integration/targets/dns_record/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/dns_record/tasks/tests.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b17ff013393d7b1d288a2d6fc4f2c4befddd5684e41544862fc11f4db00310c5", + "format": 1 + }, + { + "name": "tests/integration/targets/dns_record/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "2461155c079932287a72670c97c3251a2821e8ab580d9ca305fa456b02cdff13", "format": 1 }, { - "name": "tests/integration/targets/dns_domain/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/dns_record/tasks/create_record.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d4337dc679ec9e0caacc52b9ad92f5102f2ec94b67996ff87f0689a2af2795b2", "format": 1 }, { - "name": "tests/integration/targets/dns_domain/defaults/main.yml", + "name": "tests/integration/targets/dns_record/tasks/remove_record.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "897005cc5012d5148cb547b674f0cdd1883702dd5bf7e06ce57e0df4937eee31", + "chksum_sha256": "8ad3e5a5d87d7dd4872f0a2cb01d7ae045494079415e07deab5f5e66a64985df", "format": 1 }, { - "name": "tests/integration/targets/dns_domain/aliases", + "name": "tests/integration/targets/dns_record/tasks/test_fail_multiple.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "efc91209a8b8d5f616816c27ee3542c437695ad7902df49d110786a75381de9a", "format": 1 }, { - "name": "tests/integration/targets/snapshot_info", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/dns_record/tasks/record.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "ac2ce46179ea10858a1a055df4fa27652e122ca7f0cc19b7494a3028b6894af9", "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/meta", + "name": "tests/integration/targets/dns_record/tasks/update_record.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c32ca3ea4f65cebd89f11efd6f8abdaf29c1e8b5fb3ab92536ed37a46f04296e", + "format": 1 + }, + { + "name": "tests/integration/targets/dns_record/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/meta/main.yml", + "name": "tests/integration/targets/dns_record/meta/main.yml", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/tasks", + "name": "tests/integration/targets/dns_record/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/tasks/tests.yml", + "name": "tests/integration/targets/dns_record/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7e148c20a4f98ae35e0d5f4ae918dd4ace006c3522d2f4a28d60e502c1742212", + "chksum_sha256": "2ad76431a193d7ad5a432520302e3a36b8d5bea46f16d60a034f094b061c0378", "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/tasks/main.yml", + "name": "tests/integration/targets/firewall_rule", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_rule/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "00c1b19510489064de57f159c3cfae2ed964ad5064e770cff0849b5243cc417e", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/defaults", + "name": "tests/integration/targets/firewall_rule/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/defaults/main.yml", + "name": "tests/integration/targets/firewall_rule/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f7167834ffb188e37b48bf50ed7112fa6b3854c473f9a27d925f0ff059aa2686", + "chksum_sha256": "3414e6f7e40e8b97ec6fa43d1c10284fb9e2dc05c83fba44fb7eda26067efb87", "format": 1 }, { - "name": "tests/integration/targets/snapshot_info/aliases", + "name": "tests/integration/targets/firewall_rule/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "754db3bbf45a9b97110c0523b140919d4540ebf1ab2d0191616f77955dde7ece", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/firewall_rule/tasks/rule_absent.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "37f1c494e66dd75bd0ad6faab6de98e4be343d282d2f5c9ae3f1210ac7fe720e", + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_rule/tasks/rule_present.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a210bb759c2823ab8feadb105f9a286b1cb21d3f6bcb2837857d3e9de02758ad", "format": 1 }, { @@ -1534,178 +1765,220 @@ "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/tasks", + "name": "tests/integration/targets/firewall_rule/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/tasks/tests.yml", + "name": "tests/integration/targets/firewall_rule/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3414e6f7e40e8b97ec6fa43d1c10284fb9e2dc05c83fba44fb7eda26067efb87", + "chksum_sha256": "04a36ef586390a4ccd668b3b583ddca434c9a34e971f55334d4a06e6a4c2972d", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/tasks/rule_absent.yml", + "name": "tests/integration/targets/snapshot", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/snapshot/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8406c5b815036b6bf808510a93d794bdf77d7ca493ae4af74b6d02d60ea873bf", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/tasks/main.yml", + "name": "tests/integration/targets/snapshot/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/snapshot/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "754db3bbf45a9b97110c0523b140919d4540ebf1ab2d0191616f77955dde7ece", + "chksum_sha256": "0284c806f32966951ab87baa051d3be2fe9a8839e37c55c760c695730db110cd", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/tasks/rule_present.yml", + "name": "tests/integration/targets/snapshot/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "52183ff79e735f2c90e8bf47e8bd2218b3fe12e0beb4755f1c328fc2addd062a", + "chksum_sha256": "7ce50b2181ffe6e2121e1692900fdb107636f90e048c195327fcc13737816a31", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/snapshot/tasks/absent.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "63b358651e57593af74d74bf7ab7e7812a77443ba1628f321830199245f55760", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/defaults/main.yml", + "name": "tests/integration/targets/snapshot/tasks/failures.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "99a6c0a603a706c1beeb8e0305729328dcee927b8dccabf55d2ca241752069a8", + "chksum_sha256": "bb2a0533a657d8ccdc7d750a4e6607648123016a127b9a8337c92bcfd4faf7dc", "format": 1 }, { - "name": "tests/integration/targets/firewall_rule/aliases", + "name": "tests/integration/targets/snapshot/tasks/present.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "30c0334aed12e3f1d1d319de71c91e8faa7e90c0ba23ea8af12e7f66eb1dfb9f", "format": 1 }, { - "name": "tests/integration/targets/startup_script", + "name": "tests/integration/targets/snapshot/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script/meta", + "name": "tests/integration/targets/snapshot/meta/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "format": 1 + }, + { + "name": "tests/integration/targets/snapshot/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script/meta/main.yml", + "name": "tests/integration/targets/snapshot/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "6a784801be127bde96b005e775b8981f116875928902348ec6c9384de1b5097b", "format": 1 }, { - "name": "tests/integration/targets/startup_script/tasks", + "name": "tests/integration/targets/bare_metal", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/startup_script/tasks/tests.yml", + "name": "tests/integration/targets/bare_metal/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c1e7a5d54828ea8746f35c153e693af2519b51ef74ef01a016cd7ef51b578f21", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/startup_script/tasks/main.yml", + "name": "tests/integration/targets/bare_metal/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/bare_metal/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d5738ca7eeca0a524a80197d73b1d677913903103d5bea0663c8fdc66eb6c09c", + "chksum_sha256": "58cb4e3cf4e146c1eb86b2f10253646a22689af81dec9278dc93352fc6272a80", "format": 1 }, { - "name": "tests/integration/targets/startup_script/defaults", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/bare_metal/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d30996ac75b7862f1073cacc39004f74e750fae54df70f525a802e68a4066ea6", "format": 1 }, { - "name": "tests/integration/targets/startup_script/defaults/main.yml", + "name": "tests/integration/targets/bare_metal/tasks/absent.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8825f1598fe036be8c0f7259ba05ad408acb9a9bf106da582a1e0f58040e1c40", + "chksum_sha256": "f045dfc5de15b9747667277882412bd9da7815995060250a08eb63164586884d", "format": 1 }, { - "name": "tests/integration/targets/startup_script/aliases", + "name": "tests/integration/targets/bare_metal/tasks/failures.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "chksum_sha256": "142e80f17df5581c5482614f83a12bb3d36cd32c6d23a40ba54257bd14c198e5", "format": 1 }, { - "name": "tests/integration/targets/vpc", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/bare_metal/tasks/present.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d2dd0ff9d8f5d37c43e8c8375cbda630bfdfab96dbe851fefdf38a843b9758df", "format": 1 }, { - "name": "tests/integration/targets/vpc/meta", + "name": "tests/integration/targets/bare_metal/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/vpc/meta/main.yml", + "name": "tests/integration/targets/bare_metal/meta/main.yml", "ftype": "file", "chksum_type": "sha256", "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/vpc/tasks", + "name": "tests/integration/targets/bare_metal/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/vpc/tasks/tests.yml", + "name": "tests/integration/targets/bare_metal/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7684abfe6f192643bfff3c6694ee6780e809801f899001a32b13c2757c374399", + "chksum_sha256": "14136ead44466e15ba46bd96cc8e1e838ba69f7201ab333e18fd6cb3f2a77071", "format": 1 }, { - "name": "tests/integration/targets/vpc/tasks/main.yml", + "name": "tests/integration/targets/plan_metal_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/plan_metal_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "72e3197710fa41991bd5beaeb212d73e3833ee807ae8d30c9d83fcf775180101", + "chksum_sha256": "dc2ce6b1319ce6a5d14015a0ce0e61945a5fcb9f4b1cc1e3f2705ba7a5d4b466", "format": 1 }, { - "name": "tests/integration/targets/vpc/defaults", + "name": "tests/integration/targets/plan_metal_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/vpc/defaults/main.yml", + "name": "tests/integration/targets/plan_metal_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6d0f6b5b87f1f2f2d734750fa026610f0ecccbca7d6c7ccedf1d394daa2c0787", + "chksum_sha256": "30fa2cd68fb86755e1ba3ba2ef676feea82c54901bfaa77897364e2877d2d8af", + "format": 1 + }, + { + "name": "tests/integration/targets/vpc", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { @@ -1716,584 +1989,675 @@ "format": 1 }, { - "name": "tests/integration/targets/cleanup", + "name": "tests/integration/targets/vpc/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/cleanup/meta", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/vpc/tasks/tests.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7069e3b5efc6ccdad26b5ef833d9dc2c361802f879cbfc1255ba7087d7659a1b", "format": 1 }, { - "name": "tests/integration/targets/cleanup/meta/main.yml", + "name": "tests/integration/targets/vpc/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", + "chksum_sha256": "72e3197710fa41991bd5beaeb212d73e3833ee807ae8d30c9d83fcf775180101", "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks", + "name": "tests/integration/targets/vpc/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_snapshot.yml", + "name": "tests/integration/targets/vpc/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c4b80c0623be8fc9b3715e96c370274a9544a722c081f2cd176964e403eb70e3", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_user.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "d045ec23fee0ba28312d3a62b2c177e40e2991bafd1363f4862585f2cbdcfb5b", + "name": "tests/integration/targets/vpc/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_reserved_ip.yml", + "name": "tests/integration/targets/vpc/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7f55ef9910de1c95c3f152822b02b1dcc77bc347c559f4d0ea9850ed67ed0466", + "chksum_sha256": "0d8a5b2015a66fe090ea2ae5d0e5e654ccbcef2676f34978022ef05b2bb1ca92", "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_block_storage.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f1b0b7013c9ed7e03d27d7f213415654e0e57b204526029921416e1722dd8c82", + "name": "tests/integration/targets/vpc_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_vpc.yml", + "name": "tests/integration/targets/vpc_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8cb8e6f9ea326d780e4565a67a967911fdf9ca09a039b904b600f4674955eb59", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_instance.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ac852429779c61e3db9dcb59dbf066ee2c5e169c54665da6a679c4b60397d2fd", + "name": "tests/integration/targets/vpc_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_network.yml", + "name": "tests/integration/targets/vpc_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1c6f111d899836a496e790770077aa92db40ceca90633a5d5b72200a388dce2e", + "chksum_sha256": "c91ecbfd0f3d0c77fc3e66dcfd9ade5b549f078908c75cd50b91356ef2dfab9d", "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_firewall_group.yml", + "name": "tests/integration/targets/vpc_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c0c8fb99ae5f40480ba7b0da24f35632388c3865108d7d5148e87dace9adc816", + "chksum_sha256": "72e3197710fa41991bd5beaeb212d73e3833ee807ae8d30c9d83fcf775180101", "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_startup_script.yml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "d3f428f0cdeb1bf14cac364c19580a61a845672a552d293c96b23e8f860764f7", + "name": "tests/integration/targets/vpc_info/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_dns_domain.yml", + "name": "tests/integration/targets/vpc_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0f70151df2fe2eb1b434fccf8e2d8eba7e13db7cb110520c1e69784499bdc2a8", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/integration/targets/cleanup/tasks/cleanup_ssh_key.yml", + "name": "tests/integration/targets/vpc_info/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/vpc_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "26d0dc382638376f115608d46bba80b2dd36ec96d9d290115c931051532d3f76", + "chksum_sha256": "6d0f6b5b87f1f2f2d734750fa026610f0ecccbca7d6c7ccedf1d394daa2c0787", "format": 1 }, { - "name": "tests/integration/targets/cleanup/defaults", + "name": "tests/integration/targets/_reset_cloud", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/integration/targets/cleanup/defaults/main.yml", + "name": "tests/integration/targets/_reset_cloud/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b9f3ec8b4e4bf39dc1301f7187db3d08097bedf77f3364c79f2044ffd5db9d12", + "chksum_sha256": "ae3eb2d8226aaf0068fe84475bc84c6ae7b8c66e0784a49375aed53840917528", "format": 1 }, { - "name": "tests/integration/targets/cleanup/aliases", + "name": "tests/integration/targets/_reset_cloud/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/_reset_cloud/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e084a3683ef795d1cdbf5e9b253f2ca1f783ae0d0d6e47e419acbbc4fc80bbfa", + "chksum_sha256": "cbd17e8ba755f9e61076a0f5882c20bd54f1b13486cd146d9b8e1074cad50073", "format": 1 }, { - "name": "tests/unit", + "name": "tests/integration/targets/dns_domain_info", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/unit/plugins", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/integration/targets/dns_domain_info/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "tests/unit/plugins/inventory", + "name": "tests/integration/targets/dns_domain_info/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/unit/plugins/inventory/test_vultr.py", + "name": "tests/integration/targets/dns_domain_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9b938dddb400485de14daa3ea2d59d0ec96e5f8e129806e09bccf75a7af4db4d", + "chksum_sha256": "f83fab1071ce3750d26dd1c8daaee56a1997a16454b672c21f98aa2b8d9713fe", "format": 1 }, { - "name": "tests/unit/plugins/inventory/fixtures", + "name": "tests/integration/targets/dns_domain_info/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "87dc91ac04c12df5f20f7535d800a42a2e1336b2310b9371c2a59af44f078ce8", + "format": 1 + }, + { + "name": "tests/integration/targets/dns_domain_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "tests/unit/plugins/inventory/fixtures/empty_vultr_inventory.json", + "name": "tests/integration/targets/dns_domain_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "64191612bc4b0099f55554c92444f8f71ac651b38875433e4a2a351ebb86fc1a", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "tests/unit/plugins/inventory/fixtures/vultr_inventory.json", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "7966a533c5dbbe1df5eddac1ec56df52ec808b6a39303a51467dfcb74c329cc0", + "name": "tests/integration/targets/dns_domain_info/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/unit/plugins/inventory/fixtures/vultr_inventory_page1.json", + "name": "tests/integration/targets/dns_domain_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "004b664e8ddebb2714c97f7ef2c95be8d7b2e770089eb49b563fb321e4a79823", + "chksum_sha256": "51c5fca4c8d9360a6379827ab054a14a88137dbf75709539bf2deada8421a92f", "format": 1 }, { - "name": "tests/unit/plugins/inventory/fixtures/vultr_inventory_page2.json", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b1151ecdeb91d94258df245931619c94dfdbee87308e8f126cef86932ea54436", + "name": "tests/integration/targets/block_storage_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "tests/unit/plugins/inventory/fixtures/unauthorized_vultr_inventory.json", + "name": "tests/integration/targets/block_storage_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "505876bcb387732db0065e9ff092c3060c8436dbe15e7ec98846899cf81603f4", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "CHANGELOG.rst", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "05a68f8431655d8f086d2c5b8e93ef5b2a124ff2dfa5e8f44f647f404af16627", + "name": "tests/integration/targets/block_storage_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": ".yamllint", + "name": "tests/integration/targets/block_storage_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5845e18e9f23155f423207df9abac970aed687c638620bc2c9ee06706191054b", + "chksum_sha256": "50adb7b185f2cdb64f1763c859b4e5e2bd32579ba9120e7ca92c6d82fdfeaee4", "format": 1 }, { - "name": ".gitignore", + "name": "tests/integration/targets/block_storage_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1467ad38919911ec5759af24376728faf2361c0335d52fb8bea4853e7b698b48", + "chksum_sha256": "74b565de2124e4a53853a1dc2d79d3e765bd00578f25260427c52b082a0aebba", "format": 1 }, { - "name": "CONTRIBUTING.md", + "name": "tests/integration/targets/block_storage_info/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/block_storage_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d61725d614410e2ee0a900fb0f6b6d742ad8fb689ae27c4d6a3a7f89e82fc791", + "chksum_sha256": "7690ab5d3be0f969367e46923242bed255c52807b27c7ca97c492002e61e4056", "format": 1 }, { - "name": "plugins", + "name": "tests/integration/targets/instance", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules", + "name": "tests/integration/targets/instance/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", + "format": 1 + }, + { + "name": "tests/integration/targets/instance/tasks", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules/region_info.py", + "name": "tests/integration/targets/instance/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ee6e31f3192bbe6e0db69cd7efef79a3a3fee40763071aa5c674f5c6951d7bdb", + "chksum_sha256": "025d35e438e475b5cae504dcf1dcb8a425de2a5cbff0502018c99ad6780b2960", "format": 1 }, { - "name": "plugins/modules/startup_script.py", + "name": "tests/integration/targets/instance/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "14be407f3eb256735311fde075a3c983abb9b6932925d412e5782cec26c3e23f", + "chksum_sha256": "98d1c97130c60cd0b5b7594edbf892f99b2d6a5ae73fd24d71e4effdfd415de6", "format": 1 }, { - "name": "plugins/modules/user.py", + "name": "tests/integration/targets/instance/tasks/absent.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "38d3651f9b624fe512dae40c4ef24e4ccb0eae4ea9c394d260b851ff57dc8365", + "chksum_sha256": "2d33951d4d498963a2311fea64fdf4a1a50b39ea9712ed72b4955393fc1a90c4", "format": 1 }, { - "name": "plugins/modules/dns_domain_info.py", + "name": "tests/integration/targets/instance/tasks/reinstall.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f76e554deed6163146c291612e807058309f4553b8d5ff9798a0fabe27717307", + "chksum_sha256": "0cc5b6784d2d8030444d57d871f80b2f1a453132fccdeb002142eb027576ebbe", "format": 1 }, { - "name": "plugins/modules/os_info.py", + "name": "tests/integration/targets/instance/tasks/stop-start.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0143ad73c6b10692c6577730523b0159782bb6a678d3946dc920b3b758565155", + "chksum_sha256": "217770633862454ea3c34efe13e29e29a8fb5cd297807c8dd49065f3beec39c3", "format": 1 }, { - "name": "plugins/modules/account_info.py", + "name": "tests/integration/targets/instance/tasks/failures.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "234df324cb37004dff1e9d5847998f97304c9228e67815f05b5087ab5709e911", + "chksum_sha256": "5bec818fae85199334944642e17ef30a7a6b3c48e8e3705e8d7f3366993b2e0b", "format": 1 }, { - "name": "plugins/modules/block_storage_info.py", + "name": "tests/integration/targets/instance/tasks/present.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d2677e90317fc892df48133c755f1c9cf8e1281d610f43937abc54e79f78ee81", + "chksum_sha256": "975e38a525ca112c8f447899b09fe9e4b5ceebe602bf2c0f62225b64e8956bd4", "format": 1 }, { - "name": "plugins/modules/plan_info.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3648af6b8fd69f3bb66faf265767fd39a7afd5bebd5f88964db42dc6d0d8d392", + "name": "tests/integration/targets/instance/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules/firewall_rule.py", + "name": "tests/integration/targets/instance/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1b95d2b2c729517b79ce3e06d988defa8803b75060b736279eeeec8ae0d815e0", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "plugins/modules/snapshot_info.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "a60ecc36574d60168903ee239185d42e636c8d26356bb84d6c666d8ab7368e50", + "name": "tests/integration/targets/instance/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules/user_info.py", + "name": "tests/integration/targets/instance/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ae4e7899a1107f0d9a2dbfac410209528d687ceef6c9f587b3d78cdb974d8e7f", + "chksum_sha256": "559e5734fd1fe6c2402dd1d30c786b17182982d0e0492f86502963ee7bf3c737", "format": 1 }, { - "name": "plugins/modules/instance.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "c6c7aa932359fcc9711e838739cc1a4f22c628428f115801d8212cf9524dfc3f", + "name": "tests/integration/targets/object_storage", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules/plan_metal_info.py", + "name": "tests/integration/targets/object_storage/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "93bda0d2911f927951c30540a54a8da71a61a20c7f9cafc7368097d335c47aa5", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "plugins/modules/startup_script_info.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "23134fcb25c56ab61a08afe195100cd4f2eb5ef14b1a8ba6bfc7b82cdea57859", + "name": "tests/integration/targets/object_storage/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules/firewall_group.py", + "name": "tests/integration/targets/object_storage/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7e5482639e8b600dff912fc03f7b0baa24a3cfa70f807eeeeb6c1ebfcf354f94", + "chksum_sha256": "b59ee60ffbb614b7c66dfd76a0f6be02b21cd99b2c261ec25ab689fa8e7e68cd", "format": 1 }, { - "name": "plugins/modules/dns_record.py", + "name": "tests/integration/targets/object_storage/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4b29de118b42237350431b7bef3dbf92ff98bfe989183756aea92efb0b73589d", + "chksum_sha256": "c41f15bff7732e799b9337d7c29b746f96809b63e3472d1c6fa36bd0074eab0b", "format": 1 }, { - "name": "plugins/modules/instance_info.py", + "name": "tests/integration/targets/object_storage/tasks/failures.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c29fdb4fab431c06ec8eba206ce48df96c5d39c2bff0f9ca632133993bd78891", + "chksum_sha256": "7418967590921122fa856bbd82a918191bdca8f71db2a8d7870beeb6d68bcacf", "format": 1 }, { - "name": "plugins/modules/__init__.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "tests/integration/targets/object_storage/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules/block_storage.py", + "name": "tests/integration/targets/object_storage/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d2a98391d3d84671552b48b0fad61811f753420f09b5b94626e511b3c74cf93f", + "chksum_sha256": "499f573764e0b2e21e3165103f219e007b3c74ce084ba5a5af88a8faf3c36ff8", "format": 1 }, { - "name": "plugins/modules/vpc_info.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "903efd1d0f822de7aaaf659d968e13e9104d6af4c3667a782efd8bf056662829", + "name": "tests/integration/targets/firewall_rule_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "plugins/modules/dns_domain.py", + "name": "tests/integration/targets/firewall_rule_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "de781d3439aba96749c83b24b29c15e1f62ac807c8cc793e08ea374ece4c3c68", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "plugins/modules/firewall_rule_info.py", + "name": "tests/integration/targets/firewall_rule_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_rule_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "267c9f763168ce7b6c938e874b4048d6492add6766406d3a6cbc3d227ed14da3", + "chksum_sha256": "f2b150accd2fc9a13c9cb8d4923d0727daa884bad4e78c31b39ca451eb532f92", "format": 1 }, { - "name": "plugins/modules/vpc.py", + "name": "tests/integration/targets/firewall_rule_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9ea848792c5ac44d5d25f366dbab63916f6797c977238ede08a2b2e08f74933b", + "chksum_sha256": "e3b3a529e7fe7a88bd74d28e0d1a59444ff919861c898ce936304aa3cf905226", "format": 1 }, { - "name": "plugins/modules/ssh_key.py", + "name": "tests/integration/targets/firewall_rule_info/meta", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_rule_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5e1a8e741f196a6b080077b88aa14ec6595878108978ef230224592b161ca44b", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "plugins/modules/firewall_group_info.py", + "name": "tests/integration/targets/firewall_rule_info/defaults", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/firewall_rule_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2e4dce46bd2ddbbd7ded11f11f8d4b57f15f603595f69d142e1c10bc8532e936", + "chksum_sha256": "10b22387a8147bd98ea199fa7e8866837cb3742dd173a2bb2f1c4bfefb326741", "format": 1 }, { - "name": "plugins/modules/snapshot.py", + "name": "tests/integration/targets/startup_script_info", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/startup_script_info/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "361a3cdac8de6b7ff2ba98859389d9d53e6a45b5f003bd069d9ea78a2759bcfc", + "chksum_sha256": "0e6908b2c939974fe0c6636ebb5d908284145edfb8ae78ebf2ca6b73d15a398a", "format": 1 }, { - "name": "plugins/modules/reserved_ip.py", + "name": "tests/integration/targets/startup_script_info/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/startup_script_info/tasks/tests.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a28bb0cafda10d630df72411835c4eb01c763888c9222bc81ffe37a46a281dfe", + "chksum_sha256": "5668e06fe3cf14e4ffdbf68decff145135365a9e4b7cd889096308ad4516565e", "format": 1 }, { - "name": "plugins/modules/ssh_key_info.py", + "name": "tests/integration/targets/startup_script_info/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5cedb298db9d7b8b3888eed9a734309a5ef0b0cae1052211cc0a571a9c2ada22", + "chksum_sha256": "d5738ca7eeca0a524a80197d73b1d677913903103d5bea0663c8fdc66eb6c09c", "format": 1 }, { - "name": "plugins/module_utils", + "name": "tests/integration/targets/startup_script_info/meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "plugins/module_utils/vultr_v2.py", + "name": "tests/integration/targets/startup_script_info/meta/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e49032c648151d4eeaaf522522afe8955a1ab734c8742cc82fe7111b4a7166b8", + "chksum_sha256": "fad8168157b59ea211367da3adec3c025885b88e940a43fbdd8c5b9a8f06a791", "format": 1 }, { - "name": "plugins/inventory", + "name": "tests/integration/targets/startup_script_info/defaults", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "plugins/inventory/vultr.py", + "name": "tests/integration/targets/startup_script_info/defaults/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3f27d32a30a548dffa6c2e327ba4db98db9c4ac40d6682a3af677e5dc810d882", + "chksum_sha256": "81ba8e5671cf9d77b15558eb21489b807a60b071c19dc5a16cbfd9ba6ccfe835", "format": 1 }, { - "name": "plugins/doc_fragments", + "name": "tests/integration/targets/common", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "plugins/doc_fragments/__init__.py", + "name": "tests/integration/targets/common/aliases", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "chksum_sha256": "e084a3683ef795d1cdbf5e9b253f2ca1f783ae0d0d6e47e419acbbc4fc80bbfa", "format": 1 }, { - "name": "plugins/doc_fragments/vultr_v2.py", + "name": "tests/integration/targets/common/default", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/common/default/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "64f7eb39cbe633e26394afeb6d125d440046ec37f1cf82d4a4ea072092954afa", + "chksum_sha256": "11f87c1aa19551822d0b8585fcbb27151354e93cca5298e419581a349a23896d", "format": 1 }, { - "name": "changelogs", + "name": "tests/unit", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "changelogs/.gitignore", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "919ef00776e7d2ff349950ac4b806132aa9faf006e214d5285de54533e443b33", + "name": "tests/unit/plugins", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "changelogs/changelog.yaml", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6feaa7b0a10c92895065283614f9f6a39d59fd2ca304389535252396233094d1", + "name": "tests/unit/plugins/inventory", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, "format": 1 }, { - "name": "changelogs/fragments", + "name": "tests/unit/plugins/inventory/fixtures", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": "changelogs/fragments/.keep", + "name": "tests/unit/plugins/inventory/fixtures/vultr_inventory_page1.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "chksum_sha256": "004b664e8ddebb2714c97f7ef2c95be8d7b2e770089eb49b563fb321e4a79823", "format": 1 }, { - "name": "changelogs/config.yaml", + "name": "tests/unit/plugins/inventory/fixtures/empty_vultr_inventory.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0d1c790424791b634a9c7704aa0e9ec56e3ff34a602f269d68a356d87c777b3a", + "chksum_sha256": "64191612bc4b0099f55554c92444f8f71ac651b38875433e4a2a351ebb86fc1a", "format": 1 }, { - "name": ".github", - "ftype": "dir", - "chksum_type": null, - "chksum_sha256": null, + "name": "tests/unit/plugins/inventory/fixtures/vultr_inventory_page2.json", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b1151ecdeb91d94258df245931619c94dfdbee87308e8f126cef86932ea54436", "format": 1 }, { - "name": ".github/dependabot.yml", + "name": "tests/unit/plugins/inventory/fixtures/unauthorized_vultr_inventory.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d207e80d10726360f2046d4b2473a3cfd9f9eca99590281fa39d88f78e745145", + "chksum_sha256": "505876bcb387732db0065e9ff092c3060c8436dbe15e7ec98846899cf81603f4", "format": 1 }, { - "name": ".github/workflows", + "name": "tests/unit/plugins/inventory/fixtures/vultr_inventory.json", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "7966a533c5dbbe1df5eddac1ec56df52ec808b6a39303a51467dfcb74c329cc0", + "format": 1 + }, + { + "name": "tests/unit/plugins/inventory/test_vultr.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "a515f9f6c528aeb57f20b7975f2e0962967e48b6d8dcdb96cf43a4798d12ab7c", + "format": 1 + }, + { + "name": "meta", "ftype": "dir", "chksum_type": null, "chksum_sha256": null, "format": 1 }, { - "name": ".github/workflows/integration.yml", + "name": "meta/runtime.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ba0c3bd03b358fd8cabaeb9fa2fe824530564df5c529de700fce29f607056102", + "chksum_sha256": "5e1e422bd1c479643c7cd120a6935927d999101c1bbcb3345d0ee3a8166c19d0", "format": 1 }, { - "name": ".github/workflows/unit.yml", + "name": ".ansible-lint", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7051532c9f19b38b2ac988bfd7c937d5cdf7daa6b93aa120161216505c1d0b62", + "chksum_sha256": "8e858e68d7c1937d65dfcad8b39b28b8d7e41aac65eff967772fba0c3a882a15", "format": 1 }, { - "name": ".github/workflows/publish.yml", + "name": "codecov.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9efbf024e8a8ce47dd5e91f825c0ce533a67fb9c8155851df4676184d6f4d06d", + "chksum_sha256": "0271dcfe609d71afb466112f2d1c4c13943580fa97bb42b2baa08a1c37bb1c14", "format": 1 }, { - "name": ".github/workflows/sanity.yml", + "name": "README.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dc5cc7a6c0cea7cd93788a4db2cdfae337f39f98eca906cec9321b26209f9667", + "chksum_sha256": "93a4ac3fa1028eaa4e6e3695e3d6b8e1c5068fb507a3bddd20de12366c563b7e", "format": 1 }, { - "name": "COPYING", + "name": ".yamllint", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c61f12da7cdad526bdcbed47a4c0a603e60dbbfdaf8b66933cd088e9132c303f", + "chksum_sha256": "5845e18e9f23155f423207df9abac970aed687c638620bc2c9ee06706191054b", "format": 1 } ], diff --git a/ansible_collections/vultr/cloud/MANIFEST.json b/ansible_collections/vultr/cloud/MANIFEST.json index 787b93878..d7fc23121 100644 --- a/ansible_collections/vultr/cloud/MANIFEST.json +++ b/ansible_collections/vultr/cloud/MANIFEST.json @@ -2,7 +2,7 @@ "collection_info": { "namespace": "vultr", "name": "cloud", - "version": "1.8.0", + "version": "1.12.1", "authors": [ "Ren\u00e9 Moser (@resmo)", "Yanis Guenane (@Spredzy)", @@ -26,7 +26,7 @@ "name": "FILES.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1abc635ad92d54847dd169705eaa4f000ddd045fe65318c39625c860a273c69b", + "chksum_sha256": "efeafb855683a649e3e0bbd0fea795ea3d8e0581d11b240365caaa92b0fc55cb", "format": 1 }, "format": 1 diff --git a/ansible_collections/vultr/cloud/README.md b/ansible_collections/vultr/cloud/README.md index 38880f9b6..0af5a70ad 100644 --- a/ansible_collections/vultr/cloud/README.md +++ b/ansible_collections/vultr/cloud/README.md @@ -7,7 +7,7 @@ This repository contains the `vultr.cloud` Ansible Collection . The collection w --- **NOTE** -`vultr.cloud` is the successor of exisitng `ngine_io.vultr` collection ([Ansible docs site](https://docs.ansible.com/ansible/latest/collections/ngine_io/vultr/)), which uses the deprecated Vultr v1 API. +`vultr.cloud` is the successor of deprecated `ngine_io.vultr` collection which used the sunsetted Vultr v1 API. --- @@ -23,7 +23,7 @@ Release notes are available in our [changelog](https://github.com/vultr/ansible- This collection will be shipped with the Ansible package >=6.0.0. If you have it installed, no more action is required. -If you have a minimal installation (only Ansible Core installed) or you want to use the latest version of the collection along with the whole Ansible package, you need to install the collection from [Ansible Galaxy](https://galaxy.ansible.com/vultr/cloud) manually with the `ansible-galaxy` command-line tool: +If you have a minimal installation (only Ansible Core installed) or you want to use the latest version of the collection along with the whole Ansible package, you need to install the collection from [Ansible Galaxy](https://galaxy.ansible.com/ui/repo/published/vultr/cloud/) manually with the `ansible-galaxy` command-line tool: ansible-galaxy collection install vultr.cloud diff --git a/ansible_collections/vultr/cloud/changelogs/changelog.yaml b/ansible_collections/vultr/cloud/changelogs/changelog.yaml index a24c768f9..01ecfe6a9 100644 --- a/ansible_collections/vultr/cloud/changelogs/changelog.yaml +++ b/ansible_collections/vultr/cloud/changelogs/changelog.yaml @@ -100,6 +100,63 @@ releases: name: instance namespace: '' release_date: '2022-09-09' + 1.10.0: + changes: + minor_changes: + - inventory - Added VPC/VPC 2.0 support by adding ``internal_ip`` to the attributes + (https://github.com/vultr/ansible-collection-vultr/issues/86). + fragments: + - 86-inventory-internal_ip.yml + release_date: '2023-09-18' + 1.10.1: + changes: + bugfixes: + - instance - Fixed an issue detecting the instance state returned by the API + (https://github.com/vultr/ansible-collection-vultr/pull/89). + fragments: + - fix-instance-state-wait-for.yml + release_date: '2023-11-11' + 1.11.0: + changes: + bugfixes: + - reserved_ip - Fixed an issue which caused the module to fail, also enabled + integration tests (https://github.com/vultr/ansible-collection-vultr/issues/92). + minor_changes: + - Implemented a feature to distinguish resources by region if available. This + allows to have identical name per region e.g. a VPC named ``default`` in each + region. (https://github.com/vultr/ansible-collection-vultr/pull/98). + - instance - Added a new param ``user_scheme`` to change user scheme to non-root + on Linux while creating the instance (https://github.com/vultr/ansible-collection-vultr/issues/96). + fragments: + - distinguish-per-region.yml + - instance-user-scheme.yml + - reserved_ip-fix-broken-module.yml + release_date: '2023-12-05' + 1.12.0: + changes: + bugfixes: + - Fixed an issue with waiting for state (https://github.com/vultr/ansible-collection-vultr/pull/102). + minor_changes: + - Added retry on HTTP 504 returned by the API (https://github.com/vultr/ansible-collection-vultr/pull/104). + fragments: + - 102-state-detect.yml + - 104- retry-on-gateway-timeout.yml + modules: + - description: Manages object storages on Vultr + name: object_storage + namespace: '' + release_date: '2023-12-18' + 1.12.1: + changes: + bugfixes: + - Fixed an error while waiting for a specific state and the API returns an empty + response. (https://github.com/vultr/ansible-collection-vultr/issues/108). + - instance_info - Fixed the alias ``name`` being was used on the wrong argument. + (https://github.com/vultr/ansible-collection-vultr/issues/105). + fragments: + - fix-keyerror-wait-for-state.yml + - instance_info_fix-alias-for-label.yml + release_date: '2024-01-17' 1.2.0: changes: minor_changes: @@ -196,3 +253,21 @@ releases: - 63-inventory-bare-metal.yml - instance-reinstall.yml release_date: '2023-05-21' + 1.9.0: + changes: + bugfixes: + - firewall_rule - Fixed an idempotency issue if parameter ``port`` is set on + protocols other than TCP/UDP (https://github.com/vultr/ansible-collection-vultr/issues/76). + fragments: + - firewall_rule-fix-idempotency-icmp.yml + modules: + - description: Manages bare metal machines on Vultr. + name: bare_metal + namespace: '' + - description: Manages VPCs 2.0 on Vultr + name: vpc2 + namespace: '' + - description: Gather information about the Vultr VPCs 2.0 + name: vpc2_info + namespace: '' + release_date: '2023-08-22' diff --git a/ansible_collections/vultr/cloud/meta/runtime.yml b/ansible_collections/vultr/cloud/meta/runtime.yml index 7be048948..2d3570e84 100644 --- a/ansible_collections/vultr/cloud/meta/runtime.yml +++ b/ansible_collections/vultr/cloud/meta/runtime.yml @@ -3,6 +3,7 @@ requires_ansible: ">=2.11" action_groups: vultr: - account_info + - bare_metal - block_storage - block_storage_info - dns_domain @@ -14,6 +15,7 @@ action_groups: - firewall_rule_info - instance - instance_info + - object_storage - os_info - plan_info - plan_metal_info @@ -27,3 +29,5 @@ action_groups: - user_info - vpc - vpc_info + - vpc2 + - vpc2_info diff --git a/ansible_collections/vultr/cloud/plugins/inventory/vultr.py b/ansible_collections/vultr/cloud/plugins/inventory/vultr.py index c08446134..060813af5 100644 --- a/ansible_collections/vultr/cloud/plugins/inventory/vultr.py +++ b/ansible_collections/vultr/cloud/plugins/inventory/vultr.py @@ -66,6 +66,7 @@ options: description: - Instance attributes to add as host variables to each host added to inventory. - See U(https://www.vultr.com/api/#operation/list-instances) for valid values. + - The I(internal_ip) attribute was added in version 1.10.0. type: list elements: str default: @@ -77,6 +78,7 @@ options: - main_ip - v6_main_ip - tags + - internal_ip filters: description: - Filter hosts with Jinja2 templates. @@ -116,7 +118,7 @@ notes: EXAMPLES = """ --- -# File endings vultr{,-{hosts,instances}}.y{,a}ml +# File endings vultr{,_{hosts,instances}}.y{,a}ml # All configuration done via environment variables: plugin: vultr.cloud.vultr @@ -147,6 +149,11 @@ plugin: vultr.cloud.vultr compose: ansible_host: vultr_v6_main_ip or vultr_main_ip +# Use the internal IP +plugin: vultr.cloud.vultr +compose: + ansible_host: vultr_internal_ip + # Querying the bare metal instances plugin: vultr.cloud.vultr instance_type: bare_metal @@ -160,7 +167,8 @@ from ansible.errors import AnsibleError, AnsibleParserError from ansible.module_utils._text import to_native from ansible.module_utils.six.moves.urllib.error import HTTPError, URLError from ansible.module_utils.urls import Request -from ansible.plugins.inventory import BaseInventoryPlugin, Cacheable, Constructable +from ansible.plugins.inventory import (BaseInventoryPlugin, Cacheable, + Constructable) from ..module_utils.vultr_v2 import VULTR_USER_AGENT diff --git a/ansible_collections/vultr/cloud/plugins/module_utils/common_instance.py b/ansible_collections/vultr/cloud/plugins/module_utils/common_instance.py new file mode 100644 index 000000000..8e6bcac56 --- /dev/null +++ b/ansible_collections/vultr/cloud/plugins/module_utils/common_instance.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# 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 + +import base64 + +from .vultr_v2 import AnsibleVultr + + +class AnsibleVultrCommonInstance(AnsibleVultr): + VPC_CONFIGS = { + "v1": { + "param": "vpcs", + "path": "/vpcs", + "suffix": "", + }, + "v2": { + "param": "vpc2s", + "path": "/vpc2", + "suffix": "2", + }, + } + + def get_ssh_key_ids(self): + ssh_key_names = list(self.module.params["ssh_keys"]) + ssh_keys = self.query_list(path="/ssh-keys", result_key="ssh_keys") + + ssh_key_ids = list() + for ssh_key in ssh_keys: + if ssh_key["name"] in ssh_key_names: + ssh_key_ids.append(ssh_key["id"]) + ssh_key_names.remove(ssh_key["name"]) + + if ssh_key_names: + self.module.fail_json(msg="SSH key names not found: %s" % ", ".join(ssh_key_names)) + + return ssh_key_ids + + def get_resource_vpcs(self, resource, api_version="v1"): + path = "%s/%s" % (self.resource_path, resource["id"] + self.VPC_CONFIGS[api_version]["path"]) + vpcs = self.query_list(path=path, result_key="vpcs") + + # TODO: Workaround to get the description field into the list if missing + result = list() + for vpc in vpcs: + if "description" in vpc: + return vpcs + + vpc_detail = self.query_by_id(resource_id=vpc["id"], path=self.VPC_CONFIGS[api_version]["path"], result_key="vpc") + vpc["description"] = vpc_detail["description"] + result.append(vpc) + return result + + def get_vpc_ids(self, api_version="v1"): + vpc_names = list(self.module.params[self.VPC_CONFIGS[api_version]["param"]]) + vpcs = self.query_list(self.VPC_CONFIGS[api_version]["path"], result_key="vpcs") + + vpc_ids = list() + for vpc in vpcs: + if self.module.params["region"] != vpc["region"]: + continue + + if vpc["description"] in vpc_names: + vpc_ids.append(vpc["id"]) + vpc_names.remove(vpc["description"]) + + if vpc_names: + self.module.fail_json(msg="VPCs (%s) not found: %s" % (api_version, ", ".join(vpc_names))) + + return vpc_ids + + def get_firewall_group(self): + return self.query_filter_list_by_name( + key_name="description", + param_key="firewall_group", + path="/firewalls", + result_key="firewall_groups", + fail_not_found=True, + ) + + def get_snapshot(self): + return self.query_filter_list_by_name( + key_name="description", + param_key="snapshot", + path="/snapshots", + result_key="snapshots", + fail_not_found=True, + ) + + def get_startup_script(self): + return self.query_filter_list_by_name( + key_name="name", + param_key="startup_script", + path="/startup-scripts", + result_key="startup_scripts", + fail_not_found=True, + ) + + def get_os(self): + return self.query_filter_list_by_name( + key_name="name", + param_key="os", + path="/os", + result_key="os", + fail_not_found=True, + ) + + def get_app(self): + return self.query_filter_list_by_name( + key_name="deploy_name", + param_key="app", + path="/applications", + result_key="applications", + fail_not_found=True, + query_params={"type": "one-click"}, + ) + + def get_image(self): + return self.query_filter_list_by_name( + key_name="deploy_name", + param_key="image", + path="/applications", + result_key="applications", + fail_not_found=True, + query_params={"type": "marketplace"}, + ) + + def get_user_data(self, resource): + res = self.api_query( + path="%s/%s/%s" % (self.resource_path, resource[self.resource_key_id], "user-data"), + ) + if res: + return str(res.get("user_data", dict()).get("data")) + return "" + + def transform_resource(self, resource): + if not resource: + return resource + + features = resource.get("features", list()) + # Cloud instance features + if "backups" in self.module.params: + resource["backups"] = "enabled" if "auto_backups" in features else "disabled" + if "ddos_protection" in self.module.params: + resource["ddos_protection"] = "ddos_protection" in features + + # Bare metal features + if "persistent_pxe" in self.module.params: + resource["persistent_pxe"] = "persistent_pxe" in features + + # Common features + resource["enable_ipv6"] = "ipv6" in features + + # VPCs + if "vpcs" in self.module.params: + resource["vpcs"] = self.get_resource_vpcs(resource=resource) + if "vpc2s" in self.module.params: + resource["vpc2s"] = self.get_resource_vpcs(resource=resource, api_version="v2") + + return resource + + def get_detach_vpcs_ids(self, resource, api_version="v1"): + detach_vpc_ids = [] + for vpc in resource.get(self.VPC_CONFIGS[api_version]["param"], list()): + param = "attach_vpc%s" % self.VPC_CONFIGS[api_version]["suffix"] + if vpc["id"] not in list(self.module.params[param]): + detach_vpc_ids.append(vpc["id"]) + return detach_vpc_ids + + def configure(self): + if self.module.params["state"] != "absent": + if self.module.params.get("startup_script") is not None: + self.module.params["script_id"] = self.get_startup_script()["id"] + + if self.module.params.get("snapshot") is not None: + self.module.params["snapshot_id"] = self.get_snapshot()["id"] + + if self.module.params.get("os") is not None: + self.module.params["os_id"] = self.get_os()["id"] + + if self.module.params.get("app") is not None: + self.module.params["app_id"] = self.get_app()["id"] + + if self.module.params.get("image") is not None: + self.module.params["image_id"] = self.get_image()["image_id"] + + if self.module.params.get("user_data") is not None: + self.module.params["user_data"] = base64.b64encode(self.module.params["user_data"].encode()) + + if self.module.params.get("ssh_keys") is not None: + # sshkey_id ist a list of ids + self.module.params["sshkey_id"] = self.get_ssh_key_ids() + + if self.module.params.get("vpcs") is not None: + # attach_vpc is a list of ids used while creating + self.module.params["attach_vpc"] = self.get_vpc_ids() + + if self.module.params.get("vpc2s") is not None: + # attach_vpc2 is a list of ids used while creating + self.module.params["attach_vpc2"] = self.get_vpc_ids(api_version="v2") + + def create(self): + param_keys = ("os", "image", "app", "snapshot") + if not any(self.module.params.get(x) is not None for x in param_keys): + self.module.fail_json(msg="missing required arguements, one of the following required: %s" % ", ".join(param_keys)) + return super(AnsibleVultrCommonInstance, self).create() + + def update(self, resource): + user_data = self.get_user_data(resource=resource) + resource["user_data"] = user_data.encode() + + # VPC1 + if self.module.params.get("vpcs") is not None: + resource["attach_vpc"] = list() + for vpc in list(resource["vpcs"]): + resource["attach_vpc"].append(vpc["id"]) + + # detach_vpc is a list of ids to be detached + resource["detach_vpc"] = list() + self.module.params["detach_vpc"] = self.get_detach_vpcs_ids(resource=resource) + + # VPC2 + if self.module.params.get("vpc2s") is not None: + resource["attach_vpc2"] = list() + for vpc in list(resource["vpc2s"]): + resource["attach_vpc2"].append(vpc["id"]) + + # detach_vpc2 is a list of ids to be detached + resource["detach_vpc2"] = list() + self.module.params["detach_vpc2"] = self.get_detach_vpcs_ids(resource=resource, api_version="v2") + + return super(AnsibleVultrCommonInstance, self).update(resource=resource) + + def create_or_update(self): + resource = super(AnsibleVultrCommonInstance, self).create_or_update() + if resource: + resource = self.wait_for_state(resource=resource, key="status", states=["active"], retries=300) + return resource + + def transform_result(self, resource): + if resource: + resource["user_data"] = self.get_user_data(resource=resource) + return resource diff --git a/ansible_collections/vultr/cloud/plugins/module_utils/vultr_v2.py b/ansible_collections/vultr/cloud/plugins/module_utils/vultr_v2.py index fb49d6180..602e89605 100644 --- a/ansible_collections/vultr/cloud/plugins/module_utils/vultr_v2.py +++ b/ansible_collections/vultr/cloud/plugins/module_utils/vultr_v2.py @@ -75,7 +75,6 @@ class AnsibleVultr: resource_update_param_keys=None, resource_update_method="PATCH", ): - self.module = module self.namespace = namespace @@ -165,7 +164,8 @@ class AnsibleVultr: # Check for: # 429 Too Many Requests # 500 Internal Server Error - if info["status"] not in (429, 500): + # 504 Gateway Time-out + if info["status"] not in (429, 500, 504): break # Vultr has a rate limiting requests per second, try to be polite @@ -202,9 +202,23 @@ class AnsibleVultr: found = dict() for resource in self.query_list(path=path, result_key=result_key, query_params=query_params): if resource.get(key_name) == param_value: + # In case the resource has a region, distinguish between the region + # This allows to have identical identifiers (e.g. names) per region + region_param = self.module.params.get("region") + region_resource = resource.get("region") + if region_resource and region_param and (region_param != region_resource): + continue + if found: - self.module.fail_json(msg="More than one record with name=%s found. " "Use multiple=true if module supports it." % param_value) + if region_resource and not region_param: + msg = "More than one record with name=%s found. Use region to distinguish." % param_value + else: + msg = "More than one record with name=%s found. Use multiple=true if module supports it." % param_value + + self.module.fail_json(msg=msg) + found = resource + if found: if get_details: return self.query_by_id(resource_id=found[key_id], skip_transform=skip_transform) @@ -256,21 +270,24 @@ class AnsibleVultr: resources = self.api_query(path=path, query_params=query_params) return resources[result_key] if resources else [] - def wait_for_state(self, resource, key, states, cmp="="): - for retry in range(0, 60): - resource = self.query_by_id(resource_id=resource[self.resource_key_id], skip_transform=False) - if cmp == "=": - if key not in resource or resource[key] in states or not resource[key]: - break - else: - if key not in resource or resource[key] not in states or not resource[key]: - break + def wait_for_state(self, resource, key, states, cmp="=", retries=60): + resource_id = resource[self.resource_key_id] + for retry in range(0, retries): + resource = self.query_by_id(resource_id=resource_id, skip_transform=False) + if resource and key in resource: + if cmp == "=": + if resource[key] in states: + break + else: + if resource[key] not in states: + break backoff(retry=retry) else: if cmp == "=": - self.module.fail_json(msg="Wait for %s to become %s timed out" % (key, states)) + msg = "Wait for %s to become one in %s timed out" % (key, states) else: - self.module.fail_json(msg="Wait for %s to not be in %s timed out" % (key, states)) + msg = "Wait for %s to not be in %s timed out" % (key, states) + self.module.fail_json(msg=msg) return resource diff --git a/ansible_collections/vultr/cloud/plugins/modules/bare_metal.py b/ansible_collections/vultr/cloud/plugins/modules/bare_metal.py new file mode 100644 index 000000000..d2ffe09ef --- /dev/null +++ b/ansible_collections/vultr/cloud/plugins/modules/bare_metal.py @@ -0,0 +1,440 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# 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 = """ +--- +module: bare_metal +short_description: Manages bare metal machines on Vultr. +description: + - Manage bare metal machines on Vultr. +version_added: "1.9.0" +author: + - "René Moser (@resmo)" +options: + label: + description: + - Name of the bare metal machine. + required: true + aliases: [ name ] + type: str + hostname: + description: + - The hostname to assign to this bare metal machine. + type: str + os: + description: + - The operating system name. + - Mutually exclusive with I(image) and I(app). + type: str + app: + description: + - The app deploy name of Vultr OneClick apps. + - Mutually exclusive with I(image) and I(os). + type: str + image: + description: + - The image deploy name of Vultr Marketplace apps. + - Mutually exclusive with I(os) and I(app). + type: str + plan: + description: + - The plan name to use for the bare metal machine. + - Required if the bare metal machine does not yet exist. + type: str + activation_email: + description: + - Whether to send an activation email when the bare metal machine is ready or not. + - Only considered on creation. + type: bool + default: false + persistent_pxe: + description: + - Whether to enable persistent PXE or not. + type: bool + enable_ipv6: + description: + - Whether to enable IPv6 or not. + type: bool + tags: + description: + - Tags for the bare metal machine. + type: list + elements: str + user_data: + description: + - User data to be passed to the bare metal machine. + type: str + startup_script: + description: + - Name or ID of the startup script to execute on boot. + - Only considered while creating the bare metal machine. + type: str + ssh_keys: + description: + - List of SSH key names passed to the bare metal machine on creation. + type: list + elements: str + snapshot: + description: + - Description or ID of the snapshot. + - Only considered while creating the bare metal machine. + type: str + reserved_ipv4: + description: + - IP address of the floating IP to use as the main IP of this bare metal machine. + - Only considered on creation. + type: str + region: + description: + - Region the bare metal machine is deployed into. + type: str + required: true + vpc2s: + description: + - A list of VPCs (VPC 2.0) identified by their description to be assigned to the bare metal machine. + type: list + elements: str + state: + description: + - State of the bare metal machine. + default: present + choices: [ present, absent ] + type: str +extends_documentation_fragment: + - vultr.cloud.vultr_v2 +""" + +EXAMPLES = """ +--- +- name: Create an bare metal machine using OS + vultr.cloud.bare_metal: + label: my web server + hostname: my-hostname + user_data: | + #cloud-config + packages: + - nginx + plan: vbm-4c-32gb + enable_ipv6: true + ssh_keys: + - my ssh key + vpc2s: + - my vpc description + tags: + - web + - project-genesis + region: ams + os: Debian 12 x64 (bookworm) + +- name: Deploy an bare metal machine of a marketplace app + vultr.cloud.bare_metal: + label: git-server + hostname: git + plan: vbm-4c-32gb + enable_ipv6: true + region: ams + image: Gitea on Ubuntu 20.04 + +- name: Delete an bare metal machine + vultr.cloud.bare_metal: + label: my web server + region: ams + state: absent +""" + +RETURN = """ +--- +vultr_api: + description: Response from Vultr API with a few additions/modification. + returned: success + type: dict + contains: + api_timeout: + description: Timeout used for the API requests. + returned: success + type: int + sample: 60 + api_retries: + description: Amount of max retries for the API requests. + returned: success + type: int + sample: 5 + api_retry_max_delay: + description: Exponential backoff delay in seconds between retries up to this max delay value. + returned: success + type: int + sample: 12 + api_endpoint: + description: Endpoint used for the API requests. + returned: success + type: str + sample: "https://api.vultr.com/v2" +vultr_bare_metal: + description: Response from Vultr API. + returned: success + type: dict + contains: + id: + description: ID of the bare metal machine. + returned: success + type: str + sample: cb676a46-66fd-4dfb-b839-443f2e6c0b60 + v6_main_ip: + description: IPv6 of the bare metal machine. + returned: success + type: str + sample: "" + v6_network: + description: IPv6 network of the bare metal machine. + returned: success + type: str + sample: "" + v6_network_size: + description: IPv6 network size of the bare metal machine. + returned: success + type: int + sample: 0 + mac_address: + description: MAC address of the bare metal machine. + returned: success + type: int + sample: 2199756823533 + main_ip: + description: IPv4 of the bare metal machine. + returned: success + type: str + sample: 95.179.189.95 + netmask_v4: + description: Netmask IPv4 of the bare metal machine. + returned: success + type: str + sample: 255.255.254.0 + gateway_v4: + description: Gateway IPv4. + returned: success + type: str + sample: 95.179.188.1 + disk: + description: Disk info of the bare metal machine. + returned: success + type: str + sample: "2x 240GB SSD" + cpu_count: + description: CPU count of the bare metal machine. + returned: success + type: int + sample: 1 + plan: + description: Plan of the bare metal machine. + returned: success + type: str + sample: vbm-4c-32gb + image_id: + description: Image ID of the bare metal machine. + returned: success + type: str + sample: "" + os_id: + description: OS ID of the bare metal machine. + returned: success + type: int + sample: 186 + app_id: + description: App ID of the bare metal machine. + returned: success + type: int + sample: 37 + date_created: + description: Date when the bare metal machine was created. + returned: success + type: str + sample: "2020-10-10T01:56:20+00:00" + label: + description: Label of the bare metal machine. + returned: success + type: str + sample: my bare metal machine + region: + description: Region the bare metal machine was deployed into. + returned: success + type: str + sample: ews + status: + description: Status about the deployment of the bare metal machine. + returned: success + type: str + sample: active + default_password: + description: The default password assigned at deployment. Only available for ten minutes after deployment. + returned: success + type: str + sample: "examplePassword" + power_status: + description: Power status of the bare metal machine. + returned: success + type: str + sample: running + ram: + description: RAM info of the bare metal machine. + returned: success + type: str + sample: "32768 MB" + os: + description: OS of the bare metal machine. + returned: success + type: str + sample: Application + tags: + description: Tags of the bare metal machine. + returned: success + type: list + sample: [ my-tag ] + features: + description: Features of the bare metal machine. + returned: success + type: list + sample: [ ddos_protection, ipv6, auto_backups ] + user_data: + description: Base64 encoded user data (cloud init) of the bare metal machine. + returned: success + type: str + sample: I2Nsb3VkLWNvbmZpZwpwYWNrYWdlczoKICAtIGh0b3AK + enable_ipv6: + description: Whether IPv6 is enabled or not. + returned: success + type: bool + sample: true + vpc2s: + description: List of VPCs (VPC 2.0) attached. + returned: success + type: list + contains: + id: + description: ID of the VPC. + returned: success + type: str + sample: 5536d2a4-66fd-4dfb-b839-7672fd5bc116 + description: + description: Description of the VPC. + returned: success + type: str + sample: my vpc + region: + description: Region the VPC is assigned to. + returned: success + type: str + sample: ews + date_created: + description: Date when the VPC was created. + returned: success + type: str + sample: "2020-10-10T01:56:20+00:00" + ip_block: + description: IP block assigned to the VPC. + returned: success + type: str + sample: "10.99.0.0" + prefix_length: + description: The number of bits for the netmask in CIDR notation. + returned: success + type: int + sample: 24 +""" + + +from ansible.module_utils.basic import AnsibleModule + +from ..module_utils.common_instance import AnsibleVultrCommonInstance +from ..module_utils.vultr_v2 import vultr_argument_spec + + +def main(): + argument_spec = vultr_argument_spec() + argument_spec.update( + dict( + label=dict(type="str", required=True, aliases=["name"]), + hostname=dict(type="str"), + app=dict(type="str"), + image=dict(type="str"), + snapshot=dict(type="str"), + os=dict(type="str"), + plan=dict(type="str"), + activation_email=dict(type="bool", default=False), + enable_ipv6=dict(type="bool"), + persistent_pxe=dict(type="bool"), + tags=dict(type="list", elements="str"), + vpc2s=dict(type="list", elements="str"), + reserved_ipv4=dict(type="str"), + startup_script=dict(type="str"), + user_data=dict(type="str"), + ssh_keys=dict(type="list", elements="str", no_log=False), + region=dict(type="str", required=True), + state=dict( + choices=[ + "present", + "absent", + ], + default="present", + ), + ) # type: ignore + ) + + module = AnsibleModule( + argument_spec=argument_spec, + required_if=(("state", "present", ("plan",)),), + mutually_exclusive=(("os", "app", "image", "snapshot"),), + supports_check_mode=True, + ) + + vultr = AnsibleVultrCommonInstance( + module=module, + namespace="vultr_bare_metal", + resource_path="/bare-metals", + ressource_result_key_singular="bare_metal", + resource_create_param_keys=[ + "label", + "hostname", + "plan", + "app_id", + "os_id", + "iso_id", + "image_id", + "snapshot_id", + "script_id", + "region", + "enable_ipv6", + "reserved_ipv4", + "user_data", + "tags", + "activation_email", + "sshkey_id", + "persistent_pxe", + "attach_vpc2", + ], + resource_update_param_keys=[ + "plan", + "tags", + "enable_ipv6", + "user_data", + "attach_vpc2", + "detach_vpc2", + ], + resource_key_name="label", + ) + + state = module.params.get("state") # type: ignore + if state == "absent": + vultr.absent() + else: + vultr.present() + + +if __name__ == "__main__": + main() diff --git a/ansible_collections/vultr/cloud/plugins/modules/firewall_rule.py b/ansible_collections/vultr/cloud/plugins/modules/firewall_rule.py index 474372d08..67dd85f4d 100644 --- a/ansible_collections/vultr/cloud/plugins/modules/firewall_rule.py +++ b/ansible_collections/vultr/cloud/plugins/modules/firewall_rule.py @@ -212,6 +212,21 @@ class AnsibleVultrFirewallRule(AnsibleVultr): if source is not None and source != "cloudflare": self.module.params["source"] = self.get_load_balancer()["id"] + # Warn about port only affects TCP and UDP protocol + if ( + self.module.params.get("protocol") + not in ( + "tcp", + "udp", + ) + and self.module.params.get("port") is not None + ): + self.module.warn( + "Setting a port (%s) only affects protocols TCP/UDP, but protocol is: %s. Ignoring." + % (self.module.params.get("port"), self.module.params.get("protocol")) + ) + self.module.params["port"] = None + def query(self): result = dict() for resource in self.query_list(): diff --git a/ansible_collections/vultr/cloud/plugins/modules/instance.py b/ansible_collections/vultr/cloud/plugins/modules/instance.py index 73099164d..7eca359b4 100644 --- a/ansible_collections/vultr/cloud/plugins/modules/instance.py +++ b/ansible_collections/vultr/cloud/plugins/modules/instance.py @@ -80,6 +80,14 @@ options: description: - User data to be passed to the instance. type: str + user_scheme: + description: + - The user scheme used as login user (Linux-only). + - By default, the I(root) user is configured. + - Only considered while creating the instance. + type: str + choices: [ root, limited ] + version_added: "1.11.0" startup_script: description: - Name or ID of the startup script to execute on boot. @@ -146,7 +154,7 @@ EXAMPLES = """ - web - project-genesis region: ams - os: Debian 11 x64 (bullseye) + os: Debian 12 x64 (bookworm) - name: Deploy an instance of a marketplace app vultr.cloud.instance: @@ -362,6 +370,12 @@ vultr_instance: returned: success type: str sample: I2Nsb3VkLWNvbmZpZwpwYWNrYWdlczoKICAtIGh0b3AK + user_scheme: + description: The user scheme to login into this instance + returned: success + type: str + sample: root + version_added: "1.11.0" backups: description: Whether backups are enabled or disabled. returned: success @@ -408,173 +422,14 @@ vultr_instance: sample: "5a:01:04:3d:5e:72" """ -import base64 from ansible.module_utils.basic import AnsibleModule -from ..module_utils.vultr_v2 import AnsibleVultr, vultr_argument_spec - - -class AnsibleVultrInstance(AnsibleVultr): - def get_ssh_key_ids(self): - ssh_key_names = list(self.module.params["ssh_keys"]) - ssh_keys = self.query_list(path="/ssh-keys", result_key="ssh_keys") - - ssh_key_ids = list() - for ssh_key in ssh_keys: - if ssh_key["name"] in ssh_key_names: - ssh_key_ids.append(ssh_key["id"]) - ssh_key_names.remove(ssh_key["name"]) - - if ssh_key_names: - self.module.fail_json(msg="SSH key names not found: %s" % ", ".join(ssh_key_names)) - - return ssh_key_ids - - def get_vpc_ids(self): - vpc_names = list(self.module.params["vpcs"]) - vpcs = self.query_list(path="/vpcs", result_key="vpcs") - - vpc_ids = list() - for vpc in vpcs: - if vpc["description"] in vpc_names: - vpc_ids.append(vpc["id"]) - vpc_names.remove(vpc["description"]) - - if vpc_names: - self.module.fail_json(msg="VPCs not found: %s" % ", ".join(vpc_names)) - - return vpc_ids - - def get_instance_vpcs(self, resource): - path = "/instances/%s/vpcs" % resource["id"] - vpcs = self.query_list(path=path, result_key="vpcs") - - # Workaround to get the description field into the list - result = list() - for vpc in vpcs: - vpc_detail = self.query_by_id(resource_id=vpc["id"], path="/vpcs", result_key="vpc") - vpc["description"] = vpc_detail["description"] - result.append(vpc) - return result - - def get_firewall_group(self): - return self.query_filter_list_by_name( - key_name="description", - param_key="firewall_group", - path="/firewalls", - result_key="firewall_groups", - fail_not_found=True, - ) - - def get_snapshot(self): - return self.query_filter_list_by_name( - key_name="description", - param_key="snapshot", - path="/snapshots", - result_key="snapshots", - fail_not_found=True, - ) - - def get_startup_script(self): - return self.query_filter_list_by_name( - key_name="name", - param_key="startup_script", - path="/startup-scripts", - result_key="startup_scripts", - fail_not_found=True, - ) - - def get_os(self): - return self.query_filter_list_by_name( - key_name="name", - param_key="os", - path="/os", - result_key="os", - fail_not_found=True, - ) - - def get_app(self): - return self.query_filter_list_by_name( - key_name="deploy_name", - param_key="app", - path="/applications", - result_key="applications", - fail_not_found=True, - query_params={"type": "one-click"}, - ) - - def get_image(self): - return self.query_filter_list_by_name( - key_name="deploy_name", - param_key="image", - path="/applications", - result_key="applications", - fail_not_found=True, - query_params={"type": "marketplace"}, - ) - - def get_user_data(self, resource): - res = self.api_query( - path="%s/%s/%s" % (self.resource_path, resource[self.resource_key_id], "user-data"), - ) - if res: - return str(res.get("user_data", dict()).get("data")) - return "" - - def transform_resource(self, resource): - if not resource: - return resource - - features = resource.get("features", list()) - resource["backups"] = "enabled" if "auto_backups" in features else "disabled" - resource["enable_ipv6"] = "ipv6" in features - resource["ddos_protection"] = "ddos_protection" in features - resource["vpcs"] = self.get_instance_vpcs(resource=resource) - - return resource - - def get_detach_vpcs_ids(self, resource): - detach_vpc_ids = [] - for vpc in resource.get("vpcs", list()): - if vpc["id"] not in list(self.module.params["attach_vpc"]): - detach_vpc_ids.append(vpc["id"]) - return detach_vpc_ids - - def configure(self): - if self.module.params["state"] != "absent": - if self.module.params["startup_script"] is not None: - self.module.params["script_id"] = self.get_startup_script()["id"] - - if self.module.params["snapshot"] is not None: - self.module.params["snapshot_id"] = self.get_snapshot()["id"] - - if self.module.params["firewall_group"] is not None: - self.module.params["firewall_group_id"] = self.get_firewall_group()["id"] - - if self.module.params["os"] is not None: - self.module.params["os_id"] = self.get_os()["id"] - - if self.module.params["app"] is not None: - self.module.params["app_id"] = self.get_app()["id"] - - if self.module.params["image"] is not None: - self.module.params["image_id"] = self.get_image()["image_id"] - - if self.module.params["user_data"] is not None: - self.module.params["user_data"] = base64.b64encode(self.module.params["user_data"].encode()) - - if self.module.params["ssh_keys"] is not None: - # sshkey_id ist a list of ids - self.module.params["sshkey_id"] = self.get_ssh_key_ids() - - if self.module.params["backups"] is not None: - self.module.params["backups"] = "enabled" if self.module.params["backups"] else "disabled" +from ..module_utils.common_instance import AnsibleVultrCommonInstance +from ..module_utils.vultr_v2 import vultr_argument_spec - if self.module.params["vpcs"] is not None: - # attach_vpc is a list of ids used while creating - self.module.params["attach_vpc"] = self.get_vpc_ids() +class AnsibleVultrInstance(AnsibleVultrCommonInstance): def handle_power_status(self, resource, state, action, power_status, force=False, wait_for_state=True): if state == self.module.params["state"] and (resource["power_status"] != power_status or force): self.result["changed"] = True @@ -588,31 +443,9 @@ class AnsibleVultrInstance(AnsibleVultr): resource = self.wait_for_state(resource=resource, key="power_status", states=[power_status]) return resource - def create(self): - param_keys = ("os", "image", "app", "snapshot") - if not any(self.module.params.get(x) is not None for x in param_keys): - self.module.fail_json(msg="missing required arguements, one of the following required: %s" % ", ".join(param_keys)) - return super(AnsibleVultrInstance, self).create() - - def update(self, resource): - user_data = self.get_user_data(resource=resource) - resource["user_data"] = user_data.encode() - - if self.module.params["vpcs"] is not None: - resource["attach_vpc"] = list() - for vpc in list(resource["vpcs"]): - resource["attach_vpc"].append(vpc["id"]) - - # detach_vpc is a list of ids to be detached - resource["detach_vpc"] = list() - self.module.params["detach_vpc"] = self.get_detach_vpcs_ids(resource=resource) - - return super(AnsibleVultrInstance, self).update(resource=resource) - def create_or_update(self): resource = super(AnsibleVultrInstance, self).create_or_update() if resource: - resource = self.wait_for_state(resource=resource, key="status", states=["active"]) resource = self.wait_for_state(resource=resource, key="server_status", states=["none", "locked"], cmp="!=") # Hanlde power status @@ -630,10 +463,15 @@ class AnsibleVultrInstance(AnsibleVultr): return resource - def transform_result(self, resource): - if resource: - resource["user_data"] = self.get_user_data(resource=resource) - return resource + def configure(self): + super(AnsibleVultrInstance, self).configure() + + if self.module.params["state"] != "absent": + if self.module.params.get("firewall_group") is not None: + self.module.params["firewall_group_id"] = self.get_firewall_group()["id"] + + if self.module.params.get("backups") is not None: + self.module.params["backups"] = "enabled" if self.module.params["backups"] else "disabled" def absent(self): resource = self.query() @@ -666,6 +504,7 @@ def main(): user_data=dict(type="str"), ssh_keys=dict(type="list", elements="str", no_log=False), region=dict(type="str", required=True), + user_scheme=dict(type="str", choices=["root", "limited"]), state=dict( choices=[ "present", @@ -713,6 +552,7 @@ def main(): "sshkey_id", "backups", "attach_vpc", + "user_scheme", ], resource_update_param_keys=[ "plan", diff --git a/ansible_collections/vultr/cloud/plugins/modules/instance_info.py b/ansible_collections/vultr/cloud/plugins/modules/instance_info.py index 2a5c311bb..d473eae20 100644 --- a/ansible_collections/vultr/cloud/plugins/modules/instance_info.py +++ b/ansible_collections/vultr/cloud/plugins/modules/instance_info.py @@ -239,8 +239,8 @@ def main(): argument_spec = vultr_argument_spec() argument_spec.update( dict( - region=dict(type="str", aliases=["name"]), - label=dict(type="str"), + region=dict(type="str"), + label=dict(type="str", aliases=["name"]), ) # type: ignore ) diff --git a/ansible_collections/vultr/cloud/plugins/modules/object_storage.py b/ansible_collections/vultr/cloud/plugins/modules/object_storage.py new file mode 100644 index 000000000..32ad4f70a --- /dev/null +++ b/ansible_collections/vultr/cloud/plugins/modules/object_storage.py @@ -0,0 +1,197 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2024, René Moser <mail@renemoser.net> +# 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 = """ +--- +module: object_storage +short_description: Manages object storages on Vultr +description: + - Manage object storages. +version_added: "1.12.0" +author: + - "René Moser (@resmo)" +options: + label: + description: + - Name of the object storage. + required: true + aliases: [ name ] + type: str + cluster: + description: + - Cluster hostname where the object storage will be created. + required: true + type: str + state: + description: + - State of the object storage. + default: present + choices: [ present, absent] + type: str +extends_documentation_fragment: + - vultr.cloud.vultr_v2 +""" + +EXAMPLES = """ +--- +- name: Ensure an object storage is present + vultr.cloud.object_storage: + label: my object storage + cluster: ewr1.vultrobjects.com + +- name: Ensure an object storage is absent + vultr.cloud.object_storage: + label: my object storage + cluster: ewr1.vultrobjects.com + state: absent +""" + +RETURN = """ +--- +vultr_api: + description: Response from Vultr API with a few additions/modification. + returned: success + type: dict + contains: + api_account: + description: Account used in the ini file to select the key. + returned: success + type: str + sample: default + api_timeout: + description: Timeout used for the API requests. + returned: success + type: int + sample: 60 + api_retries: + description: Amount of max retries for the API requests. + returned: success + type: int + sample: 5 + api_retry_max_delay: + description: Exponential backoff delay in seconds between retries up to this max delay value. + returned: success + type: int + sample: 12 + api_endpoint: + description: Endpoint used for the API requests. + returned: success + type: str + sample: "https://api.vultr.com/v2" +vultr_block_storage: + description: Response from Vultr API. + returned: success + type: dict + contains: + date_created: + description: Date the object storage was created. + returned: success + type: str + sample: "2020-10-10T01:56:20+00:00" + id: + description: A unique ID for the object storage. + returned: success + type: str + sample: cb676a46-66fd-4dfb-b839-443f2e6c0b60 + label: + description: The user-supplied label for this object storage. + returned: success + type: str + sample: my object storage + region: + description: The region for this object storage. + returned: success + type: str + sample: ews + status: + description: The status of this object storage. + returned: success + type: str + sample: active + s3_hostname: + description: The Cluster hostname for this object storage. + returned: success + type: str + sample: ewr1.vultrobjects.com + s3_access_key: + description: The object storage access key. + returned: success + type: str + sample: 00example11223344 + s3_secret_key: + description: The object storage secret key. + returned: success + type: str + sample: 00example1122334455667788990011 +""" + +from ansible.module_utils.basic import AnsibleModule + +from ..module_utils.vultr_v2 import AnsibleVultr, vultr_argument_spec + + +class AnsibleVultrObjectStorage(AnsibleVultr): + def configure(self): + super(AnsibleVultrObjectStorage, self).configure() + cluster = self.get_cluster() + self.module.params["cluster_id"] = cluster["id"] + # Use region to distinguish labels between regions + self.module.params["region"] = cluster["region"] + + def get_cluster(self): + return self.query_filter_list_by_name( + key_name="hostname", + param_key="cluster", + path="/object-storage/clusters", + result_key="clusters", + fail_not_found=True, + ) + + def create_or_update(self): + resource = super(AnsibleVultrObjectStorage, self).create_or_update() + if resource: + resource = self.wait_for_state(resource=resource, key="status", states=["active"]) + return resource + + +def main(): + argument_spec = vultr_argument_spec() + argument_spec.update( + dict( + label=dict(type="str", required=True, aliases=["name"]), + cluster=dict(type="str", required=True), + state=dict(type="str", choices=["present", "absent"], default="present"), + ) # type: ignore + ) + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + ) + + vultr = AnsibleVultrObjectStorage( + module=module, + namespace="vultr_object_storage", + resource_path="/object-storage", + ressource_result_key_singular="object_storage", + resource_create_param_keys=["label", "cluster_id"], + resource_update_param_keys=["label"], + resource_key_name="label", + ) + + if module.params.get("state") == "absent": # type: ignore + vultr.absent() + else: + vultr.present() + + +if __name__ == "__main__": + main() diff --git a/ansible_collections/vultr/cloud/plugins/modules/reserved_ip.py b/ansible_collections/vultr/cloud/plugins/modules/reserved_ip.py index 9bc2e254b..4bf1c66ae 100644 --- a/ansible_collections/vultr/cloud/plugins/modules/reserved_ip.py +++ b/ansible_collections/vultr/cloud/plugins/modules/reserved_ip.py @@ -166,7 +166,6 @@ class AnsibleVultrReservedIp(AnsibleVultr): instance_name = self.module.params["instance_name"] if instance_name is not None: - # Empty string ID means detach instance if len(instance_name) == 0: return "" @@ -187,7 +186,7 @@ class AnsibleVultrReservedIp(AnsibleVultr): return resources["instances"][0]["id"] - def query_list(self, path=None, result_key=None): + def query_list(self, path=None, result_key=None, query_params=None): resources = self.api_query(path=self.resource_path) or dict() resources_filtered = list() diff --git a/ansible_collections/vultr/cloud/plugins/modules/vpc2.py b/ansible_collections/vultr/cloud/plugins/modules/vpc2.py new file mode 100644 index 000000000..c2caa1784 --- /dev/null +++ b/ansible_collections/vultr/cloud/plugins/modules/vpc2.py @@ -0,0 +1,191 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# 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 = """ +--- +module: vpc2 +short_description: Manages VPCs 2.0 on Vultr +description: + - Create and remove VPCs 2.0. +version_added: "1.9.0" +author: "René Moser (@resmo)" +options: + description: + description: + - Description of the VPC. + required: true + aliases: [ name ] + type: str + ip_type: + description: + - Type of the IP version. + - Required if I(state=present). + default: v4 + choices: [ v4 ] + type: str + ip_block: + description: + - The subnet of the VPC. + - Required if I(state=present). + type: str + prefix_length: + description: + - The number of bits for the netmask in CIDR notation, e.g. 24. + - Required if I(state=present). + type: int + region: + description: + - Region the VPC will be related to. + - Required if I(state=present). + type: str + state: + description: + - State of the VPC. + default: present + choices: [ present, absent ] + type: str +extends_documentation_fragment: + - vultr.cloud.vultr_v2 +""" + +EXAMPLES = """ +- name: Ensure a VPC is present + vultr.cloud.vpc2: + description: my VPC. + ip_block: 10.99.1.0 + prefix_length: 24 + region: ewr + +- name: Ensure a VPC is absent + vultr.cloud.vpc2: + description: my VPC. + state: absent +""" + +RETURN = """ +--- +vultr_api: + description: Response from Vultr API with a few additions/modification. + returned: success + type: dict + contains: + api_timeout: + description: Timeout used for the API requests. + returned: success + type: int + sample: 60 + api_retries: + description: Amount of max retries for the API requests. + returned: success + type: int + sample: 5 + api_retry_max_delay: + description: Exponential backoff delay in seconds between retries up to this max delay value. + returned: success + type: int + sample: 12 + api_endpoint: + description: Endpoint used for the API requests. + returned: success + type: str + sample: "https://api.vultr.com/v2" +vultr_vpc2: + description: Response from Vultr API. + returned: success + type: dict + contains: + id: + description: ID of the VPC. + returned: success + type: str + sample: cb676a46-66fd-4dfb-b839-443f2e6c0b60 + description: + description: Description of the VPC. + returned: success + type: str + sample: my vpc + ip_block: + description: Subnet of the VPC. + returned: success + type: str + sample: 10.99.1.0 + prefix_length: + description: The number of bits for the netmask in CIDR notation. + returned: success + type: int + sample: 24 + date_created: + description: Date the VPC was created. + returned: success + type: str + sample: "2023-08-20T19:39:20+00:00" + region: + description: The region the VPC is located in. + returned: success + type: str + sample: ewr +""" + +from ansible.module_utils.basic import AnsibleModule + +from ..module_utils.vultr_v2 import AnsibleVultr, vultr_argument_spec + + +def main(): + argument_spec = vultr_argument_spec() + argument_spec.update( + dict( + description=dict(type="str", required=True, aliases=["name"]), + ip_type=dict(type="str", choices=["v4"], default="v4"), + ip_block=dict(type="str"), + prefix_length=dict(type="int"), + region=dict(type="str"), + state=dict(type="str", choices=["present", "absent"], default="present"), + ) # type: ignore + ) + + module = AnsibleModule( + argument_spec=argument_spec, + required_if=( + ( + "state", + "present", + ("ip_type", "ip_block", "prefix_length", "region"), + ), + ), + supports_check_mode=True, + ) + + vultr = AnsibleVultr( + module=module, + namespace="vultr_vpc2", + resource_path="/vpc2", + ressource_result_key_singular="vpc", + resource_create_param_keys=[ + "description", + "ip_type", + "ip_block", + "prefix_length", + "region", + ], + resource_update_param_keys=["description"], + resource_key_name="description", + resource_update_method="PUT", + ) + + if module.params.get("state") == "absent": # type: ignore + vultr.absent() + else: + vultr.present() + + +if __name__ == "__main__": + main() diff --git a/ansible_collections/vultr/cloud/plugins/modules/vpc2_info.py b/ansible_collections/vultr/cloud/plugins/modules/vpc2_info.py new file mode 100644 index 000000000..c71c25d14 --- /dev/null +++ b/ansible_collections/vultr/cloud/plugins/modules/vpc2_info.py @@ -0,0 +1,122 @@ +#!/usr/bin/python +# +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# 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 = """ +--- +module: vpc2_info +short_description: Gather information about the Vultr VPCs 2.0 +description: + - Gather information about VPCs 2.0 available. +version_added: "1.9.0" +author: + - "René Moser (@resmo)" +extends_documentation_fragment: + - vultr.cloud.vultr_v2 +""" + +EXAMPLES = """ +- name: Gather Vultr VPCs 2.0 information + vultr.cloud.vpc2_info: + register: result + +- name: Print the gathered information + ansible.builtin.debug: + var: result.vultr_vpc2_info +""" + +RETURN = """ +--- +vultr_api: + description: Response from Vultr API with a few additions/modification. + returned: success + type: dict + contains: + api_timeout: + description: Timeout used for the API requests. + returned: success + type: int + sample: 60 + api_retries: + description: Amount of max retries for the API requests. + returned: success + type: int + sample: 5 + api_retry_max_delay: + description: Exponential backoff delay in seconds between retries up to this max delay value. + returned: success + type: int + sample: 12 + api_endpoint: + description: Endpoint used for the API requests. + returned: success + type: str + sample: "https://api.vultr.com/v2" +vultr_vpc2_info: + description: Response from Vultr API as list. + returned: success + type: list + contains: + id: + description: ID of the VPC. + returned: success + type: str + sample: cb676a46-66fd-4dfb-b839-443f2e6c0b60 + description: + description: Description of the VPC. + returned: success + type: str + sample: my vpc + ip_block: + description: Subnet of the VPC. + returned: success + type: str + sample: 10.99.1.0 + prefix_length: + description: The number of bits for the netmask in CIDR notation. + returned: success + type: int + sample: 24 + date_created: + description: Date the VPC was created. + returned: success + type: str + sample: "2023-08-20T19:39:20+00:00" + region: + description: The region the VPC is located in. + returned: success + type: str + sample: ewr +""" + +from ansible.module_utils.basic import AnsibleModule + +from ..module_utils.vultr_v2 import AnsibleVultr, vultr_argument_spec + + +def main(): + argument_spec = vultr_argument_spec() + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + ) + + vultr = AnsibleVultr( + module=module, + namespace="vultr_vpc2_info", + resource_path="/vpc2", + ressource_result_key_singular="vpc", + ) + + vultr.get_result(vultr.query_list()) + + +if __name__ == "__main__": + main() diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/_reset_cloud/aliases b/ansible_collections/vultr/cloud/tests/integration/targets/_reset_cloud/aliases new file mode 100644 index 000000000..8a729dddd --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/_reset_cloud/aliases @@ -0,0 +1,2 @@ +cloud/vultr +needs/target/cleanup diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/_reset_cloud/tasks/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/_reset_cloud/tasks/main.yml new file mode 100644 index 000000000..39bfc64b3 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/_reset_cloud/tasks/main.yml @@ -0,0 +1,4 @@ +--- +- ansible.builtin.import_role: + name: cleanup + tasks_from: cleanup_all diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/aliases b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/aliases new file mode 100644 index 000000000..c749ce7ca --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/aliases @@ -0,0 +1,3 @@ +cloud/vultr +needs/target/common +needs/target/cleanup diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/defaults/main.yml new file mode 100644 index 000000000..796d8b9f2 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/defaults/main.yml @@ -0,0 +1,46 @@ +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +vultr_bare_metal_ssh_key_name: "{{ vultr_resource_prefix }}_bare_metal_sshkey" +vultr_bare_metal_ssh_key: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAyWYItY+3w5b8PdGRoz0oY5mufqydW96naE+VM3JSvJFAUS08rAjQQpQ03ymoALeHQy6JVZbcgecxn6p0pAOINQdqufn4udPtOPCtMjNiPGpkSM9ah/6X5+kvyWMNrvlf+Ld4OOoszP5sAkgQzIbrFQAm41XknBUha0zkewZwfrVhain4pnDjV7wCcChId/Q/Gbi4xMtXkisznWcAJcueBs3EEZDKhJ5q0VeWSJEhYJDLFN1sOxF0AIUnMrOhfKQ/LjgREXPB6uCl899INUTXRNNjRpeMXyJ2wMMmOAbua2qEd1r13Bu1n+6A823Hzb33fyMXuqWnJwBJ4DCvMlGuEsfuOK+xk7DaBfLHbcM6fsPk0/4psTE6YLgC41remr6+u5ZWsY/faMtSnNPie8Z8Ov0DIYGdhbJjUXk1HomxRV9+ZfZ2Ob8iCwlaAQAyEUM6fs3Kxt8pBD8dx1HOkhsfBWPvuDr5y+kqE7H8/MuPDTc0QgH2pjUMpmw/XBwNDHshVEjrZvtICOjOLUJxcowLO1ivNYwPwowQxfisMy56LfYdjsOslBiqsrkAqvNGm1zu8wKHeqVN9w5l3yUELpvubfm9NKIvYcl6yWF36T0c5vE+g0DU/Jy4XpTj0hZG9QV2mRQcLJnd2pxQtJT7cPFtrn/+tgRxzjEtbDXummDV4sE= ansible@example.com" + +vultr_bare_metals: + - label: "{{ vultr_resource_prefix }}_bm1" + hostname: myhostname + user_data: | + #cloud-config + packages: + - htop + user_data_update: | + #cloud-config + packages: + - htop + - vim + plan: vbm-6c-32gb + plan_update: vbm-6c-32gb + ssh_keys: + - "{{ vultr_bare_metal_ssh_key_name }}" + tags: + - one + - two + tags_update: + - three + - four + region: ams + os: Debian 12 x64 (bookworm) + enable_ipv6: false + enable_ipv6_update: true + # vpc2s: + # - "{{ vultr_resource_prefix }}_instance_vpc2_1" + # vpc2s_update: + # - "{{ vultr_resource_prefix }}_instance_vpc2_2" + +vutr_bare_metal_vpc2s: [] + # - description: "{{ vultr_resource_prefix }}_instance_vpc2_1" + # subnet: 192.168.42.0 + # cidr: 24 + # region: ams + # - description: "{{ vultr_resource_prefix }}_instance_vpc2_2" + # subnet: 192.168.23.0 + # cidr: 24 + # region: ams diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/meta/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/meta/main.yml new file mode 100644 index 000000000..2083f0e12 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - common diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/absent.yml b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/absent.yml new file mode 100644 index 000000000..bee8df6f9 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/absent.yml @@ -0,0 +1,38 @@ +--- +- name: bare metal info + ansible.builtin.debug: + var: bare_metal + +- name: test absent bare metal in check mode + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + region: "{{ bare_metal.region }}" + state: absent + register: result + check_mode: true +- name: verify test absent bare metal in check mode + ansible.builtin.assert: + that: + - result is changed + +- name: test absent bare metal + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + region: "{{ bare_metal.region }}" + state: absent + register: result +- name: verify test absent bare metal + ansible.builtin.assert: + that: + - result is changed + +- name: test absent bare metal idempotence + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + region: "{{ bare_metal.region }}" + state: absent + register: result +- name: verify test absent bare metal idempotence + ansible.builtin.assert: + that: + - result is not changed diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/failures.yml b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/failures.yml new file mode 100644 index 000000000..769dbe02b --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/failures.yml @@ -0,0 +1,55 @@ +--- +- name: test fail if missing arguments + vultr.cloud.bare_metal: + register: result + ignore_errors: true +- name: verify test fail if missing arguments + ansible.builtin.assert: + that: + - result is failed + - 'result.msg == "missing required arguments: label, region"' + +- name: test fail if missing arguments required one of + vultr.cloud.bare_metal: + label: my label + plan: a plan + region: a region + register: result + ignore_errors: true +- name: verify test fail if missing arguments required one of + ansible.builtin.assert: + that: + - result is failed + - '"one of the following required" in result.msg' + +- name: test fail if ssh key not found + vultr.cloud.bare_metal: + label: my label + plan: a plan + region: a region + os: Debian 12 x64 (bookworm) + ssh_keys: + - does-not-exist + register: result + ignore_errors: true +- name: verify test fail if ssh key not found + ansible.builtin.assert: + that: + - result is failed + - '"SSH key names not found: does-not-exist" in result.msg' + +- name: test fail if vpc not found + vultr.cloud.bare_metal: + label: my label + plan: a plan + region: a region + os: Debian 12 x64 (bookworm) + vpc2s: + - does-not-exist + register: result + ignore_errors: true +- name: verify test fail if vpc not found + ansible.builtin.assert: + that: + - result is failed + - '"VPCs (v2) not found: does-not-exist" in result.msg' diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/main.yml new file mode 100644 index 000000000..856d7e307 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/main.yml @@ -0,0 +1,13 @@ +--- +- block: + - ansible.builtin.import_tasks: tests.yml + always: + - ansible.builtin.import_role: + name: cleanup + tasks_from: cleanup_bare_metal + - ansible.builtin.import_role: + name: cleanup + tasks_from: cleanup_ssh_key + - ansible.builtin.import_role: + name: cleanup + tasks_from: cleanup_vpc2 diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/present.yml b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/present.yml new file mode 100644 index 000000000..e3915ee45 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/present.yml @@ -0,0 +1,152 @@ +--- +- name: bare_metal info + ansible.builtin.debug: + var: bare_metal + +- name: test create bare_metal in check mode + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + hostname: "{{ bare_metal.hostname | default(omit) }}" + user_data: "{{ bare_metal.user_data | default(omit) }}" + ssh_keys: "{{ bare_metal.ssh_keys | default(omit) }}" + plan: "{{ bare_metal.plan }}" + enable_ipv6: "{{ bare_metal.enable_ipv6 | default(omit) }}" + tags: "{{ bare_metal.tags | default(omit) }}" + region: "{{ bare_metal.region }}" + os: "{{ bare_metal.os | default(omit) }}" + app: "{{ bare_metal.app | default(omit) }}" + image: "{{ bare_metal.image | default(omit) }}" + snapshot: "{{ bare_metal.snapshot | default(omit) }}" + vpc2s: "{{ bare_metal.vpc2s | default(omit) }}" + register: result + check_mode: true +- name: verify test create bare_metal in check mode + ansible.builtin.assert: + that: + - result is changed + +- name: test create bare_metal + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + hostname: "{{ bare_metal.hostname | default(omit) }}" + user_data: "{{ bare_metal.user_data | default(omit) }}" + ssh_keys: "{{ bare_metal.ssh_keys | default(omit) }}" + plan: "{{ bare_metal.plan }}" + enable_ipv6: "{{ bare_metal.enable_ipv6 | default(omit) }}" + tags: "{{ bare_metal.tags | default(omit) }}" + region: "{{ bare_metal.region }}" + os: "{{ bare_metal.os | default(omit) }}" + app: "{{ bare_metal.app | default(omit) }}" + image: "{{ bare_metal.image | default(omit) }}" + snapshot: "{{ bare_metal.snapshot | default(omit) }}" + vpc2s: "{{ bare_metal.vpc2s | default(omit) }}" + register: result +- name: verify test create bare_metal + ansible.builtin.assert: + that: + - result is changed + - result.vultr_bare_metal.plan == bare_metal.plan + - result.vultr_bare_metal.region == bare_metal.region + - result.vultr_bare_metal.enable_ipv6 == bare_metal.enable_ipv6 + # - result.vultr_bare_metal.vpc2s | selectattr('description','equalto','{{ vultr_resource_prefix }}_bare_metal_vpc2_1') | list | count == 1 + +- name: test create bare_metal idempotence + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + hostname: "{{ bare_metal.hostname | default(omit) }}" + user_data: "{{ bare_metal.user_data | default(omit) }}" + ssh_keys: "{{ bare_metal.ssh_keys | default(omit) }}" + plan: "{{ bare_metal.plan }}" + enable_ipv6: "{{ bare_metal.enable_ipv6 | default(omit) }}" + tags: "{{ bare_metal.tags | default(omit) }}" + region: "{{ bare_metal.region }}" + os: "{{ bare_metal.os | default(omit) }}" + app: "{{ bare_metal.app | default(omit) }}" + image: "{{ bare_metal.image | default(omit) }}" + snapshot: "{{ bare_metal.snapshot | default(omit) }}" + vpc2s: "{{ bare_metal.vpc2s | default(omit) }}" + register: result +- name: verify test create bare_metal idempotence + ansible.builtin.assert: + that: + - result is not changed + - result.vultr_bare_metal.plan == bare_metal.plan + - result.vultr_bare_metal.region == bare_metal.region + - result.vultr_bare_metal.enable_ipv6 == bare_metal.enable_ipv6 + # - result.vultr_bare_metal.vpc2s | selectattr('description','equalto','{{ vultr_resource_prefix }}_bare_metal_vpc2_1') | list | count == 1 + +- name: test update bare_metal in check mode + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + hostname: "{{ bare_metal.hostname | default(omit) }}" + user_data: "{{ bare_metal.user_data_update | default(omit) }}" + ssh_keys: "{{ bare_metal.ssh_keys | default(omit) }}" + plan: "{{ bare_metal.plan_update }}" + enable_ipv6: "{{ bare_metal.enable_ipv6_update | default(omit) }}" + tags: "{{ bare_metal.tags_update | default(omit) }}" + region: "{{ bare_metal.region }}" + os: "{{ bare_metal.os | default(omit) }}" + app: "{{ bare_metal.app | default(omit) }}" + image: "{{ bare_metal.image | default(omit) }}" + snapshot: "{{ bare_metal.snapshot | default(omit) }}" + vpc2s: "{{ bare_metal.vpc2s_update | default(omit) }}" + register: result + check_mode: true +- name: verify test update bare_metal in check mode + ansible.builtin.assert: + that: + - result is changed + - result.vultr_bare_metal.plan == bare_metal.plan + - result.vultr_bare_metal.region == bare_metal.region + - result.vultr_bare_metal.enable_ipv6 == bare_metal.enable_ipv6 + # - result.vultr_bare_metal.vpc2s | selectattr('description','equalto','{{ vultr_resource_prefix }}_bare_metal_vpc2_2') | list | count == 1 + +- name: test update bare_metal + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + hostname: "{{ bare_metal.hostname | default(omit) }}" + user_data: "{{ bare_metal.user_data_update | default(omit) }}" + ssh_keys: "{{ bare_metal.ssh_keys | default(omit) }}" + plan: "{{ bare_metal.plan_update }}" + enable_ipv6: "{{ bare_metal.enable_ipv6_update | default(omit) }}" + tags: "{{ bare_metal.tags_update | default(omit) }}" + region: "{{ bare_metal.region }}" + os: "{{ bare_metal.os | default(omit) }}" + app: "{{ bare_metal.app | default(omit) }}" + image: "{{ bare_metal.image | default(omit) }}" + snapshot: "{{ bare_metal.snapshot | default(omit) }}" + vpc2s: "{{ bare_metal.vpc2s_update | default(omit) }}" + register: result +- name: verify test update bare_metal + ansible.builtin.assert: + that: + - result is changed + - result.vultr_bare_metal.plan == bare_metal.plan_update + - result.vultr_bare_metal.region == bare_metal.region + - result.vultr_bare_metal.enable_ipv6 == bare_metal.enable_ipv6_update + # - result.vultr_bare_metal.vpc2s | selectattr('description','equalto','{{ vultr_resource_prefix }}_bare_metal_vpc2_2') | list | count == 1 + +- name: test update bare_metal idempotence + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + hostname: "{{ bare_metal.hostname | default(omit) }}" + user_data: "{{ bare_metal.user_data_update | default(omit) }}" + ssh_keys: "{{ bare_metal.ssh_keys | default(omit) }}" + plan: "{{ bare_metal.plan_update }}" + enable_ipv6: "{{ bare_metal.enable_ipv6_update | default(omit) }}" + tags: "{{ bare_metal.tags_update | default(omit) }}" + region: "{{ bare_metal.region }}" + os: "{{ bare_metal.os | default(omit) }}" + app: "{{ bare_metal.app | default(omit) }}" + image: "{{ bare_metal.image | default(omit) }}" + snapshot: "{{ bare_metal.snapshot | default(omit) }}" + vpc2s: "{{ bare_metal.vpc2s_update | default(omit) }}" + register: result +- name: verify test update bare_metal idempotence + ansible.builtin.assert: + that: + - result is not changed + - result.vultr_bare_metal.plan == bare_metal.plan_update + - result.vultr_bare_metal.region == bare_metal.region + - result.vultr_bare_metal.enable_ipv6 == bare_metal.enable_ipv6_update + # - result.vultr_bare_metal.vpc2s | selectattr('description','equalto','{{ vultr_resource_prefix }}_bare_metal_vpc2_2') | list | count == 1 diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/tests.yml new file mode 100644 index 000000000..1f061896a --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/bare_metal/tasks/tests.yml @@ -0,0 +1,52 @@ +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +- name: setup + vultr.cloud.bare_metal: + label: "{{ bare_metal.label }}" + region: "{{ bare_metal.region }}" + state: absent + with_items: "{{ vultr_bare_metals }}" + loop_control: + loop_var: bare_metal + +- ansible.builtin.import_tasks: failures.yml + +# - name: setup ssh key +# vultr.cloud.ssh_key: +# name: "{{ vultr_bare_metal_ssh_key_name }}" +# ssh_key: "{{ vultr_bare_metal_ssh_key }}" + +# - name: setup vpc2s +# vultr.cloud.vpc2: +# description: "{{ item.description }}" +# ip_block: "{{ item.subnet }}" +# prefix_length: "{{ item.cidr }}" +# region: "{{ item.region }}" +# with_items: "{{ vutr_bare_metal_vpc2s }}" + +# - ansible.builtin.include_tasks: present.yml +# with_items: "{{ vultr_bare_metals }}" +# loop_control: +# loop_var: bare_metal + +# - ansible.builtin.include_tasks: absent.yml +# with_items: "{{ vultr_bare_metals }}" +# loop_control: +# loop_var: bare_metal + +# - name: cleanup ssh key +# vultr.cloud.ssh_key: +# name: "{{ vultr_bare_metal_ssh_key_name }}" +# state: absent + +# - name: cleanup vpc2s +# vultr.cloud.vpc: +# description: "{{ item.description }}" +# region: "{{ item.region }}" +# state: absent +# with_items: "{{ vutr_bare_metal_vpc2s }}" +# retries: 5 +# delay: 3 +# register: result +# until: result is not failed diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/block_storage_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/block_storage_info/tasks/tests.yml index 2f836ea09..40e599378 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/block_storage_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/block_storage_info/tasks/tests.yml @@ -19,7 +19,7 @@ - name: verify test gather vultr block storage volume info in check mode ansible.builtin.assert: that: - - result.vultr_block_storage_info|selectattr('label','equalto','{{ vultr_block_storage_name }}') | list | count == 1 + - result.vultr_block_storage_info|selectattr('label','equalto',vultr_block_storage_name) | list | count == 1 - name: test gather vultr block storage volume info vultr.cloud.block_storage_info: @@ -28,7 +28,7 @@ - name: verify test gather vultr block storage volume info ansible.builtin.assert: that: - - result.vultr_block_storage_info|selectattr('label','equalto','{{ vultr_block_storage_name }}') | list | count == 1 + - result.vultr_block_storage_info|selectattr('label','equalto',vultr_block_storage_name) | list | count == 1 - name: Delete the block storage volume vultr.cloud.block_storage: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_all.yml b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_all.yml new file mode 100644 index 000000000..b3e84c6f1 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_all.yml @@ -0,0 +1,19 @@ +- set_fact: + vultr_resource_prefix: ansible-test- + +- debug: + msg: Cleaning up resources with prefix {{ vultr_resource_prefix }} + +- ansible.builtin.import_tasks: cleanup_instance.yml +- ansible.builtin.import_tasks: cleanup_bare_metal.yml +- ansible.builtin.import_tasks: cleanup_ssh_key.yml +- ansible.builtin.import_tasks: cleanup_vpc.yml +- ansible.builtin.import_tasks: cleanup_vpc2.yml +- ansible.builtin.import_tasks: cleanup_firewall_group.yml +- ansible.builtin.import_tasks: cleanup_snapshot.yml +- ansible.builtin.import_tasks: cleanup_user.yml +- ansible.builtin.import_tasks: cleanup_dns_domain.yml +- ansible.builtin.import_tasks: cleanup_block_storage.yml +- ansible.builtin.import_tasks: cleanup_startup_script.yml +- ansible.builtin.import_tasks: cleanup_reserved_ip.yml +- ansible.builtin.import_tasks: cleanup_network.yml diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_bare_metal.yml b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_bare_metal.yml new file mode 100644 index 000000000..21c158669 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_bare_metal.yml @@ -0,0 +1,29 @@ +--- +- name: cleanup + when: vultr_api_key + block: + - name: List bare metals + ansible.builtin.uri: + url: "{{ vultr_api_url }}/bare-metals" + headers: + Authorization: Bearer {{ vultr_api_key }} + status_code: 200 + register: res + no_log: true + + - name: Found resources + ansible.builtin.debug: + var: res.json + + - name: Remove all bare metals created by this test run + ansible.builtin.uri: + url: "{{ vultr_api_url }}/bare-metals/{{ item.id }}" + method: "DELETE" + headers: + Authorization: Bearer {{ vultr_api_key }} + status_code: 204 + when: vultr_resource_prefix in item.label + with_items: "{{ res.json.bare_metals }}" + loop_control: + label: "{{ item.label }}" + no_log: true diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_object_storage.yml b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_object_storage.yml new file mode 100644 index 000000000..555aefaf8 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_object_storage.yml @@ -0,0 +1,29 @@ +--- +- name: cleanup + when: vultr_api_key + block: + - name: List object storages + ansible.builtin.uri: + url: "{{ vultr_api_url }}/object-storage" + headers: + Authorization: Bearer {{ vultr_api_key }} + status_code: 200 + register: res + no_log: true + + - name: Found resources + ansible.builtin.debug: + var: res.json + + - name: Remove all object storages created by this test run + ansible.builtin.uri: + url: "{{ vultr_api_url }}/object-storage/{{ item.id }}" + method: "DELETE" + headers: + Authorization: Bearer {{ vultr_api_key }} + status_code: 204 + when: vultr_resource_prefix in item.label + with_items: "{{ res.json.object_storages }}" + loop_control: + label: "{{ item.label }}" + no_log: true diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_vpc2.yml b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_vpc2.yml new file mode 100644 index 000000000..30b002d92 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/cleanup/tasks/cleanup_vpc2.yml @@ -0,0 +1,28 @@ +--- +- name: cleanup + when: vultr_api_key + block: + - name: List vpc2s + ansible.builtin.uri: + url: "{{ vultr_api_url }}/vpc2" + headers: + Authorization: Bearer {{ vultr_api_key }} + status_code: 200 + register: res + no_log: true + + - name: Found resources + ansible.builtin.debug: + var: res.json + + - name: Remove all vpc2s created by this test run + ansible.builtin.uri: + url: "{{ vultr_api_url }}/vpc2/{{ item.id }}" + method: "DELETE" + headers: + Authorization: Bearer {{ vultr_api_key }} + status_code: 204 + when: vultr_resource_prefix in item.description + with_items: "{{ res.json.vpcs }}" + loop_control: + label: "{{ item.description }}" diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/dns_domain_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/dns_domain_info/tasks/tests.yml index f772ab637..3351f14bc 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/dns_domain_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/dns_domain_info/tasks/tests.yml @@ -15,7 +15,7 @@ - name: verify test gather vultr dns domain info in check mode ansible.builtin.assert: that: - - result.vultr_dns_domain_info|selectattr('domain','equalto','{{ dns_domain_name }}') | list | count == 1 + - result.vultr_dns_domain_info|selectattr('domain','equalto',dns_domain_name) | list | count == 1 - name: test gather vultr dns domain info vultr.cloud.dns_domain_info: @@ -24,4 +24,4 @@ - name: verify test gather vultr dns domain info ansible.builtin.assert: that: - - result.vultr_dns_domain_info|selectattr('domain','equalto','{{ dns_domain_name }}') | list | count == 1 + - result.vultr_dns_domain_info|selectattr('domain','equalto',dns_domain_name) | list | count == 1 diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/defaults/main.yml index e979dc89b..7e548fca3 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/defaults/main.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/defaults/main.yml @@ -5,11 +5,18 @@ vultr_dns_domain_name: "{{ vultr_resource_prefix }}-t3-vultr.com" vultr_dns_record_items: # Single A record - - name: test-www + - name: test-www-ip data: 10.10.10.10 ttl: 400 update_data: 10.10.10.11 - update_ttl: 200 + update_ttl: 400 + + # # Single A record + # - name: test-www-ttl + # data: 10.10.10.10 + # ttl: 400 + # update_data: 10.10.10.10 + # update_ttl: 200 # Multiple A records - name: test-www-multiple diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/create_record.yml b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/create_record.yml index 39964c138..409c1119a 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/create_record.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/create_record.yml @@ -36,11 +36,11 @@ ansible.builtin.assert: that: - result is changed - - result.vultr_dns_record.data == "{{ item.data }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.ttl == {{ item.ttl | default(300) }} - - result.vultr_dns_record.priority == {{ item.priority | default(-1) }} + - result.vultr_dns_record.data == item.data + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.ttl == item.ttl | default(300) + - result.vultr_dns_record.priority == item.priority | default(-1) - name: test create a dns record idempotence vultr.cloud.dns_record: @@ -55,8 +55,8 @@ ansible.builtin.assert: that: - result is not changed - - result.vultr_dns_record.data == "{{ item.data }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.ttl == {{ item.ttl | default(300) }} - - result.vultr_dns_record.priority == {{ item.priority | default(-1) }} + - result.vultr_dns_record.data == item.data + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.ttl == item.ttl | default(300) + - result.vultr_dns_record.priority == item.priority | default(-1) diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/remove_record.yml b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/remove_record.yml index 1207ea250..f3c33ac09 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/remove_record.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/remove_record.yml @@ -15,11 +15,11 @@ ansible.builtin.assert: that: - result is changed - - result.vultr_dns_record.data == "{{ item.update_data | default(item.data) }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.ttl == {{ item.update_ttl | default(300) }} - - result.vultr_dns_record.priority == {{ item.update_priority | default(item.priority | default(-1)) }} + - result.vultr_dns_record.data == item.update_data | default(item.data) + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.ttl == item.update_ttl | default(300) + - result.vultr_dns_record.priority == item.update_priority | default(item.priority | default(-1)) - name: test remove second dns record in check mode vultr.cloud.dns_record: @@ -36,11 +36,11 @@ ansible.builtin.assert: that: - result is changed - - result.vultr_dns_record.data == "{{ item.data | default(item.data) }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.ttl == {{ item.ttl | default(300) }} - - result.vultr_dns_record.priority == {{ item.priority | default(-1) }} + - result.vultr_dns_record.data == item.data | default(item.data) + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.ttl == item.ttl | default(300) + - result.vultr_dns_record.priority == item.priority | default(-1) when: item.multiple is defined and item.multiple == true - name: test remove a dns record @@ -56,11 +56,11 @@ ansible.builtin.assert: that: - result is changed - - result.vultr_dns_record.data == "{{ item.update_data | default(item.data) }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.ttl == {{ item.update_ttl | default(300) }} - - result.vultr_dns_record.priority == {{ item.update_priority | default(item.priority | default(-1)) }} + - result.vultr_dns_record.data == item.update_data | default(item.data) + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.ttl == item.update_ttl | default(300) + - result.vultr_dns_record.priority == item.update_priority | default(item.priority | default(-1)) - name: test remove second dns record vultr.cloud.dns_record: @@ -76,11 +76,11 @@ ansible.builtin.assert: that: - result is changed - - result.vultr_dns_record.data == "{{ item.data }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.ttl == {{ item.ttl | default(300) }} - - result.vultr_dns_record.priority == {{ item.priority | default(-1) }} + - result.vultr_dns_record.data == item.data + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.ttl == item.ttl | default(300) + - result.vultr_dns_record.priority == item.priority | default(-1) when: item.multiple is defined and item.multiple == true - name: test remove a dns record idempotence diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/update_record.yml b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/update_record.yml index f79beccf5..ad53333cb 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/update_record.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/dns_record/tasks/update_record.yml @@ -16,11 +16,11 @@ ansible.builtin.assert: that: - result is changed - - result.vultr_dns_record.data == "{{ item.data }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.ttl == {{ item.ttl | default(300) }} - - result.vultr_dns_record.priority == {{ item.priority | default(-1) }} + - result.vultr_dns_record.data == item.data + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.ttl == item.ttl | default(300) + - result.vultr_dns_record.priority == item.priority | default(-1) when: item.multiple is undefined or item.multiple == false - name: verify test add another dns record in check mode ansible.builtin.assert: @@ -43,11 +43,11 @@ ansible.builtin.assert: that: - result is changed - - result.vultr_dns_record.data == "{{ item.update_data | default(item.data) }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.ttl == {{ item.update_ttl | default(300) }} - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.priority == {{ item.update_priority | default(-1) }} + - result.vultr_dns_record.data == item.update_data | default(item.data) + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.ttl == item.update_ttl | default(300) + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.priority == item.update_priority | default(-1) - name: test update or add another dns record idempotence vultr.cloud.dns_record: @@ -63,8 +63,8 @@ ansible.builtin.assert: that: - result is not changed - - result.vultr_dns_record.data == "{{ item.update_data | default(item.data) }}" - - result.vultr_dns_record.name == "{{ item.name | default("") }}" - - result.vultr_dns_record.ttl == {{ item.update_ttl | default(300) }} - - result.vultr_dns_record.type == "{{ item.record_type | default('A') }}" - - result.vultr_dns_record.priority == {{ item.update_priority | default(-1) }} + - result.vultr_dns_record.data == item.update_data | default(item.data) + - result.vultr_dns_record.name == item.name | default('') + - result.vultr_dns_record.ttl == item.update_ttl | default(300) + - result.vultr_dns_record.type == item.record_type | default('A') + - result.vultr_dns_record.priority == item.update_priority | default(-1) diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_group_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_group_info/tasks/tests.yml index 390150418..866d9ed74 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_group_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_group_info/tasks/tests.yml @@ -17,7 +17,7 @@ - name: verify test gather vultr firewall group info in check mode ansible.builtin.assert: that: - - result.vultr_firewall_group_info|selectattr('description','equalto','{{ firewall_group_name }}') | list | count == 1 + - result.vultr_firewall_group_info|selectattr('description','equalto',firewall_group_name) | list | count == 1 - name: test gather vultr firewall group info vultr.cloud.firewall_group_info: @@ -26,7 +26,7 @@ - name: verify test gather vultr firewall group info ansible.builtin.assert: that: - - result.vultr_firewall_group_info|selectattr('description','equalto','{{ firewall_group_name }}') | list | count == 1 + - result.vultr_firewall_group_info|selectattr('description','equalto',firewall_group_name) | list | count == 1 - name: Delete the firewall group vultr.cloud.firewall_group: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/defaults/main.yml index 7e96b1f83..f3695f8b3 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/defaults/main.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/defaults/main.yml @@ -33,6 +33,9 @@ vultr_firewall_rules: protocol: icmp subnet: "0.0.0.0" subnet_size: 0 + # Port should be ignored, but should show a warning + port: "7" + port_assert: "" - notes: web app port: "8000:8080" diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_absent.yml b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_absent.yml index a8fe6f60a..4f16e2a11 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_absent.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_absent.yml @@ -19,11 +19,11 @@ that: - result is changed - result.vultr_firewall_rule.action == "accept" - - result.vultr_firewall_rule.protocol == "{{ rule.protocol | default('tcp') }}" - - result.vultr_firewall_rule.port == "{{ rule.port | default('') }}" - - result.vultr_firewall_rule.subnet == "{{ rule.subnet | default('') }}" - - result.vultr_firewall_rule.subnet_size == {{ rule.subnet_size | default(0) }} - - result.vultr_firewall_rule.ip_type == "{{ rule.ip_type | default('v4') }}" + - result.vultr_firewall_rule.protocol == rule.protocol | default('tcp') + - result.vultr_firewall_rule.port == rule.port_assert | default(rule.port | default('')) + - result.vultr_firewall_rule.subnet == rule.subnet | default('') + - result.vultr_firewall_rule.subnet_size == rule.subnet_size | default(0) + - result.vultr_firewall_rule.ip_type == rule.ip_type | default('v4') - name: test absent firewall rule vultr.cloud.firewall_rule: @@ -40,11 +40,11 @@ that: - result is changed - result.vultr_firewall_rule.action == "accept" - - result.vultr_firewall_rule.protocol == "{{ rule.protocol | default('tcp') }}" - - result.vultr_firewall_rule.port == "{{ rule.port | default('') }}" - - result.vultr_firewall_rule.subnet == "{{ rule.subnet | default('') }}" - - result.vultr_firewall_rule.subnet_size == {{ rule.subnet_size | default(0) }} - - result.vultr_firewall_rule.ip_type == "{{ rule.ip_type | default('v4') }}" + - result.vultr_firewall_rule.protocol == rule.protocol | default('tcp') + - result.vultr_firewall_rule.port == rule.port_assert | default(rule.port | default('')) + - result.vultr_firewall_rule.subnet == rule.subnet | default('') + - result.vultr_firewall_rule.subnet_size == rule.subnet_size | default(0) + - result.vultr_firewall_rule.ip_type == rule.ip_type | default('v4') - name: test absent firewall rule idempotence vultr.cloud.firewall_rule: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_present.yml b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_present.yml index 9093b6aaf..f6ba9c4e4 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_present.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule/tasks/rule_present.yml @@ -34,11 +34,11 @@ that: - result is changed - result.vultr_firewall_rule.action == "accept" - - result.vultr_firewall_rule.protocol == "{{ rule.protocol | default('tcp') }}" - - result.vultr_firewall_rule.port == "{{ rule.port | default('') }}" - - result.vultr_firewall_rule.subnet == "{{ rule.subnet | default('') }}" - - result.vultr_firewall_rule.subnet_size == {{ rule.subnet_size | default(0) }} - - result.vultr_firewall_rule.ip_type == "{{ rule.ip_type | default('v4') }}" + - result.vultr_firewall_rule.protocol == rule.protocol | default('tcp') + - result.vultr_firewall_rule.port == rule.port_assert | default(rule.port | default('')) + - result.vultr_firewall_rule.subnet == rule.subnet | default('') + - result.vultr_firewall_rule.subnet_size == rule.subnet_size | default(0) + - result.vultr_firewall_rule.ip_type == rule.ip_type | default('v4') - name: test create firewall rule idempotence vultr.cloud.firewall_rule: @@ -55,8 +55,8 @@ that: - result is not changed - result.vultr_firewall_rule.action == "accept" - - result.vultr_firewall_rule.protocol == "{{ rule.protocol | default('tcp') }}" - - result.vultr_firewall_rule.port == "{{ rule.port | default('') }}" - - result.vultr_firewall_rule.subnet == "{{ rule.subnet | default('') }}" - - result.vultr_firewall_rule.subnet_size == {{ rule.subnet_size | default(0) }} - - result.vultr_firewall_rule.ip_type == "{{ rule.ip_type | default('v4') }}" + - result.vultr_firewall_rule.protocol == rule.protocol | default('tcp') + - result.vultr_firewall_rule.port == rule.port_assert | default(rule.port | default('')) + - result.vultr_firewall_rule.subnet == rule.subnet | default('') + - result.vultr_firewall_rule.subnet_size == rule.subnet_size | default(0) + - result.vultr_firewall_rule.ip_type == rule.ip_type | default('v4') diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule_info/tasks/tests.yml index 96bca9803..a8cdf0eb0 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/firewall_rule_info/tasks/tests.yml @@ -28,7 +28,7 @@ - name: verify test gather vultr firewall rule info in check mode ansible.builtin.assert: that: - - result.vultr_firewall_rule_info|selectattr('notes','equalto','{{ firewall_group_name }}') | list | count == 1 + - result.vultr_firewall_rule_info|selectattr('notes','equalto',firewall_group_name) | list | count == 1 - name: test gather vultr firewall rule info vultr.cloud.firewall_rule_info: @@ -37,7 +37,7 @@ - name: verify test gather vultr firewall rule info ansible.builtin.assert: that: - - result.vultr_firewall_rule_info|selectattr('notes','equalto','{{ firewall_group_name }}') | list | count == 1 + - result.vultr_firewall_rule_info|selectattr('notes','equalto',firewall_group_name) | list | count == 1 - name: Delete the firewall group vultr.cloud.firewall_group: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/instance/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/instance/defaults/main.yml index 6683b5e85..dd280e9cf 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/instance/defaults/main.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/instance/defaults/main.yml @@ -7,6 +7,10 @@ vultr_instance_ssh_key: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAyWYItY+3w5b8PdGRoz0 vutr_instance_vpcs: - description: "{{ vultr_resource_prefix }}_instance_vpc_1" + v4_subnet: 192.168.24.0 + v4_subnet_mask: 24 + region: ewr + - description: "{{ vultr_resource_prefix }}_instance_vpc_1" v4_subnet: 192.168.42.0 v4_subnet_mask: 24 region: ams @@ -42,13 +46,14 @@ vultr_instances: - three - four region: ams - os: Debian 11 x64 (bullseye) + os: Debian 12 x64 (bookworm) backups: true backups_update: false ddos_protection: true ddos_protection_update: false enable_ipv6: false enable_ipv6_update: true + user_scheme: limited vpcs: - "{{ vultr_resource_prefix }}_instance_vpc_1" - "{{ vultr_resource_prefix }}_instance_vpc_2" diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/failures.yml b/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/failures.yml index f22616901..3ce2c9e18 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/failures.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/failures.yml @@ -52,4 +52,4 @@ ansible.builtin.assert: that: - result is failed - - '"VPCs not found: does-not-exist" in result.msg' + - '"VPCs (v1) not found: does-not-exist" in result.msg' diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/present.yml b/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/present.yml index 004a9c732..b82e1226f 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/present.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/instance/tasks/present.yml @@ -46,6 +46,7 @@ image: "{{ instance.image | default(omit) }}" snapshot: "{{ instance.snapshot | default(omit) }}" vpcs: "{{ instance.vpcs | default(omit) }}" + user_scheme: "{{ instance.user_scheme | default(omit) }}" register: result - name: verify test create instance ansible.builtin.assert: @@ -53,12 +54,13 @@ - result is changed - result.vultr_instance.plan == instance.plan - result.vultr_instance.region == instance.region - - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" + # - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" - result.vultr_instance.ddos_protection == instance.ddos_protection - result.vultr_instance.enable_ipv6 == instance.enable_ipv6 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_1') | list | count == 1 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_2') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_1') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_2') | list | count == 1 - result.vultr_instance.vpcs | list | count == 2 + - result.vultr_instance.user_scheme == instance.user_scheme | default('root') - name: test create instance idempotence vultr.cloud.instance: @@ -78,6 +80,7 @@ image: "{{ instance.image | default(omit) }}" snapshot: "{{ instance.snapshot | default(omit) }}" vpcs: "{{ instance.vpcs | default(omit) }}" + user_scheme: "{{ instance.user_scheme | default(omit) }}" register: result - name: verify test create instance idempotence ansible.builtin.assert: @@ -85,12 +88,13 @@ - result is not changed - result.vultr_instance.plan == instance.plan - result.vultr_instance.region == instance.region - - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" + # - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" - result.vultr_instance.ddos_protection == instance.ddos_protection - result.vultr_instance.enable_ipv6 == instance.enable_ipv6 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_1') | list | count == 1 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_2') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_1') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_2') | list | count == 1 - result.vultr_instance.vpcs | list | count == 2 + - result.vultr_instance.user_scheme == instance.user_scheme | default('root') - name: test update instance in check mode vultr.cloud.instance: @@ -110,6 +114,7 @@ image: "{{ instance.image | default(omit) }}" snapshot: "{{ instance.snapshot | default(omit) }}" vpcs: "{{ instance.vpcs_update | default(omit) }}" + user_scheme: "{{ instance.user_scheme | default(omit) }}" register: result check_mode: true - name: verify test update instance in check mode @@ -118,12 +123,13 @@ - result is changed - result.vultr_instance.plan == instance.plan - result.vultr_instance.region == instance.region - - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" + # - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" - result.vultr_instance.ddos_protection == instance.ddos_protection - result.vultr_instance.enable_ipv6 == instance.enable_ipv6 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_1') | list | count == 1 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_2') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_1') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_2') | list | count == 1 - result.vultr_instance.vpcs | list | count == 2 + - result.vultr_instance.user_scheme == instance.user_scheme | default('root') - name: test update instance vultr.cloud.instance: @@ -143,6 +149,7 @@ image: "{{ instance.image | default(omit) }}" snapshot: "{{ instance.snapshot | default(omit) }}" vpcs: "{{ instance.vpcs_update | default(omit) }}" + user_scheme: "{{ instance.user_scheme | default(omit) }}" register: result - name: verify test update instance ansible.builtin.assert: @@ -150,12 +157,13 @@ - result is changed - result.vultr_instance.plan == instance.plan_update - result.vultr_instance.region == instance.region - - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups_update else 'disabled' }}'" + # - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" - result.vultr_instance.ddos_protection == instance.ddos_protection_update - result.vultr_instance.enable_ipv6 == instance.enable_ipv6_update - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_1') | list | count == 1 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_3') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_1') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_3') | list | count == 1 - result.vultr_instance.vpcs | list | count == 2 + - result.vultr_instance.user_scheme == instance.user_scheme | default('root') - name: test update instance idempotence vultr.cloud.instance: @@ -175,6 +183,7 @@ image: "{{ instance.image | default(omit) }}" snapshot: "{{ instance.snapshot | default(omit) }}" vpcs: "{{ instance.vpcs_update | default(omit) }}" + user_scheme: "{{ instance.user_scheme | default(omit) }}" register: result - name: verify test update instance idempotence ansible.builtin.assert: @@ -182,9 +191,10 @@ - result is not changed - result.vultr_instance.plan == instance.plan_update - result.vultr_instance.region == instance.region - - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups_update else 'disabled' }}'" + # - "result.vultr_instance.backups == '{{ 'enabled' if instance.backups else 'disabled' }}'" - result.vultr_instance.ddos_protection == instance.ddos_protection_update - result.vultr_instance.enable_ipv6 == instance.enable_ipv6_update - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_1') | list | count == 1 - - result.vultr_instance.vpcs | selectattr('description','equalto','{{ vultr_resource_prefix }}_instance_vpc_3') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_1') | list | count == 1 + - result.vultr_instance.vpcs | selectattr('description','equalto',vultr_resource_prefix ~ '_instance_vpc_3') | list | count == 1 - result.vultr_instance.vpcs | list | count == 2 + - result.vultr_instance.user_scheme == instance.user_scheme | default('root') diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/instance_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/instance_info/tasks/tests.yml index 204d071af..511d36dee 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/instance_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/instance_info/tasks/tests.yml @@ -21,8 +21,8 @@ - name: verify test gather vultr instance info in check mode ansible.builtin.assert: that: - - result.vultr_instance_info|selectattr('label','search','^{{ vultr_resource_prefix }}') | list | count == 2 - - result.vultr_instance_info|selectattr('label','equalto','{{ vultr_resource_prefix }}_info1') | list | count == 1 + - result.vultr_instance_info|selectattr('label','search','^' ~ vultr_resource_prefix) | list | count == 2 + - result.vultr_instance_info|selectattr('label','equalto',vultr_resource_prefix ~ '_info1') | list | count == 1 - name: test gather vultr instance info vultr.cloud.instance_info: @@ -30,8 +30,8 @@ - name: verify test gather vultr instance info ansible.builtin.assert: that: - - result.vultr_instance_info|selectattr('label','search','^{{ vultr_resource_prefix }}') | list | count == 2 - - result.vultr_instance_info|selectattr('label','equalto','{{ vultr_resource_prefix }}_info1') | list | count == 1 + - result.vultr_instance_info|selectattr('label','search','^' ~ vultr_resource_prefix) | list | count == 2 + - result.vultr_instance_info|selectattr('label','equalto',vultr_resource_prefix ~ '_info1') | list | count == 1 - name: test gather vultr instance info filter region vultr.cloud.instance_info: @@ -40,7 +40,7 @@ - name: verify test gather vultr instance info filter region ansible.builtin.assert: that: - - result.vultr_instance_info|selectattr('label','search','^{{ vultr_resource_prefix }}') | list | count == 1 + - result.vultr_instance_info|selectattr('label','search','^' ~ vultr_resource_prefix) | list | count == 1 - name: test gather vultr instance info filter label vultr.cloud.instance_info: @@ -49,8 +49,8 @@ - name: verify test gather vultr instance info ansible.builtin.assert: that: - - result.vultr_instance_info|selectattr('label','search','^{{ vultr_resource_prefix }}') | list | count == 1 - - result.vultr_instance_info|selectattr('label','equalto','{{ vultr_resource_prefix }}_info2') | list | count == 1 + - result.vultr_instance_info|selectattr('label','search','^' ~ vultr_resource_prefix) | list | count == 1 + - result.vultr_instance_info|selectattr('label','equalto',vultr_resource_prefix ~ '_info2') | list | count == 1 - name: cleanup vultr.cloud.instance: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/aliases b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/aliases new file mode 100644 index 000000000..c749ce7ca --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/aliases @@ -0,0 +1,3 @@ +cloud/vultr +needs/target/common +needs/target/cleanup diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/defaults/main.yml new file mode 100644 index 000000000..8c71c3d37 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/defaults/main.yml @@ -0,0 +1,4 @@ +--- +vultr_object_storage_name: "{{ vultr_resource_prefix }}-volume" +vultr_object_storage_cluster1: del1.vultrobjects.com +vultr_object_storage_cluster2: ams1.vultrobjects.com diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/failures.yml b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/failures.yml new file mode 100644 index 000000000..3b2a3066a --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/failures.yml @@ -0,0 +1,10 @@ +--- +- name: test fail if missing required + vultr.cloud.object_storage: + register: result + ignore_errors: true +- name: verify test fail if missing required + ansible.builtin.assert: + that: + - result is failed + - 'result.msg == "missing required arguments: cluster, label"' diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/main.yml new file mode 100644 index 000000000..0e2f60bf0 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/main.yml @@ -0,0 +1,8 @@ +--- +- block: + - ansible.builtin.import_tasks: failures.yml + - ansible.builtin.import_tasks: tests.yml + always: + - ansible.builtin.import_role: + name: cleanup + tasks_from: cleanup_object_storage diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/tests.yml new file mode 100644 index 000000000..bf73498c6 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/object_storage/tasks/tests.yml @@ -0,0 +1,93 @@ +# Copyright (c) 2024, René Moser <mail@renemoser.net> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +- name: test create object storage in check mode + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster1 }}" + register: result + check_mode: true +- name: verify test create object storage in check mode + ansible.builtin.assert: + that: + - result is changed + +- name: test create object storage cluster 1 + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster1 }}" + register: result +- name: verify test create object storage + ansible.builtin.assert: + that: + - result is changed + - result.vultr_object_storage.label == vultr_object_storage_name + - result.vultr_object_storage.s3_hostname == vultr_object_storage_cluster1 + +- name: test create object storage cluster 2 + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster2 }}" + register: result +- name: verify test create object storage + ansible.builtin.assert: + that: + - result is changed + - result.vultr_object_storage.label == vultr_object_storage_name + - result.vultr_object_storage.s3_hostname == vultr_object_storage_cluster2 + +- name: test create object storage idempotence + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster1 }}" + register: result +- name: verify test create object storage idempotence + ansible.builtin.assert: + that: + - result is not changed + - result.vultr_object_storage.label == vultr_object_storage_name + - result.vultr_object_storage.s3_hostname == vultr_object_storage_cluster1 + +- name: test delete object storage in check mode + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster1 }}" + state: absent + check_mode: true + register: result +- name: verify test delete object storage in check mode + ansible.builtin.assert: + that: + - result is changed + - result.vultr_object_storage.label == vultr_object_storage_name + - result.vultr_object_storage.s3_hostname == vultr_object_storage_cluster1 + +- name: test delete object storage + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster1 }}" + state: absent + register: result +- name: verify test delete object storage + ansible.builtin.assert: + that: + - result is changed + - result.vultr_object_storage.label == vultr_object_storage_name + - result.vultr_object_storage.s3_hostname == vultr_object_storage_cluster1 + +- name: test delete object storage idempotence + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster1 }}" + state: absent + register: result +- name: verify test delete object storage idempotence + ansible.builtin.assert: + that: + - result is not changed + +- name: cleanup object storage cluster 2 + vultr.cloud.object_storage: + label: "{{ vultr_object_storage_name }}" + cluster: "{{ vultr_object_storage_cluster2 }}" + state: absent diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/aliases b/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/aliases index e69de29bb..c749ce7ca 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/aliases +++ b/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/aliases @@ -0,0 +1,3 @@ +cloud/vultr +needs/target/common +needs/target/cleanup diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/defaults/main.yml index 60634dbeb..e88833c62 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/defaults/main.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/defaults/main.yml @@ -1,9 +1,11 @@ # Copyright (c) 2021, René Moser <mail@renemoser.net> # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) --- -vultr_reserved_ip_name: "{{ vultr_resource_prefix }}-ip" +vultr_reserved_ip_name: "{{ vultr_resource_prefix }}_reserved_ip" +vultr_reserved_ip_region: ams -# TODO: topic of changes -vultr_server_name: "{{ vultr_resource_prefix }}_vm" -vultr_server_os: CentOS 7 x64 -vultr_server_plan: 1024 MB RAM,25 GB SSD,1.00 TB BW +vultr_instance: + label: "{{ vultr_resource_prefix }}_reserved_ip" + plan: vc2-1c-1gb + region: "{{ vultr_reserved_ip_region }}" + os: Debian 12 x64 (bookworm) diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/tasks/tests.yml index a46b56366..a8f5986be 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/reserved_ip/tasks/tests.yml @@ -5,7 +5,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" state: absent register: result - name: verify setup @@ -23,20 +23,18 @@ - result is failed - 'result.msg == "missing required arguments: ip_type, label, region"' -# TODO: topic of changes -- name: setup create the server - ngine_io.vultr.vultr_server: - name: "{{ vultr_server_name }}" - os: "{{ vultr_server_os }}" - plan: "{{ vultr_server_plan }}" - region: New Jersey - register: server +- name: setup instance + vultr.cloud.instance: + label: "{{ vultr_instance.label }}" + os: "{{ vultr_instance.os }}" + plan: "{{ vultr_instance.plan }}" + region: "{{ vultr_instance.region }}" - name: test create reserved ip in check mode vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" register: result check_mode: true - name: verify test create reserved ip in check mode @@ -48,7 +46,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" register: result - name: verify test create reserved ip ansible.builtin.assert: @@ -63,7 +61,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" register: result - name: verify test create reserved ip idempotence ansible.builtin.assert: @@ -78,8 +76,8 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr - instance_name: "{{ vultr_server_name }}" + region: "{{ vultr_reserved_ip_region }}" + instance_name: "{{ vultr_instance.label }}" register: result check_mode: true - name: verify test detach instance of reserved ip in check mode @@ -95,8 +93,8 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr - instance_name: "{{ vultr_server_name }}" + region: "{{ vultr_reserved_ip_region }}" + instance_name: "{{ vultr_instance.label }}" register: result - name: verify test attach instance of reserved ip ansible.builtin.assert: @@ -111,8 +109,8 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr - instance_name: "{{ vultr_server_name }}" + region: "{{ vultr_reserved_ip_region }}" + instance_name: "{{ vultr_instance.label }}" register: result - name: verify test attach instance of reserved ip idempotence ansible.builtin.assert: @@ -127,7 +125,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" register: result - name: verify test test ignore instance attached reserved ip idempotence ansible.builtin.assert: @@ -142,7 +140,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" instance_id: "" register: result check_mode: true @@ -159,7 +157,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" instance_id: "" register: result - name: verify test detach instance of reserved ip @@ -175,7 +173,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" instance_id: "" register: result - name: verify test detach instance of reserved ip idempotence @@ -191,7 +189,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" state: absent register: result check_mode: true @@ -208,7 +206,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" state: absent register: result - name: verify test absent reserved ip @@ -225,7 +223,7 @@ vultr.cloud.reserved_ip: label: "{{ vultr_reserved_ip_name }}" ip_type: v4 - region: ewr + region: "{{ vultr_reserved_ip_region }}" state: absent register: result - name: verify test absent reserved ip idempotence @@ -233,8 +231,8 @@ that: - result is not changed -# TODO: topic of changes -- name: cleanup the server - ngine_io.vultr.vultr_server: - name: "{{ vultr_server_name }}" +- name: cleanup instance + vultr.cloud.instance: + label: "{{ vultr_instance.label }}" + region: "{{ vultr_instance.region }}" state: absent diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/snapshot_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/snapshot_info/tasks/tests.yml index fe7a195ce..2168262dc 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/snapshot_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/snapshot_info/tasks/tests.yml @@ -17,7 +17,7 @@ - name: verify test gather vultr snapshot info in check mode ansible.builtin.assert: that: - - result.vultr_snapshot_info|selectattr('description','equalto','{{ vultr_snapshot_description }}') | list | count == 1 + - result.vultr_snapshot_info|selectattr('description','equalto',vultr_snapshot_description) | list | count == 1 - name: test gather snapshot info vultr.cloud.snapshot_info: @@ -26,7 +26,7 @@ - name: verify test gather vultr snapshot info ansible.builtin.assert: that: - - result.vultr_snapshot_info|selectattr('description','equalto','{{ vultr_snapshot_description }}') | list | count == 1 + - result.vultr_snapshot_info|selectattr('description','equalto',vultr_snapshot_description) | list | count == 1 - name: Delete the snapshot vultr.cloud.snapshot: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/ssh_key_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/ssh_key_info/tasks/tests.yml index 63ce48ee0..4b35406d2 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/ssh_key_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/ssh_key_info/tasks/tests.yml @@ -9,8 +9,8 @@ - name: verify test get vultr ssh key infos in check mode ansible.builtin.assert: that: - - result.vultr_ssh_key_info|selectattr('name','equalto','{{ ssh_key_name }}') | list | count == 0 - - result.vultr_ssh_key_info|selectattr('ssh_key','equalto','{{ ssh_key_content }}') | list | count == 0 + - result.vultr_ssh_key_info|selectattr('name','equalto',ssh_key_name) | list | count == 0 + - result.vultr_ssh_key_info|selectattr('ssh_key','equalto',ssh_key_content) | list | count == 0 - name: Upload an ssh key vultr.cloud.ssh_key: @@ -25,8 +25,8 @@ - name: verify test get vultr ssh key infos in check mode ansible.builtin.assert: that: - - result.vultr_ssh_key_info|selectattr('name','equalto','{{ ssh_key_name }}') | list | count == 1 - - result.vultr_ssh_key_info|selectattr('ssh_key','equalto','{{ ssh_key_content }}') | list | count == 1 + - result.vultr_ssh_key_info|selectattr('name','equalto',ssh_key_name) | list | count == 1 + - result.vultr_ssh_key_info|selectattr('ssh_key','equalto',ssh_key_content) | list | count == 1 - name: test get vultr ssh key info vultr.cloud.ssh_key_info: @@ -35,8 +35,8 @@ - name: verify test get vultr ssh key infos ansible.builtin.assert: that: - - result.vultr_ssh_key_info|selectattr('name','equalto','{{ ssh_key_name }}') | list | count == 1 - - result.vultr_ssh_key_info|selectattr('ssh_key','equalto','{{ ssh_key_content }}') | list | count == 1 + - result.vultr_ssh_key_info|selectattr('name','equalto',ssh_key_name) | list | count == 1 + - result.vultr_ssh_key_info|selectattr('ssh_key','equalto',ssh_key_content) | list | count == 1 - name: Destroy the ssh key vultr.cloud.ssh_key: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/startup_script_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/startup_script_info/tasks/tests.yml index 730df6d71..ef142465f 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/startup_script_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/startup_script_info/tasks/tests.yml @@ -18,7 +18,7 @@ - name: verify test gather vultr startup script info in check mode ansible.builtin.assert: that: - - result.vultr_startup_script_info|selectattr('name','equalto','{{ startup_script_name }}') | list | count == 1 + - result.vultr_startup_script_info|selectattr('name','equalto',startup_script_name) | list | count == 1 - name: test gather vultr startup script info vultr.cloud.startup_script_info: @@ -27,7 +27,7 @@ - name: verify test gather vultr startup script info ansible.builtin.assert: that: - - result.vultr_startup_script_info|selectattr('name','equalto','{{ startup_script_name }}') | list | count == 1 + - result.vultr_startup_script_info|selectattr('name','equalto',startup_script_name) | list | count == 1 - name: Delete the script vultr.cloud.startup_script: diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc/defaults/main.yml index 83923ffe8..524dbd470 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/vpc/defaults/main.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc/defaults/main.yml @@ -3,3 +3,4 @@ vultr_vpc_description: "{{ vultr_resource_prefix }}_vpc" vultr_vpc_v4_subnet: 192.168.42.0 vultr_vpc_v4_subnet_mask: 24 vultr_vpc_region: ewr +vultr_vpc_region_2: ams diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc/tasks/tests.yml index 8ed2dfdc7..28793a7e2 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/vpc/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc/tasks/tests.yml @@ -72,9 +72,38 @@ - result.vultr_vpc.v4_subnet == vultr_vpc_v4_subnet - result.vultr_vpc.v4_subnet_mask == vultr_vpc_v4_subnet_mask +- name: test create vpc in diff region but same description + vultr.cloud.vpc: + description: "{{ vultr_vpc_description }}" + v4_subnet: "{{ vultr_vpc_v4_subnet }}" + v4_subnet_mask: "{{ vultr_vpc_v4_subnet_mask }}" + region: "{{ vultr_vpc_region_2 }}" + register: result +- name: verify test create vpc in diff region but same description + ansible.builtin.assert: + that: + - result is changed + - result.vultr_vpc.description == vultr_vpc_description + - result.vultr_vpc.region == vultr_vpc_region_2 + - result.vultr_vpc.v4_subnet == vultr_vpc_v4_subnet + - result.vultr_vpc.v4_subnet_mask == vultr_vpc_v4_subnet_mask + +- name: test destroy vpc having 2 vpcs with same description distinqush region + vultr.cloud.vpc: + description: "{{ vultr_vpc_description }}" + state: absent + register: result + ignore_errors: true + check_mode: true +- name: verify test destroy vpc having 2 vpcs with same description distinqush region + ansible.builtin.assert: + that: + - result is failed + - name: test destroy vpc in check mode vultr.cloud.vpc: description: "{{ vultr_vpc_description }}" + region: "{{ vultr_vpc_region }}" state: absent register: result check_mode: true @@ -90,6 +119,7 @@ - name: test destroy vpc vultr.cloud.vpc: description: "{{ vultr_vpc_description }}" + region: "{{ vultr_vpc_region }}" state: absent register: result - name: verify test destroy vpc @@ -104,9 +134,21 @@ - name: test destroy an existing vpc idempotence vultr.cloud.vpc: description: "{{ vultr_vpc_description }}" + region: "{{ vultr_vpc_region }}" state: absent register: result - name: verify test destroy an existing vpc idempotence ansible.builtin.assert: that: - result is not changed + +- name: cleanup vpc in diff region + vultr.cloud.vpc: + description: "{{ vultr_vpc_description }}" + region: "{{ vultr_vpc_region_2 }}" + state: absent + register: result +- name: verify test cleanup vpc in diff region + ansible.builtin.assert: + that: + - result is changed diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/aliases b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/aliases new file mode 100644 index 000000000..c749ce7ca --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/aliases @@ -0,0 +1,3 @@ +cloud/vultr +needs/target/common +needs/target/cleanup diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/defaults/main.yml new file mode 100644 index 000000000..0a5d68330 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/defaults/main.yml @@ -0,0 +1,5 @@ +--- +vultr_vpc2_description: "{{ vultr_resource_prefix }}_vpc2" +vultr_vpc2_subnet: 192.168.42.0 +vultr_vpc2_cidr: 24 +vultr_vpc2_region: ewr diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/meta/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/meta/main.yml new file mode 100644 index 000000000..2083f0e12 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - common diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/tasks/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/tasks/main.yml new file mode 100644 index 000000000..df0dcb3b0 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- block: + - ansible.builtin.import_tasks: tests.yml + always: + - ansible.builtin.import_role: + name: cleanup + tasks_from: cleanup_vpc2 diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/tasks/tests.yml new file mode 100644 index 000000000..5a3bb60bf --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2/tasks/tests.yml @@ -0,0 +1,112 @@ +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +- name: setup + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + state: absent + +- name: test fail if missing description + vultr.cloud.vpc2: + register: result + ignore_errors: true +- name: verify test fail if missing description + ansible.builtin.assert: + that: + - result is failed + - 'result.msg == "missing required arguments: description"' + +- name: test fail if missing params for state=present + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + register: result + ignore_errors: true +- name: verify fail if missing params for state=present + ansible.builtin.assert: + that: + - result is failed + - '"state is present but all of the following are missing:" in result.msg' + +- name: test create vpc2 in check mode + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + ip_block: "{{ vultr_vpc2_subnet }}" + prefix_length: "{{ vultr_vpc2_cidr }}" + region: "{{ vultr_vpc2_region }}" + register: result + check_mode: true +- name: verify test create server in check mode + ansible.builtin.assert: + that: + - result is changed + +- name: test create vpc + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + ip_block: "{{ vultr_vpc2_subnet }}" + prefix_length: "{{ vultr_vpc2_cidr }}" + region: "{{ vultr_vpc2_region }}" + register: result +- name: verify test create vpc + ansible.builtin.assert: + that: + - result is changed + - result.vultr_vpc2.description == vultr_vpc2_description + - result.vultr_vpc2.region == vultr_vpc2_region + - result.vultr_vpc2.ip_block == vultr_vpc2_subnet + - result.vultr_vpc2.prefix_length == vultr_vpc2_cidr + +- name: test create vpc2 idempotence + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + ip_block: "{{ vultr_vpc2_subnet }}" + prefix_length: "{{ vultr_vpc2_cidr }}" + region: "{{ vultr_vpc2_region }}" + register: result +- name: verify test vpc2 idempotence + ansible.builtin.assert: + that: + - result is not changed + - result.vultr_vpc2.description == vultr_vpc2_description + - result.vultr_vpc2.region == vultr_vpc2_region + - result.vultr_vpc2.ip_block == vultr_vpc2_subnet + - result.vultr_vpc2.prefix_length == vultr_vpc2_cidr + +- name: test destroy vpc2 in check mode + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + state: absent + register: result + check_mode: true +- name: verify test destroy vpc2 in check mode + ansible.builtin.assert: + that: + - result is changed + - result.vultr_vpc2.description == vultr_vpc2_description + - result.vultr_vpc2.region == vultr_vpc2_region + - result.vultr_vpc2.ip_block == vultr_vpc2_subnet + - result.vultr_vpc2.prefix_length == vultr_vpc2_cidr + +- name: test destroy vpc + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + state: absent + register: result +- name: verify test destroy vpc + ansible.builtin.assert: + that: + - result is changed + - result.vultr_vpc2.description == vultr_vpc2_description + - result.vultr_vpc2.region == vultr_vpc2_region + - result.vultr_vpc2.ip_block == vultr_vpc2_subnet + - result.vultr_vpc2.prefix_length == vultr_vpc2_cidr + +- name: test destroy an existing vpc2 idempotence + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + state: absent + register: result +- name: verify test destroy an existing vpc2 idempotence + ansible.builtin.assert: + that: + - result is not changed diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/aliases b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/aliases new file mode 100644 index 000000000..c749ce7ca --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/aliases @@ -0,0 +1,3 @@ +cloud/vultr +needs/target/common +needs/target/cleanup diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/defaults/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/defaults/main.yml new file mode 100644 index 000000000..2fb56613c --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/defaults/main.yml @@ -0,0 +1,5 @@ +--- +vultr_vpc2_description: "{{ vultr_resource_prefix }}_vpc2_info" +vultr_vpc2_subnet: 192.168.23.0 +vultr_vpc2_cidr: 24 +vultr_vpc2_region: ewr diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/meta/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/meta/main.yml new file mode 100644 index 000000000..2083f0e12 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - common diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/tasks/main.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/tasks/main.yml new file mode 100644 index 000000000..df0dcb3b0 --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- block: + - ansible.builtin.import_tasks: tests.yml + always: + - ansible.builtin.import_role: + name: cleanup + tasks_from: cleanup_vpc2 diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/tasks/tests.yml new file mode 100644 index 000000000..78acf473a --- /dev/null +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc2_info/tasks/tests.yml @@ -0,0 +1,36 @@ +# Copyright (c) 2023, René Moser <mail@renemoser.net> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +- name: test gather vpc2 info - empty resources + vultr.cloud.vpc2_info: + +- name: Create the vpc2 + vultr.cloud.vpc2: + description: "{{ vultr_vpc2_description }}" + ip_block: "{{ vultr_vpc2_subnet }}" + prefix_length: "{{ vultr_vpc2_cidr }}" + region: "{{ vultr_vpc2_region }}" + +- name: test gather vpc2 info in check mode + vultr.cloud.vpc2_info: + check_mode: true + register: result + +- name: verify test gather vultr vpc2 info in check mode + ansible.builtin.assert: + that: + - result.vultr_vpc2_info|selectattr('description','equalto',vultr_vpc2_description) | list | count == 1 + +- name: test gather vpc2 info + vultr.cloud.vpc2_info: + register: result + +- name: verify test gather vultr vpc2 info + ansible.builtin.assert: + that: + - result.vultr_vpc2_info|selectattr('description','equalto',vultr_vpc2_description) | list | count == 1 + +- name: delete the vpc2 + vultr.cloud.vpc2: + name: "{{ vultr_vpc2_description }}" + state: absent diff --git a/ansible_collections/vultr/cloud/tests/integration/targets/vpc_info/tasks/tests.yml b/ansible_collections/vultr/cloud/tests/integration/targets/vpc_info/tasks/tests.yml index a8ab3d857..564b885e6 100644 --- a/ansible_collections/vultr/cloud/tests/integration/targets/vpc_info/tasks/tests.yml +++ b/ansible_collections/vultr/cloud/tests/integration/targets/vpc_info/tasks/tests.yml @@ -19,7 +19,7 @@ - name: verify test gather vultr vpc info in check mode ansible.builtin.assert: that: - - result.vultr_vpc_info|selectattr('description','equalto','{{ vultr_vpc_description }}') | list | count == 1 + - result.vultr_vpc_info|selectattr('description','equalto',vultr_vpc_description) | list | count == 1 - name: test gather VPC info vultr.cloud.vpc_info: @@ -28,7 +28,7 @@ - name: verify test gather vultr vpc info ansible.builtin.assert: that: - - result.vultr_vpc_info|selectattr('description','equalto','{{ vultr_vpc_description }}') | list | count == 1 + - result.vultr_vpc_info|selectattr('description','equalto',vultr_vpc_description) | list | count == 1 - name: Delete the VPC vultr.cloud.vpc: diff --git a/ansible_collections/vultr/cloud/tests/unit/plugins/inventory/test_vultr.py b/ansible_collections/vultr/cloud/tests/unit/plugins/inventory/test_vultr.py index aa8d8fbce..071bf50da 100644 --- a/ansible_collections/vultr/cloud/tests/unit/plugins/inventory/test_vultr.py +++ b/ansible_collections/vultr/cloud/tests/unit/plugins/inventory/test_vultr.py @@ -4,23 +4,22 @@ __metaclass__ = type import json import os.path -import pytest +import ansible_collections.vultr.cloud.plugins.inventory.vultr as module_under_test +import pytest from ansible.errors import AnsibleError, AnsibleParserError from ansible.inventory.data import InventoryData from ansible.parsing.dataloader import DataLoader from ansible.template import Templar - -import ansible_collections.vultr.cloud.plugins.inventory.vultr as module_under_test -from ansible_collections.vultr.cloud.plugins.inventory.vultr import InventoryModule - +from ansible_collections.vultr.cloud.plugins.inventory.vultr import \ + InventoryModule default_options = { "api_endpoint": "https://test.api.vultr.com/v2", "api_key": "TEST_VULTR_API_KEY", "api_results_per_page": 100, "api_timeout": 60, - "attributes": ["id", "region", "label", "plan", "hostname", "main_ip"], + "attributes": ["id", "region", "label", "plan", "hostname", "main_ip", "tags", "internal_ip"], "filters": [], "plugin": "vultr.cloud.vultr", "variable_prefix": "vultr_", |