mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-26 20:31:27 -07:00
Start using this to construct shade OpenStack Cloud objects in a consistent manner. This will let us centralize things like dealing with password arguments and whatnot. It also allows us to introduce the ability to pass a fully formed config dict directly to the module. Migrate all OpenStack modules to use openstack_cloud_from_module. Have it return the shade library since it's responsible for importing shade and shade is needed for the exceptions. Only pull specific OpenStack arguments for the constructor Rather than passing **module.params to the shade constructor, pull out only the values that make sense. This should prevent the issues with module parameters stepping on shade parameters. Replace module.params.pop with module.params.get We don't need to pop these anymore since the shade constructor is now using opt-in values. Using real urls is ungood. Use example.com domains. Also, get rid of the antiquated port numbers.
223 lines
6.6 KiB
Python
223 lines
6.6 KiB
Python
#!/usr/bin/python
|
|
# Copyright (c) 2016 Hewlett-Packard Enterprise
|
|
# 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: os_zone
|
|
short_description: Manage OpenStack DNS zones
|
|
extends_documentation_fragment: openstack
|
|
version_added: "2.2"
|
|
author: "Ricardo Carrillo Cruz (@rcarrillocruz)"
|
|
description:
|
|
- Manage OpenStack DNS zones. Zones can be created, deleted or
|
|
updated. Only the I(email), I(description), I(ttl) and I(masters) values
|
|
can be updated.
|
|
options:
|
|
name:
|
|
description:
|
|
- Zone name
|
|
required: true
|
|
zone_type:
|
|
description:
|
|
- Zone type
|
|
choices: [primary, secondary]
|
|
default: None
|
|
email:
|
|
description:
|
|
- Email of the zone owner (only applies if zone_type is primary)
|
|
required: false
|
|
description:
|
|
description:
|
|
- Zone description
|
|
required: false
|
|
default: None
|
|
ttl:
|
|
description:
|
|
- TTL (Time To Live) value in seconds
|
|
required: false
|
|
default: None
|
|
masters:
|
|
description:
|
|
- Master nameservers (only applies if zone_type is secondary)
|
|
required: false
|
|
default: None
|
|
state:
|
|
description:
|
|
- Should the resource be present or absent.
|
|
choices: [present, absent]
|
|
default: present
|
|
availability_zone:
|
|
description:
|
|
- Ignored. Present for backwards compatibility
|
|
required: false
|
|
requirements:
|
|
- "python >= 2.6"
|
|
- "shade"
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
# Create a zone named "example.net"
|
|
- os_zone:
|
|
cloud: mycloud
|
|
state: present
|
|
name: example.net.
|
|
zone_type: primary
|
|
email: test@example.net
|
|
description: Test zone
|
|
ttl: 3600
|
|
|
|
# Update the TTL on existing "example.net." zone
|
|
- os_zone:
|
|
cloud: mycloud
|
|
state: present
|
|
name: example.net.
|
|
ttl: 7200
|
|
|
|
# Delete zone named "example.net."
|
|
- os_zone:
|
|
cloud: mycloud
|
|
state: absent
|
|
name: example.net.
|
|
'''
|
|
|
|
RETURN = '''
|
|
zone:
|
|
description: Dictionary describing the zone.
|
|
returned: On success when I(state) is 'present'.
|
|
type: complex
|
|
contains:
|
|
id:
|
|
description: Unique zone ID
|
|
type: string
|
|
sample: "c1c530a3-3619-46f3-b0f6-236927b2618c"
|
|
name:
|
|
description: Zone name
|
|
type: string
|
|
sample: "example.net."
|
|
type:
|
|
description: Zone type
|
|
type: string
|
|
sample: "PRIMARY"
|
|
email:
|
|
description: Zone owner email
|
|
type: string
|
|
sample: "test@example.net"
|
|
description:
|
|
description: Zone description
|
|
type: string
|
|
sample: "Test description"
|
|
ttl:
|
|
description: Zone TTL value
|
|
type: int
|
|
sample: 3600
|
|
masters:
|
|
description: Zone master nameservers
|
|
type: list
|
|
sample: []
|
|
'''
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
from ansible.module_utils.openstack import openstack_full_argument_spec, openstack_module_kwargs, openstack_cloud_from_module
|
|
|
|
|
|
def _system_state_change(state, email, description, ttl, masters, zone):
|
|
if state == 'present':
|
|
if not zone:
|
|
return True
|
|
if email is not None and zone.email != email:
|
|
return True
|
|
if description is not None and zone.description != description:
|
|
return True
|
|
if ttl is not None and zone.ttl != ttl:
|
|
return True
|
|
if masters is not None and zone.masters != masters:
|
|
return True
|
|
if state == 'absent' and zone:
|
|
return True
|
|
return False
|
|
|
|
|
|
def main():
|
|
argument_spec = openstack_full_argument_spec(
|
|
name=dict(required=True),
|
|
zone_type=dict(required=False, choice=['primary', 'secondary']),
|
|
email=dict(required=False, default=None),
|
|
description=dict(required=False, default=None),
|
|
ttl=dict(required=False, default=None, type='int'),
|
|
masters=dict(required=False, default=None, type='list'),
|
|
state=dict(default='present', choices=['absent', 'present']),
|
|
)
|
|
|
|
module_kwargs = openstack_module_kwargs()
|
|
module = AnsibleModule(argument_spec,
|
|
supports_check_mode=True,
|
|
**module_kwargs)
|
|
|
|
name = module.params.get('name')
|
|
state = module.params.get('state')
|
|
|
|
shade, cloud = openstack_cloud_from_module(module, min_version='1.8.0')
|
|
try:
|
|
zone = cloud.get_zone(name)
|
|
|
|
if state == 'present':
|
|
zone_type = module.params.get('zone_type')
|
|
email = module.params.get('email')
|
|
description = module.params.get('description')
|
|
ttl = module.params.get('ttl')
|
|
masters = module.params.get('masters')
|
|
|
|
if module.check_mode:
|
|
module.exit_json(changed=_system_state_change(state, email,
|
|
description, ttl,
|
|
masters, zone))
|
|
|
|
if zone is None:
|
|
zone = cloud.create_zone(
|
|
name=name, zone_type=zone_type, email=email,
|
|
description=description, ttl=ttl, masters=masters)
|
|
changed = True
|
|
else:
|
|
if masters is None:
|
|
masters = []
|
|
|
|
pre_update_zone = zone
|
|
changed = _system_state_change(state, email,
|
|
description, ttl,
|
|
masters, pre_update_zone)
|
|
if changed:
|
|
zone = cloud.update_zone(
|
|
name, email=email,
|
|
description=description,
|
|
ttl=ttl, masters=masters)
|
|
module.exit_json(changed=changed, zone=zone)
|
|
|
|
elif state == 'absent':
|
|
if module.check_mode:
|
|
module.exit_json(changed=_system_state_change(state, None,
|
|
None, None,
|
|
None, zone))
|
|
|
|
if zone is None:
|
|
changed = False
|
|
else:
|
|
cloud.delete_zone(name)
|
|
changed = True
|
|
module.exit_json(changed=changed)
|
|
|
|
except shade.OpenStackCloudException as e:
|
|
module.fail_json(msg=str(e))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|