diff --git a/lib/ansible/modules/cloud/hcloud/hcloud_image_facts.py b/lib/ansible/modules/cloud/hcloud/hcloud_image_facts.py new file mode 100644 index 00000000000..425bf3f17a5 --- /dev/null +++ b/lib/ansible/modules/cloud/hcloud/hcloud_image_facts.py @@ -0,0 +1,193 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2019, Hetzner Cloud GmbH +# 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 = """ +--- +module: hcloud_image_facts + +short_description: Gather facts about your Hetzner Cloud images. + +version_added: "2.8" + +description: + - Gather facts about your Hetzner Cloud images. + +author: + - Lukas Kaemmerling (@lkaemmerling) + +options: + id: + description: + - The ID of the image you want to get. + type: int + name: + description: + - The name of the image you want to get. + type: str + label_selector: + description: + - The label selector for the images you want to get. + type: str + type: + description: + - The label selector for the images you want to get. + default: system + choices: [ system, snapshot, backup ] +extends_documentation_fragment: hcloud +""" + +EXAMPLES = """ +- name: Gather hcloud image facts + local_action: + module: hcloud_image_facts + +- name: Print the gathered facts + debug: + var: ansible_facts.hcloud_image_facts +""" + +RETURN = """ +hcloud_image_facts: + description: The image facts as list + returned: always + type: complex + contains: + id: + description: Numeric identifier of the image + returned: always + type: int + sample: 1937415 + type: + description: Type of the image + returned: always + type: str + sample: system + status: + description: Status of the image + returned: always + type: str + sample: available + name: + description: Name of the image + returned: always + type: str + sample: ubuntu-18.04 + description: + description: Detail description of the image + returned: always + type: str + sample: Ubuntu 18.04 Standard 64 bit + os_flavor: + description: OS flavor of the image + returned: always + type: str + sample: ubuntu + os_version: + description: OS version of the image + returned: always + type: str + sample: 18.04 + labels: + description: User-defined labels (key-value pairs) + returned: always + type: dict +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils._text import to_native +from ansible.module_utils.hcloud import Hcloud + +try: + from hcloud import APIException +except ImportError: + pass + + +class AnsibleHcloudImageFacts(Hcloud): + def __init__(self, module): + Hcloud.__init__(self, module, "hcloud_image_facts") + self.hcloud_image_facts = None + + def _prepare_result(self): + tmp = [] + + for image in self.hcloud_image_facts: + if image is not None: + tmp.append({ + "id": to_native(image.id), + "status": to_native(image.status), + "type": to_native(image.type), + "name": to_native(image.name), + "description": to_native(image.description), + "os_flavor": to_native(image.os_flavor), + "os_version": to_native(image.os_version), + "labels": image.labels, + }) + return tmp + + def get_servers(self): + try: + if self.module.params.get("id") is not None: + self.hcloud_image_facts = [self.client.images.get_by_id( + self.module.params.get("id") + )] + elif self.module.params.get("name") is not None: + self.hcloud_image_facts = [self.client.images.get_by_name( + self.module.params.get("name") + )] + else: + params = {} + label_selector = self.module.params.get("label_selector") + if label_selector: + params["label_selector"] = label_selector + + image_type = self.module.params.get("type") + if image_type: + params["type"] = image_type + + self.hcloud_image_facts = self.client.images.get_all(**params) + + except APIException as e: + self.module.fail_json(msg=e.message) + + @staticmethod + def define_module(): + return AnsibleModule( + argument_spec=dict( + id={"type": "int"}, + name={"type": "str"}, + label_selector={"type": "str"}, + type={"choices": ["system", "snapshot", "backup"], "default": "system"}, + **Hcloud.base_module_arguments() + ), + supports_check_mode=True, + ) + + +def main(): + module = AnsibleHcloudImageFacts.define_module() + + hcloud = AnsibleHcloudImageFacts(module) + hcloud.get_servers() + result = hcloud.get_result() + ansible_facts = { + 'hcloud_image_facts': result['hcloud_image_facts'] + } + module.exit_json(ansible_facts=ansible_facts) + + +if __name__ == "__main__": + main() diff --git a/test/integration/targets/hcloud_image_facts/aliases b/test/integration/targets/hcloud_image_facts/aliases new file mode 100644 index 00000000000..51742ee23f7 --- /dev/null +++ b/test/integration/targets/hcloud_image_facts/aliases @@ -0,0 +1,2 @@ +cloud/hcloud +unsupported diff --git a/test/integration/targets/hcloud_image_facts/defaults/main.yml b/test/integration/targets/hcloud_image_facts/defaults/main.yml new file mode 100644 index 00000000000..2e20f1337f8 --- /dev/null +++ b/test/integration/targets/hcloud_image_facts/defaults/main.yml @@ -0,0 +1,6 @@ +# Copyright: (c) 2019, Hetzner Cloud GmbH +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +hcloud_prefix: "tests" +hcloud_test_image_name: "always-there-snapshot" +hcloud_test_image_id: 3439221 diff --git a/test/integration/targets/hcloud_image_facts/tasks/main.yml b/test/integration/targets/hcloud_image_facts/tasks/main.yml new file mode 100644 index 00000000000..d444dc3164b --- /dev/null +++ b/test/integration/targets/hcloud_image_facts/tasks/main.yml @@ -0,0 +1,55 @@ +# Copyright: (c) 2019, Hetzner Cloud GmbH +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +--- +- name: test gather hcloud image facts with type system + hcloud_image_facts: +- name: verify test gather hcloud image facts in check mode + assert: + that: + - ansible_facts.hcloud_image_facts| list | count > 2 + +- name: test gather hcloud image facts in check mode + hcloud_image_facts: + check_mode: yes + +- name: verify test gather hcloud image facts in check mode + assert: + that: + - ansible_facts.hcloud_image_facts| list | count > 2 + + +- name: test gather hcloud image facts with correct label selector + hcloud_image_facts: + label_selector: "key=value" + type: snapshot +- name: verify test gather hcloud image with correct label selector + assert: + that: + - ansible_facts.hcloud_image_facts|selectattr('description','equalto','{{ hcloud_test_image_name }}') | list | count == 1 + +- name: test gather hcloud image facts with wrong label selector + hcloud_image_facts: + label_selector: "key!=value" + type: snapshot +- name: verify test gather hcloud image with wrong label selector + assert: + that: + - ansible_facts.hcloud_image_facts | list | count == 0 + +- name: test gather hcloud image facts with correct id + hcloud_image_facts: + id: "{{hcloud_test_image_id}}" + type: snapshot +- name: verify test gather hcloud image with correct id + assert: + that: + - ansible_facts.hcloud_image_facts|selectattr('description','equalto','{{ hcloud_test_image_name }}') | list | count == 1 + +- name: test gather hcloud image facts with wrong id + hcloud_image_facts: + id: "{{hcloud_test_image_id}}1" + type: snapshot +- name: verify test gather hcloud image with wrong id + assert: + that: + - ansible_facts.hcloud_image_facts | list | count == 0