From 0447a88c807b766b9d1ed2ab8bb6a40cdaca2364 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Tue, 31 Mar 2015 16:37:07 -0400 Subject: [PATCH] Add OpenStack Object module --- .../modules/cloud/openstack/os_object.py | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 lib/ansible/modules/cloud/openstack/os_object.py diff --git a/lib/ansible/modules/cloud/openstack/os_object.py b/lib/ansible/modules/cloud/openstack/os_object.py new file mode 100644 index 00000000000..ed58bb1e705 --- /dev/null +++ b/lib/ansible/modules/cloud/openstack/os_object.py @@ -0,0 +1,125 @@ +#!/usr/bin/python + +# Copyright (c) 2015 Hewlett-Packard Development Company, L.P. +# Copyright (c) 2013, Benno Joy +# +# This module 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. +# +# This software 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 this software. If not, see . + +try: + import shade + HAS_SHADE = True +except ImportError: + HAS_SHADE = False + + +DOCUMENTATION = ''' +--- +module: os_object +short_description: Create or Delete objects and containers from OpenStack +version_added: "1.10" +extends_documentation_fragment: openstack +description: + - Create or Delete objects and containers from OpenStack +options: + container: + description: + - The name of the container in which to create the object + required: true + name: + description: + - Name to be give to the object. If omitted, operations will be on + the entire container + required: false + file: + description: + - Path to local file to be uploaded. + required: false + container_access: + description: + - desired container access level. + required: false + choices: ['private', 'public'] + default: private + state: + description: + - Should the resource be present or absent. + choices: [present, absent] + default: present +requirements: ["shade"] +''' + +EXAMPLES = ''' +# Creates a object named 'fstab' in the 'config' container +- os_object: cloud=mordred state=present name=fstab container=config file=/etc/fstab + +# Deletes a container called config and all of its contents +- os_object: cloud=rax-iad state=absent container=config +''' + + +def process_object( + cloud_obj, container, name, filename, container_access, **kwargs): + + changed = False + container_obj = cloud_obj.get_container(container) + if kwargs['state'] == 'present': + if not container_obj: + container_obj = cloud_obj.create_container(container) + changed = True + if cloud_obj.get_container_access(container) != container_access: + cloud_obj.set_container_access(container, container_access) + changed = True + if name: + if cloud_obj.is_object_stale(container, name, filename): + cloud_obj.create_object(container, name, filename) + changed = True + else: + if container_obj: + if name: + if cloud_obj.get_object_metadata(container, name): + cloud_obj.delete_object(container, name) + changed= True + else: + cloud_obj.delete_container(container) + changed= True + return changed + + +def main(): + argument_spec = openstack_full_argument_spec( + name=dict(required=False, default=None), + container=dict(required=True), + filename=dict(required=False, default=None), + container_access=dict(default='private', choices=['private', 'public']), + state=dict(default='present', choices=['absent', 'present']), + ) + module_kwargs = openstack_module_kwargs() + module = AnsibleModule(argument_spec, **module_kwargs) + + if not HAS_SHADE: + module.fail_json(msg='shade is required for this module') + + try: + cloud = shade.openstack_cloud(**module.params) + + changed = process_object(cloud, **module.params) + + module.exit_json(changed=changed, result="success") + except shade.OpenStackCloudException as e: + module.fail_json(msg=e.message) + +# this is magic, see lib/ansible/module_common.py +from ansible.module_utils.basic import * +from ansible.module_utils.openstack import * +main()