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

improve (dns): support domain group manage and modify ali_dns_domain #202

Merged
merged 1 commit into from
Dec 3, 2019
Merged
Show file tree
Hide file tree
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
22 changes: 18 additions & 4 deletions lib/ansible/modules/cloud/alicloud/ali_dns_domain.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,16 @@
short_description: Configure Alibaba Cloud DNS (DNS)
description:
- Create, Delete Alicloud cloud DNS(DNS).
It supports updating DNS remark.
It supports updating DNS remark and change domain group.
options:
domain_name:
description:
- The name to give your DNS.
required: True
aliases: ['name']
group_id:
group_name:
description:
- Domain name group, which is, by default, the GroupId of the “Default Group”.
- Specify name of group, when change domain group.
lang:
description:
- The language which you choose
Expand Down Expand Up @@ -80,6 +80,11 @@
domain_name: '{{ domain_name }}'
remark: 'new--{{ remark }}'

- name: Changed. change domain group.
ali_dns_domain:
domain_name: '{{ domain_name }}'
group_name: '{{ group_name }}'

- name: Changed. Deleting dns
ali_dns_domain:
domain_name: '{{ domain_name }}'
Expand Down Expand Up @@ -191,7 +196,7 @@ def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
domain_name=dict(type='str', aliases=['name'], required=True),
group_id=dict(type='str'),
group_name=dict(type='str'),
lang=dict(type='str'),
resource_group_id=dict(type='str'),
remark=dict(type='str'),
Expand All @@ -210,6 +215,7 @@ def main():
state = module.params['state']
domain_name = module.params['domain_name']
remark = module.params['remark']
group_name = module.params['group_name']
changed = False

# Check if VPC exists
Expand All @@ -232,6 +238,14 @@ def main():
except DNSResponseError as e:
module.fail_json(msg='Unable to create dns, error: {0}'.format(e))

if domain_name and group_name:
try:
res = dns.change_domain_group(group_name=group_name, domain_name=domain_name)
if res:
changed = True
except DNSResponseError as e:
module.fail_json(msg='Unable to change domain group, error: {0}'.format(e))

if remark:
try:
res = dns.modify_remark(remark=remark)
Expand Down
171 changes: 171 additions & 0 deletions lib/ansible/modules/cloud/alicloud/ali_dns_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
#!/usr/bin/python
# Copyright (c) 2017 Alibaba Group Holding Limited. He Guimin <[email protected]>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see http://www.gnu.org/licenses/.


__metaclass__ = type

ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}

DOCUMENTATION = """
---
module: ali_dns_group
version_added: "2.8"
short_description: Configure Alibaba Cloud DNS (DNS)
description:
- Create, Delete Alicloud cloud DNS group(DNS group).
It supports updating group name.
options:
lang:
description:
- The language which you choose
group_name:
description:
- Give the name of group when create DNS group and Use this parameter to guarantee idempotence.
aliases: ['name']
state:
description:
- Whether or not to create, delete DNS group.
choices: ['present', 'absent']
default: 'present'
requirements:
- "python >= 3.6"
- "footmark >= 1.15.0"
extends_documentation_fragment:
- alicloud
author:
- "He Guimin (@xiaozhu36)"
"""

EXAMPLES = """
# Note: These examples do not set authentication details, see the Alibaba Cloud Guide for details.
- name: Changed. Create dns group.
ali_dns_group:
group_name: '{{ group_name }}'

- name: Changed. Deleting dns group
ali_dns_group:
group_name: '{{ group_name }}'
state: absent
"""

RETURN = '''
groups:
description: info about the DNS group that was created or deleted
returned: always
type: complex
contains:
count:
description: alias of 'domain_count'.
returned: always
type: int
sample: 0
domain_count:
description: Number of domain names in the group .
returned: always
type: dict
returned: always
type: int
sample: 0
group_id:
description: The id of group.
returned: always
type: string
sample: xxxxxxxxxx
id:
description: alias of 'group_id'.
returned: always
type: string
sample: xxxxxxxxxx
group_name:
description: Name of group.
returned: always
type: string
sample: ansible_test
'''


from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.alicloud_ecs import ecs_argument_spec, dns_connect

HAS_FOOTMARK = False

try:
from footmark.exception import DNSResponseError
HAS_FOOTMARK = True
except ImportError:
HAS_FOOTMARK = False


def dns_group_exists(module, dns_conn, group_name):
try:
for v in dns_conn.describe_domain_groups():
if v.name == group_name:
return v
return None
except Exception as e:
module.fail_json(msg="Failed to describe DNS group: {0}".format(e))


