From 7ce1d49c5528b763c5f5915ea71c5cade07c47a7 Mon Sep 17 00:00:00 2001 From: Simon Dodsley Date: Wed, 25 Oct 2017 13:34:38 -0400 Subject: [PATCH] Add new purefa_pgsnap module Supplies the ability to create and destroy FlashArray protection groups. --- .../storage/purestorage/purefa_pgsnap.py | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 lib/ansible/modules/storage/purestorage/purefa_pgsnap.py diff --git a/lib/ansible/modules/storage/purestorage/purefa_pgsnap.py b/lib/ansible/modules/storage/purestorage/purefa_pgsnap.py new file mode 100644 index 00000000000..a9f1ec60970 --- /dev/null +++ b/lib/ansible/modules/storage/purestorage/purefa_pgsnap.py @@ -0,0 +1,173 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# (c) 2017, Simon Dodsley (simon@purestorage.com) +# 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 = r''' +--- +module: purefa_pgsnap +version_added: '2.6' +short_description: Manage protection group snapshots on Pure Storage FlashArrays +description: +- Create or delete protection group snapshots on Pure Storage FlashArray. +author: +- Simon Dodsley (@sdodsley) +options: + name: + description: + - The name of the source protection group. + required: true + suffix: + description: + - Suffix of snapshot name. + state: + description: + - Define whether the protection group snapshot should exist or not. + choices: [ absent, present ] + default: present + eradicate: + description: + - Define whether to eradicate the snapshot on delete or leave in trash. + type: bool + default: 'no' +extends_documentation_fragment: +- purestorage +''' + +EXAMPLES = r''' +- name: Create protection group snapshot foo.ansible + purefa_pgsnap: + name: foo + suffix: ansible + fa_url: 10.10.10.2 + api_token: e31060a7-21fc-e277-6240-25983c6c4592 + state: present + +- name: Delete and eradicate protection group snapshot named foo.snap + purefa_pgsnap: + name: foo + suffix: snap + eradicate: true + fa_url: 10.10.10.2 + api_token: e31060a7-21fc-e277-6240-25983c6c4592 + state: absent +''' + +RETURN = r''' +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.pure import get_system, purefa_argument_spec + +from datetime import datetime + +try: + from purestorage import purestorage + HAS_PURESTORAGE = True +except ImportError: + HAS_PURESTORAGE = False + + +def get_pgroup(module, array): + """Return Protection Group or None""" + try: + return array.get_pgroup(module.params['name']) + except: + return None + + +def get_pgsnapshot(module, array): + """Return Snapshot or None""" + try: + snapname = module.params['name'] + "." + module.params['suffix'] + for s in array.get_pgroup(module.params['name'], snap='true'): + if s['name'] == snapname: + return snapname + except: + return None + + +def create_pgsnapshot(module, array): + """Create Protection Group Snapshot""" + if not module.check_mode: + try: + array.create_pgroup_snapshot(source=module.params['name'], + suffix=module.params['suffix'], + snap=True, + apply_retention=True) + changed = False + except: + changed = False + module.exit_json(changed=changed) + + +def update_pgsnapshot(module, array): + """Update Protection Group Snapshot""" + changed = False + module.exit_json(changed=changed) + + +def delete_pgsnapshot(module, array): + """ Delete Protection Group Snapshot""" + if not module.check_mode: + snapname = module.params['name'] + "." + module.params['suffix'] + try: + array.destroy_pgroup(snapname) + chaned = True + if module.params['eradicate']: + try: + array.eradicate_pgroup(snapname) + changed = True + except: + changed = False + except: + changed = False + module.exit_json(changed=changed) + + +def main(): + argument_spec = purefa_argument_spec() + argument_spec.update(dict( + name=dict(type='str', required=True), + suffix=dict(type='str'), + eradicate=dict(type='bool', default=False), + state=dict(type='str', default='present', choices=['absent', 'present']), + )) + + module = AnsibleModule(argument_spec, + supports_check_mode=True) + + if not HAS_PURESTORAGE: + module.fail_json(msg='purestorage sdk is required for this module in volume') + + if module.params['suffix'] is None: + suffix = "snap-" + str((datetime.utcnow() - datetime(1970, 1, 1, 0, 0, 0, 0)).total_seconds()) + module.params['suffix'] = suffix.replace(".", "") + + state = module.params['state'] + array = get_system(module) + pgroup = get_pgroup(module, array) + pgsnap = get_pgsnapshot(module, array) + + if state == 'present' and pgroup and not pgsnap: + create_pgsnapshot(module, array) + elif state == 'present' and pgroup and pgsnap: + update_pgsnapshot(module, array) + elif state == 'present' and not pgroup: + update_pgsnapshot(module, array) + elif state == 'absent' and pgsnap: + delete_pgsnapshot(module, array) + elif state == 'absent' and not pgsnap: + module.exit_json(changed=False) + + +if __name__ == '__main__': + main()