From 2f9886e501e5a285c8c89c4f41445a06dac67b85 Mon Sep 17 00:00:00 2001 From: "Christopher H. Laco" Date: Fri, 8 Nov 2013 21:51:45 -0600 Subject: [PATCH] Add rax_queue module to create/delete Rackspace Cloud Queues --- cloud/rax_queue | 162 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 cloud/rax_queue diff --git a/cloud/rax_queue b/cloud/rax_queue new file mode 100644 index 00000000000..ee873739a34 --- /dev/null +++ b/cloud/rax_queue @@ -0,0 +1,162 @@ +#!/usr/bin/python -tt +# 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 . + +DOCUMENTATION = ''' +--- +module: rax_queue +short_description: create / delete a queue in Rackspace Public Cloud +description: + - creates / deletes a Rackspace Public Cloud queue. +version_added: "1.5" +options: + api_key: + description: + - Rackspace API key (overrides C(credentials)) + credentials: + description: + - File to find the Rackspace credentials in (ignored if C(api_key) and + C(username) are provided) + default: null + aliases: ['creds_file'] + name: + description: + - Name to give the queue + default: null + region: + description: + - Region to create the load balancer in + default: DFW + state: + description: + - Indicate desired state of the resource + choices: ['present', 'absent'] + default: present + username: + description: + - Rackspace username (overrides C(credentials)) +requirements: [ "pyrax" ] +author: Christopher H. Laco, Matt Martz +notes: + - The following environment variables can be used, C(RAX_USERNAME), + C(RAX_API_KEY), C(RAX_CREDS_FILE), C(RAX_CREDENTIALS), C(RAX_REGION). + - C(RAX_CREDENTIALS) and C(RAX_CREDS_FILE) points to a credentials file + appropriate for pyrax. See U(https://github.com/rackspace/pyrax/blob/master/docs/getting_started.md#authenticating) + - C(RAX_USERNAME) and C(RAX_API_KEY) obviate the use of a credentials file + - C(RAX_REGION) defines a Rackspace Public Cloud region (DFW, ORD, LON, ...) +''' + +EXAMPLES = ''' +- name: Build a Queue + gather_facts: False + hosts: local + connection: local + tasks: + - name: Queue create request + local_action: + module: rax_queue + credentials: ~/.raxpub + client_id: unique-client-name + name: my-queue + region: DFW + state: present + register: my_queue +''' + +import sys +import os + + +try: + import pyrax +except ImportError: + print("failed=True msg='pyrax is required for this module'") + sys.exit(1) + + +def cloud_queue(module, state, name): + for arg in (state, name): + if not arg: + module.fail_json(msg='%s is required for rax_queue' % arg) + + changed = False + queues = [] + instance = {} + + cq = pyrax.queues + + for queue in cq.list(): + if name != queue.name: + continue + + queues.append(queue) + + if len(queues) > 1: + module.fail_json(msg='Multiple Queues were matched by name') + + if state == 'present': + if not queues: + try: + queue = cq.create(name) + changed = True + except Exception, e: + module.fail_json(msg='%s' % e.message) + else: + queue = queues[0] + + instance = dict(name=queue.name) + result = dict(changed=changed, queue=instance) + module.exit_json(**result) + + elif state == 'absent': + if queues: + queue = queues[0] + try: + queue.delete() + changed = True + except Exception, e: + module.fail_json(msg='%s' % e.message) + + module.exit_json(changed=changed, queue=instance) + + +def main(): + argument_spec = rax_argument_spec() + argument_spec.update( + dict( + name=dict(), + state=dict(default='present', choices=['present', 'absent']), + ) + ) + + module = AnsibleModule( + argument_spec=argument_spec, + required_together=rax_required_together() + ) + + name = module.params.get('name') + state = module.params.get('state') + + setup_rax_module(module, pyrax) + + cloud_queue(module, state, name) + + +# import module snippets +from ansible.module_utils.basic import * +from ansible.module_utils.rax import * + +### invoke the module +main()