def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
group_name=dict(type='str', aliases=['name']),
lang=dict(type='str'),
state=dict(default='present', choices=['present', 'absent']),
))

module = AnsibleModule(argument_spec=argument_spec)

if HAS_FOOTMARK is False:
module.fail_json(msg='footmark required for the module ali_dns_group.')

dns_conn = dns_connect(module)

# Get values of variable
state = module.params['state']
group_name = module.params['group_name']
changed = False

dns_group = dns_group_exists(module, dns_conn,group_name)

if state == 'absent':
if not dns_group:
module.exit_json(changed=changed, groups={})
try:
module.exit_json(changed=dns_group.delete(), groups={})
except DNSResponseError as ex:
module.fail_json(msg='Unable to delete dns group{0}, error: {1}'.format(dns_group.id, ex))

if not dns_group:
params = module.params
try:
dns_group = dns_conn.add_domain_group(**params)
if dns_group:
changed = True
module.exit_json(changed=changed, groups=dns_group.get().read())
except DNSResponseError as e:
module.fail_json(msg='Unable to create dns group, error: {0}'.format(e))

module.exit_json(changed=changed, groups=dns_group.read())


if __name__ == '__main__':
main()
156 changes: 156 additions & 0 deletions lib/ansible/modules/cloud/alicloud/ali_dns_group_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
#!/usr/bin/python
# Copyright (c) 2017 Alibaba Group Holding Limited. He Guimin <[email protected]>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible. If not, see http://www.gnu.org/licenses/.


__metaclass__ = type

ANSIBLE_METADATA = {'metadata_version': '1.1',
'status': ['preview'],
'supported_by': 'community'}

DOCUMENTATION = '''
---
module: ali_domain_group_info
version_added: "2.8"
short_description: Gather facts on domain group of Alibaba Cloud.
description:
- This module fetches data from the Open API in Alicloud.
The module must be called from within the group itself.
options:
group_id:
description:
- Id of group, specify it to filter group.
name_prefix:
description:
- Use a Group name prefix to filter groups.
author:
- "He Guimin (@xiaozhu36)"
requirements:
- "python >= 3.6"
- "footmark >= 1.15.0"
extends_documentation_fragment:
- alicloud
'''

EXAMPLES = '''
# Note: These examples do not set authentication details, see the Alibaba Cloud Guide for details.
- name: Get the existing group with name_prefix
ali_dns_group_info:
name_prefix: '{{ name }}'
register: groups

- name: Get the existing group with group_id
ali_dns_group_info:
group_id: '{{ group_id }}'
register: groups

- name: Get the existing group with domain_count
ali_dns_group_info:
domain_count: '{{ domain_count }}'
register: groups

- name: Retrieving all dns group
ali_dns_group_info:
'''

RETURN = '''
ids:
description: List all group's id after operating group.
returned: when success
type: list
sample: [ "group-2zegusms7jwd94lq7ix8o", "group-2ze5hrb3y5ksx5oa3a0xa" ]
groups:
description: Returns an array of complex objects as described below.
returned: always
type: complex
contains:
count:
description: alias of 'domain_count'.
returned: always
type: int
sample: 0
domain_count:
description: Number of domain names in the group .
returned: always
type: dict
returned: always
type: int
sample: 0
group_id:
description: The id of group.
returned: always
type: string
sample: xxxxxxxxxx
id:
description: alias of 'group_id'.
returned: always
type: string
sample: xxxxxxxxxx
group_name:
description: Name of group.
returned: always
type: string
sample: ansible_test
'''

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.alicloud_ecs import ecs_argument_spec, dns_connect

HAS_FOOTMARK = False

try:
from footmark.exception import DNSResponseError
HAS_FOOTMARK = True
except ImportError:
HAS_FOOTMARK = False


def main():
argument_spec = ecs_argument_spec()
argument_spec.update(dict(
name_prefix=dict(type='str'),
group_id=dict(type='str', aliases=['id']),
)
)
module = AnsibleModule(argument_spec=argument_spec)

if HAS_FOOTMARK is False:
module.fail_json(msg="Package 'footmark' required for this module.")

name_prefix = module.params['name_prefix']
group_id = module.params['group_id']

try:
groups = []
ids = []
for _dns in dns_connect(module).describe_domain_groups():
if name_prefix and not _dns.name.startswith(name_prefix):
continue
if group_id and _dns.id != group_id:
continue
groups.append(_dns.read())
ids.append(_dns.id)

module.exit_json(changed=False, groups=groups, ids=ids)
except Exception as e:
module.fail_json(msg=str("Unable to get dns group, error:{0}".format(e)))


if __name__ == '__main__':
main()
Loading