a96d28dfbc
We don't use github, so having @ mentions of specific humans is not valuable. Also, we are a team and own the modules as a team, so calling out individual authors is philosophically contrary. We landed a patch upstream to special-case this author string. Change-Id: I38b4e68f14bbba6e13e8a50e2b202874ab74e3bc
111 lines
3.6 KiB
Django/Jinja
111 lines
3.6 KiB
Django/Jinja
#!/usr/bin/python
|
|
# coding: utf-8 -*-
|
|
|
|
# Copyright (c) 2020, {{ author_name }} <{{ author_mail }}>
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
DOCUMENTATION = '''
|
|
---
|
|
module: {{ module_name }}
|
|
short_description: {{ module_short_description }}
|
|
author: OpenStack Ansible SIG
|
|
description:
|
|
- {{ module_long_description }}
|
|
options:
|
|
{{ options|to_nice_yaml(indent=2,sort_keys=false)|indent(width=2)|trim }}
|
|
|
|
requirements:
|
|
- "python >= 3.6"
|
|
- "openstacksdk"
|
|
|
|
extends_documentation_fragment:
|
|
- openstack.cloud.openstack
|
|
'''
|
|
|
|
RETURN = '''
|
|
{{ module_returns_example|to_nice_yaml(indent=2,sort_keys=false) }}
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
# What modules does for example
|
|
- {{ module_name }}:
|
|
name:
|
|
- name1
|
|
- name2
|
|
timeout: 200
|
|
'''
|
|
|
|
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
|
|
|
|
|
|
class {{ module_name.split("_")|map("capitalize")|list|join("") }}Module(OpenStackModule):
|
|
|
|
argument_spec = dict(
|
|
{% for k, v in options.items() %}
|
|
{{ k | indent( width=8, indentfirst=True) }}=dict(type='{{ v.type }}'
|
|
{%- if 'required' in v %}, required={{ v.required }}{% endif %}
|
|
{%- if 'elements' in v %}, elements={{ v.elements }}{% endif %}
|
|
{%- if 'default' in v %}, default={% if v.type == 'str' %}"{{ v.default }}"{% else %}{{ v.default }}{% endif %}{% endif %}
|
|
{%- if 'aliases' in v %}, aliases={{ v.aliases }}{% endif %}
|
|
{%- if 'choices' in v %}, choices={{ v.choices }}{% endif %}),
|
|
{% endfor %}
|
|
),
|
|
|
|
# Optional arguments requirements
|
|
module_kwargs = dict(
|
|
required_if=[
|
|
['action', 'rebuild', ['image']], # if need to rebuild image (only), the 'image' is required
|
|
["state", "present", ["username", "user_roles"]], # for creating user 'user_roles' is required
|
|
["state", "absent", ["username"]], # for state 'absent' only username is required
|
|
],
|
|
required_by=dict( # for weather and population 'city' is required to set
|
|
weather=('city'),
|
|
population=('city'),
|
|
),
|
|
mutually_exclusive=[
|
|
['use_cloud1', 'use_cloud2'] # can't run on both, choose only one to set
|
|
],
|
|
required_together=[
|
|
['remove_image', 'image_name'] # if need to remove image, must to specify which one
|
|
],
|
|
required_one_of_args=[["password", "password_hash"]], # one of these args must be set
|
|
supports_check_mode={{ check_mode_support }}, # good practice is to support check_mode
|
|
)
|
|
|
|
# you main funciton is here
|
|
def run(self):
|
|
# do any arguments check if needed
|
|
data = self.preliminary_checks()
|
|
# check if we need to prepare various filters for results
|
|
filters = self.prepare_filters()
|
|
# run SDK call to get information about requested resource
|
|
result = self.conn.compute.resource_list(
|
|
filters=filters,
|
|
detailed=self.params['detailed'],
|
|
# any other parameters
|
|
)
|
|
# process results if they require a change
|
|
result = self.normalize_result()
|
|
self.results.update({'resource_name': result})
|
|
|
|
def preliminary_checks(self):
|
|
# you checks before running like arguments and options checks, etc
|
|
return data
|
|
|
|
def prepare_filters(self):
|
|
# process filters if they require additional checks
|
|
return filters
|
|
|
|
def normalize_result(self):
|
|
# process filters if they require additional checks
|
|
return result
|
|
|
|
|
|
def main():
|
|
module = {{ module_name.split("_")|map("capitalize")|list|join("") }}Module()
|
|
module()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|