From e635dc696923ad4c61092ba59543ebdaa85d1804 Mon Sep 17 00:00:00 2001 From: Yanis Guenane Date: Fri, 17 Aug 2018 19:32:13 +0200 Subject: [PATCH] Vultr: Introducing vultr_block_storage_facts module (#43218) This commit introduces a new module called vultr_block_storage_facts. This module aims to return the list of block storage volume avaiable in Vultr. --- .../cloud/vultr/vultr_block_storage_facts.py | 127 ++++++++++++++++++ .../defaults/main.yml | 3 + .../vultr_block_storage_facts/tasks/main.yml | 33 +++++ test/legacy/vultr.yml | 1 + 4 files changed, 164 insertions(+) create mode 100644 lib/ansible/modules/cloud/vultr/vultr_block_storage_facts.py create mode 100644 test/legacy/roles/vultr_block_storage_facts/defaults/main.yml create mode 100644 test/legacy/roles/vultr_block_storage_facts/tasks/main.yml diff --git a/lib/ansible/modules/cloud/vultr/vultr_block_storage_facts.py b/lib/ansible/modules/cloud/vultr/vultr_block_storage_facts.py new file mode 100644 index 00000000000..df158456044 --- /dev/null +++ b/lib/ansible/modules/cloud/vultr/vultr_block_storage_facts.py @@ -0,0 +1,127 @@ +#!/usr/bin/python +# +# (c) 2018, Yanis Guenane +# 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 + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = r''' +--- +module: vultr_block_storage_facts +short_description: Gather facts about the Vultr block storage volumes available. +description: + - Gather facts about block storage volumes available in Vultr. +version_added: "2.7" +author: "Yanis Guenane (@Spredzy)" +extends_documentation_fragment: vultr +''' + +EXAMPLES = r''' +- name: Gather Vultr block storage volumes facts + local_action: + module: vultr_block_storage_facts + +- name: Print the gathered facts + debug: + var: ansible_facts.vultr_block_storage_facts +''' + +RETURN = r''' +--- +vultr_api: + description: Response from Vultr API with a few additions/modification + returned: success + type: complex + contains: + api_account: + description: Account used in the ini file to select the key + returned: success + type: string + 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_endpoint: + description: Endpoint used for the API requests + returned: success + type: string + sample: "https://api.vultr.com" +vultr_block_storage_facts: + description: Response from Vultr API + returned: success + type: complex + contains: + "vultr_block_storage_facts": [ + { + "attached_to_id": null, + "cost_per_month": 1.0, + "date_created": "2018-07-24 12:59:59", + "id": 17332323, + "name": "ansible-test-volume", + "region": "New Jersey", + "size": 10, + "status": "active" + } + ] +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.vultr import ( + Vultr, + vultr_argument_spec, +) + + +class AnsibleVultrBlockStorageFacts(Vultr): + + def __init__(self, module): + super(AnsibleVultrBlockStorageFacts, self).__init__(module, "vultr_block_storage_facts") + + self.returns = { + 'attached_to_SUBID': dict(key='attached_to_id'), + 'cost_per_month': dict(convert_to='float'), + 'date_created': dict(), + 'SUBID': dict(key='id'), + 'label': dict(key='name'), + 'DCID': dict(key='region', transform=self._get_region_name), + 'size_gb': dict(key='size', convert_to='int'), + 'status': dict() + } + + def _get_region_name(self, region): + return self.get_region(region, 'DCID').get('name') + + def get_block_storage_volumes(self): + return self.api_query(path="/v1/block/list") + + +def main(): + argument_spec = vultr_argument_spec() + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True, + ) + + volume_facts = AnsibleVultrBlockStorageFacts(module) + result = volume_facts.get_result(volume_facts.get_block_storage_volumes()) + ansible_facts = { + 'vultr_block_storage_facts': result['vultr_block_storage_facts'] + } + module.exit_json(ansible_facts=ansible_facts, **result) + + +if __name__ == '__main__': + main() diff --git a/test/legacy/roles/vultr_block_storage_facts/defaults/main.yml b/test/legacy/roles/vultr_block_storage_facts/defaults/main.yml new file mode 100644 index 00000000000..b49589ac6f9 --- /dev/null +++ b/test/legacy/roles/vultr_block_storage_facts/defaults/main.yml @@ -0,0 +1,3 @@ +vultr_block_storage_name: ansibletest-volume +vultr_block_storage_size: 10 +vultr_block_storage_region: New Jersey diff --git a/test/legacy/roles/vultr_block_storage_facts/tasks/main.yml b/test/legacy/roles/vultr_block_storage_facts/tasks/main.yml new file mode 100644 index 00000000000..40fc0e1d536 --- /dev/null +++ b/test/legacy/roles/vultr_block_storage_facts/tasks/main.yml @@ -0,0 +1,33 @@ +# Copyright (c) 2018, Yanis Guenane +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +- name: test gather vultr block storage volume facts - empty resource + vultr_block_storage_facts: + +- name: Create the block storage volume + vultr_block_storage: + name: '{{ vultr_block_storage_name }}' + size: '{{ vultr_block_storage_size }}' + region: '{{ vultr_block_storage_region }}' + +- name: test gather vultr block storage volume facts in check mode + vultr_block_storage_facts: + check_mode: yes + +- name: verify test gather vultr block storage volume facts in check mode + assert: + that: + - ansible_facts.vultr_block_storage_facts|selectattr('name','equalto','{{ vultr_block_storage_name }}') | list | count == 1 + +- name: test gather vultr block storage volume facts + vultr_block_storage_facts: + +- name: verify test gather vultr block storage volume facts + assert: + that: + - ansible_facts.vultr_block_storage_facts|selectattr('name','equalto','{{ vultr_block_storage_name }}') | list | count == 1 + +- name: Delete the block storage volume + vultr_block_storage: + name: '{{ vultr_block_storage_name }}' + state: absent diff --git a/test/legacy/vultr.yml b/test/legacy/vultr.yml index a807f65467e..531ccaba2f6 100644 --- a/test/legacy/vultr.yml +++ b/test/legacy/vultr.yml @@ -7,6 +7,7 @@ roles: - { role: vultr_account_facts, tags: test_vultr_account_facts } - { role: vultr_block_storage, tags: test_vultr_block_storage } + - { role: vultr_block_storage_facts, tags: test_vultr_block_storage_facts } - { role: vultr_dns_domain, tags: test_vultr_dns_domain } - { role: vultr_dns_domain_facts, tags: test_vultr_dns_domain_facts } - { role: vultr_dns_record, tags: test_vultr_dns_record }