From f2c661982660b5bc71931104d53926d94f0bdc6b Mon Sep 17 00:00:00 2001
From: Monty Taylor <mordred@inaugust.com>
Date: Tue, 31 Mar 2015 16:37:07 -0400
Subject: [PATCH] Add OpenStack Object module

---
 cloud/openstack/os_object.py | 125 +++++++++++++++++++++++++++++++++++
 1 file changed, 125 insertions(+)
 create mode 100644 cloud/openstack/os_object.py

diff --git a/cloud/openstack/os_object.py b/cloud/openstack/os_object.py
new file mode 100644
index 00000000000..ed58bb1e705
--- /dev/null
+++ b/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 <benno@ansible.com>
+#
+# 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 <http://www.gnu.org/licenses/>.
+
+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()