diff options
Diffstat (limited to 'lib/ansible/modules/cloud/amazon/elasticache_parameter_group.py')
-rw-r--r-- | lib/ansible/modules/cloud/amazon/elasticache_parameter_group.py | 356 |
1 files changed, 0 insertions, 356 deletions
diff --git a/lib/ansible/modules/cloud/amazon/elasticache_parameter_group.py b/lib/ansible/modules/cloud/amazon/elasticache_parameter_group.py deleted file mode 100644 index 50951d24a0..0000000000 --- a/lib/ansible/modules/cloud/amazon/elasticache_parameter_group.py +++ /dev/null @@ -1,356 +0,0 @@ -#!/usr/bin/python -# This file is part of Ansible -# 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: elasticache_parameter_group -short_description: Manage cache parameter groups in Amazon ElastiCache. -description: - - Manage cache security groups in Amazon ElastiCache. - - Returns information about the specified cache cluster. -version_added: "2.3" -author: "Sloane Hertel (@s-hertel)" -extends_documentation_fragment: - - aws - - ec2 -requirements: [ boto3, botocore ] -options: - group_family: - description: - - The name of the cache parameter group family that the cache parameter group can be used with. - Required when creating a cache parameter group. - choices: ['memcached1.4', 'memcached1.5', 'redis2.6', 'redis2.8', 'redis3.2', 'redis4.0', 'redis5.0'] - type: str - name: - description: - - A user-specified name for the cache parameter group. - required: yes - type: str - description: - description: - - A user-specified description for the cache parameter group. - type: str - state: - description: - - Idempotent actions that will create/modify, destroy, or reset a cache parameter group as needed. - choices: ['present', 'absent', 'reset'] - required: true - type: str - values: - description: - - A user-specified dictionary of parameters to reset or modify for the cache parameter group. - type: dict -""" - -EXAMPLES = """ -# Note: None of these examples set aws_access_key, aws_secret_key, or region. -# It is assumed that their matching environment variables are set. ---- -- hosts: localhost - connection: local - tasks: - - name: 'Create a test parameter group' - elasticache_parameter_group: - name: 'test-param-group' - group_family: 'redis3.2' - description: 'This is a cache parameter group' - state: 'present' - - name: 'Modify a test parameter group' - elasticache_parameter_group: - name: 'test-param-group' - values: - activerehashing: yes - client-output-buffer-limit-normal-hard-limit: 4 - state: 'present' - - name: 'Reset all modifiable parameters for the test parameter group' - elasticache_parameter_group: - name: 'test-param-group' - state: reset - - name: 'Delete a test parameter group' - elasticache_parameter_group: - name: 'test-param-group' - state: 'absent' -""" - -RETURN = """ -elasticache: - description: cache parameter group information and response metadata - returned: always - type: dict - sample: - cache_parameter_group: - cache_parameter_group_family: redis3.2 - cache_parameter_group_name: test-please-delete - description: "initial description" - response_metadata: - http_headers: - content-length: "562" - content-type: text/xml - date: "Mon, 06 Feb 2017 22:14:08 GMT" - x-amzn-requestid: 947291f9-ecb9-11e6-85bd-3baa4eca2cc1 - http_status_code: 200 - request_id: 947291f9-ecb9-11e6-85bd-3baa4eca2cc1 - retry_attempts: 0 -changed: - description: if the cache parameter group has changed - returned: always - type: bool - sample: - changed: true -""" - -# import module snippets -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.ec2 import boto3_conn, get_aws_connection_info, ec2_argument_spec, camel_dict_to_snake_dict -from ansible.module_utils._text import to_text -from ansible.module_utils.six import string_types -import traceback - -try: - import boto3 - import botocore - HAS_BOTO3 = True -except ImportError: - HAS_BOTO3 = False - - -def create(module, conn, name, group_family, description): - """ Create ElastiCache parameter group. """ - try: - response = conn.create_cache_parameter_group(CacheParameterGroupName=name, CacheParameterGroupFamily=group_family, Description=description) - changed = True - except botocore.exceptions.ClientError as e: - module.fail_json(msg="Unable to create cache parameter group.", exception=traceback.format_exc(), **camel_dict_to_snake_dict(e.response)) - return response, changed - - -def delete(module, conn, name): - """ Delete ElastiCache parameter group. """ - try: - conn.delete_cache_parameter_group(CacheParameterGroupName=name) - response = {} - changed = True - except botocore.exceptions.ClientError as e: - module.fail_json(msg="Unable to delete cache parameter group.", exception=traceback.format_exc(), **camel_dict_to_snake_dict(e.response)) - return response, changed - - -def make_current_modifiable_param_dict(module, conn, name): - """ Gets the current state of the cache parameter group and creates a dict with the format: {ParameterName: [Allowed_Values, DataType, ParameterValue]}""" - current_info = get_info(conn, name) - if current_info is False: - module.fail_json(msg="Could not connect to the cache parameter group %s." % name) - - parameters = current_info["Parameters"] - modifiable_params = {} - - for param in parameters: - if param["IsModifiable"]: - modifiable_params[param["ParameterName"]] = [param.get("AllowedValues")] - modifiable_params[param["ParameterName"]].append(param["DataType"]) - modifiable_params[param["ParameterName"]].append(param.get("ParameterValue")) - return modifiable_params - - -def check_valid_modification(module, values, modifiable_params): - """ Check if the parameters and values in values are valid. """ - changed_with_update = False - - for parameter in values: - new_value = values[parameter] - - # check valid modifiable parameters - if parameter not in modifiable_params: - module.fail_json(msg="%s is not a modifiable parameter. Valid parameters to modify are: %s." % (parameter, modifiable_params.keys())) - - # check allowed datatype for modified parameters - str_to_type = {"integer": int, "string": string_types} - expected_type = str_to_type[modifiable_params[parameter][1]] - if not isinstance(new_value, expected_type): - if expected_type == str: - if isinstance(new_value, bool): - values[parameter] = "yes" if new_value else "no" - else: - values[parameter] = to_text(new_value) - elif expected_type == int: - if isinstance(new_value, bool): - values[parameter] = 1 if new_value else 0 - else: - module.fail_json(msg="%s (type %s) is not an allowed value for the parameter %s. Expected a type %s." % - (new_value, type(new_value), parameter, modifiable_params[parameter][1])) - else: - module.fail_json(msg="%s (type %s) is not an allowed value for the parameter %s. Expected a type %s." % - (new_value, type(new_value), parameter, modifiable_params[parameter][1])) - - # check allowed values for modifiable parameters - choices = modifiable_params[parameter][0] - if choices: - if not (to_text(new_value) in choices or isinstance(new_value, int)): - module.fail_json(msg="%s is not an allowed value for the parameter %s. Valid parameters are: %s." % - (new_value, parameter, choices)) - - # check if a new value is different from current value - if to_text(values[parameter]) != modifiable_params[parameter][2]: - changed_with_update = True - - return changed_with_update, values - - -def check_changed_parameter_values(values, old_parameters, new_parameters): - """ Checking if the new values are different than the old values. """ - changed_with_update = False - - # if the user specified parameters to reset, only check those for change - if values: - for parameter in values: - if old_parameters[parameter] != new_parameters[parameter]: - changed_with_update = True - break - # otherwise check all to find a change - else: - for parameter in old_parameters: - if old_parameters[parameter] != new_parameters[parameter]: - changed_with_update = True - break - - return changed_with_update - - -def modify(module, conn, name, values): - """ Modify ElastiCache parameter group to reflect the new information if it differs from the current. """ - # compares current group parameters with the parameters we've specified to to a value to see if this will change the group - format_parameters = [] - for key in values: - value = to_text(values[key]) - format_parameters.append({'ParameterName': key, 'ParameterValue': value}) - try: - response = conn.modify_cache_parameter_group(CacheParameterGroupName=name, ParameterNameValues=format_parameters) - except botocore.exceptions.ClientError as e: - module.fail_json(msg="Unable to modify cache parameter group.", exception=traceback.format_exc(), **camel_dict_to_snake_dict(e.response)) - return response - - -def reset(module, conn, name, values): - """ Reset ElastiCache parameter group if the current information is different from the new information. """ - # used to compare with the reset parameters' dict to see if there have been changes - old_parameters_dict = make_current_modifiable_param_dict(module, conn, name) - - format_parameters = [] - - # determine whether to reset all or specific parameters - if values: - all_parameters = False - format_parameters = [] - for key in values: - value = to_text(values[key]) - format_parameters.append({'ParameterName': key, 'ParameterValue': value}) - else: - all_parameters = True - - try: - response = conn.reset_cache_parameter_group(CacheParameterGroupName=name, ParameterNameValues=format_parameters, ResetAllParameters=all_parameters) - except botocore.exceptions.ClientError as e: - module.fail_json(msg="Unable to reset cache parameter group.", exception=traceback.format_exc(), **camel_dict_to_snake_dict(e.response)) - - # determine changed - new_parameters_dict = make_current_modifiable_param_dict(module, conn, name) - changed = check_changed_parameter_values(values, old_parameters_dict, new_parameters_dict) - - return response, changed - - -def get_info(conn, name): - """ Gets info about the ElastiCache parameter group. Returns false if it doesn't exist or we don't have access. """ - try: - data = conn.describe_cache_parameters(CacheParameterGroupName=name) - return data - except botocore.exceptions.ClientError as e: - return False - - -def main(): - argument_spec = ec2_argument_spec() - argument_spec.update( - dict( - group_family=dict(type='str', choices=['memcached1.4', 'memcached1.5', 'redis2.6', 'redis2.8', 'redis3.2', 'redis4.0', 'redis5.0']), - name=dict(required=True, type='str'), - description=dict(default='', type='str'), - state=dict(required=True, choices=['present', 'absent', 'reset']), - values=dict(type='dict'), - ) - ) - module = AnsibleModule(argument_spec=argument_spec) - - if not HAS_BOTO3: - module.fail_json(msg='boto required for this module') - - parameter_group_family = module.params.get('group_family') - parameter_group_name = module.params.get('name') - group_description = module.params.get('description') - state = module.params.get('state') - values = module.params.get('values') - - # Retrieve any AWS settings from the environment. - region, ec2_url, aws_connect_kwargs = get_aws_connection_info(module, boto3=True) - if not region: - module.fail_json(msg="Either region or AWS_REGION or EC2_REGION environment variable or boto config aws_region or ec2_region must be set.") - - connection = boto3_conn(module, conn_type='client', - resource='elasticache', region=region, - endpoint=ec2_url, **aws_connect_kwargs) - - exists = get_info(connection, parameter_group_name) - - # check that the needed requirements are available - if state == 'present' and not (exists or parameter_group_family): - module.fail_json(msg="Creating a group requires a family group.") - elif state == 'reset' and not exists: - module.fail_json(msg="No group %s to reset. Please create the group before using the state 'reset'." % parameter_group_name) - - # Taking action - changed = False - if state == 'present': - if exists: - # confirm that the group exists without any actions - if not values: - response = exists - changed = False - # modify existing group - else: - modifiable_params = make_current_modifiable_param_dict(module, connection, parameter_group_name) - changed, values = check_valid_modification(module, values, modifiable_params) - response = modify(module, connection, parameter_group_name, values) - # create group - else: - response, changed = create(module, connection, parameter_group_name, parameter_group_family, group_description) - if values: - modifiable_params = make_current_modifiable_param_dict(module, connection, parameter_group_name) - changed, values = check_valid_modification(module, values, modifiable_params) - response = modify(module, connection, parameter_group_name, values) - elif state == 'absent': - if exists: - # delete group - response, changed = delete(module, connection, parameter_group_name) - else: - response = {} - changed = False - elif state == 'reset': - response, changed = reset(module, connection, parameter_group_name, values) - - facts_result = dict(changed=changed, elasticache=camel_dict_to_snake_dict(response)) - - module.exit_json(**facts_result) - - -if __name__ == '__main__': - main() |