Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Created hcloud_primary_ip_info #149

Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
211 changes: 211 additions & 0 deletions plugins/modules/hcloud_primary_ip_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright: (c) 2019, Hetzner Cloud GmbH <info@hetzner-cloud.de>
# 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: hcloud_primary_ip_info

short_description: Gather infos about the Hetzner Cloud Primary IPs.

description:
- Gather facts about your Hetzner Cloud Primary IPs.

author:
- Lukas Kaemmerling (@LKaemmerling)
- Kevin Castner (@kcastner)

options:
id:
description:
- The ID of the Primary IP you want to get.
type: int
label_selector:
description:
- The label selector for the Primary IP you want to get.
type: str
name:
description:
- The name for the Primary IP you want to get.
type: str
extends_documentation_fragment:
- hetzner.hcloud.hcloud

'''

EXAMPLES = """
- name: Gather all hcloud Primary IPs
hcloud_primary_ip_info:
register: output

- name: Gather hcloud Primary IP infos by id
hcloud_primary_ip_info:
id: 673954
register: output

- name: Gather hcloud Primary IP infos by name
hcloud_primary_ip_info:
name: srv1-v4
register: output

- name: Gather hcloud Primary IP infos by label
hcloud_primary_ip_info:
label_selector: srv03-ips
register: output

- name: Print the gathered infos
debug:
var: output

"""

RETURN = """
hcloud_primary_ip_info:
description: The Primary IP infos as list
returned: always
type: complex
contains:
id:
description: Numeric identifier of the Primary IP
returned: always
type: int
sample: 1937415
name:
description: Name of the Primary IP
returned: always
type: str
sample: my-primary-ip
ip:
description: IP address of the Primary IP
returned: always
type: str
sample: 131.232.99.1
type:
description: Type of the Primary IP
returned: always
type: str
sample: ipv4
assignee_id:
description: Numeric identifier of the ressource where the Primary IP is assigned to.
returned: always
type: int
sample: 19584637
assignee_type:
description: Name of the type where the Primary IP is assigned to.
returned: always
type: str
sample: server
home_location:
description: Location with datacenter where the Primary IP was created in
returned: always
type: str
sample: fsn1-dc1
dns_ptr:
description: Shows the DNS PTR Record for Primary IP.
returned: always
type: str
sample: srv01.example.com
labels:
description: User-defined labels (key-value pairs)
returned: always
type: dict
delete_protection:
description: True if the Primary IP is protected for deletion
returned: always
type: bool
"""

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils._text import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud

try:
from hcloud import APIException
except ImportError:
APIException = None


class AnsibleHcloudPrimaryIPInfo(Hcloud):
def __init__(self, module):
Hcloud.__init__(self, module, "hcloud_primary_ip_info")
self.hcloud_primary_ip_info = None

def _prepare_result(self):
tmp = []

for primary_ip in self.hcloud_primary_ip_info:
if primary_ip is not None:
dns_ptr = None
if len(primary_ip.dns_ptr) > 0:
dns_ptr = primary_ip.dns_ptr[0]["dns_ptr"]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
dns_ptr = primary_ip.dns_ptr[0]["dns_ptr"]
dns_ptr = primary_ip.dns_ptr[0]["dns_ptr"]

tmp.append({
"id": to_native(primary_ip.id),
"name": to_native(primary_ip.name),
"ip": to_native(primary_ip.ip),
"type": to_native(primary_ip.type),
"assignee_id": to_native(primary_ip.assignee_id),
"assignee_type": to_native(primary_ip.assignee_type),
"home_location": to_native(primary_ip.datacenter.name),
"dns_ptr": to_native(dns_ptr),
Comment on lines +152 to +155
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling to_native on None causes the field to have the string value "None" instead of the expected null.

Suggested change
"assignee_id": to_native(primary_ip.assignee_id),
"assignee_type": to_native(primary_ip.assignee_type),
"home_location": to_native(primary_ip.datacenter.name),
"dns_ptr": to_native(dns_ptr),
"assignee_id": None if primary_ip.assignee_id is None else to_native(primary_ip.assignee_id),
"assignee_type": to_native(primary_ip.assignee_type),
"home_location": to_native(primary_ip.datacenter.name),
"dns_ptr": None if dns_ptr is None else to_native(dns_ptr),

"labels": primary_ip.labels,
"delete_protection": primary_ip.protection["delete"],
})

return tmp

def get_primary_ips(self):
try:
# if self.module.params.get("id") is not None:
# self.hcloud_primary_ip_info = [self.client.primary_ips.get_by_id(
# self.module.params.get("id")
# )]
# elif self.module.params.get("name") is not None:
# self.hcloud_primary_ip_info = [self.client.primary_ips.get_by_name(
# self.module.params.get("name")
# )]
# elif self.module.params.get("label_selector") is not None:
# self.hcloud_primary_ip_info = self.client.primary_ips.get_all(
# label_selector=self.module.params.get("label_selector"))
# else:
# self.hcloud_primary_ip_info = self.client.primary_ips.get_all()
Comment on lines +164 to +176
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason why you commented out this section? This is required for the functionality of the module.

This works fine, I uncommented it and removed line 178, and everything worked as expected :)


self.hcloud_primary_ip_info = self.client.primary_ips.get_all()

except Exception as e:
self.module.fail_json(msg=e.message)

@staticmethod
def define_module():
return AnsibleModule(
argument_spec=dict(
id={"type": "int"},
label_selector={"type": "str"},
name={"type": "str"},
**Hcloud.base_module_arguments()
),
supports_check_mode=True,
)


def main():
module = AnsibleHcloudPrimaryIPInfo.define_module()

hcloud = AnsibleHcloudPrimaryIPInfo(module)

hcloud.get_primary_ips()
result = hcloud.get_result()

ansible_info = {
'hcloud_primary_ip_info': result['hcloud_primary_ip_info']
}
module.exit_json(**ansible_info)


if __name__ == "__main__":
main()