From f4d336cf1f77d5161ed2cf35c010dece62b84408 Mon Sep 17 00:00:00 2001
From: Simon Dodsley <simon@purestorage.com>
Date: Tue, 27 Aug 2019 17:44:04 -0400
Subject: [PATCH] New module to manage volume groups on Pure Storage FlashArray
 (#58854)

---
 .../modules/storage/purestorage/purefa_vg.py  | 189 ++++++++++++++++++
 1 file changed, 189 insertions(+)
 create mode 100644 lib/ansible/modules/storage/purestorage/purefa_vg.py

diff --git a/lib/ansible/modules/storage/purestorage/purefa_vg.py b/lib/ansible/modules/storage/purestorage/purefa_vg.py
new file mode 100644
index 00000000000..661a28bdb53
--- /dev/null
+++ b/lib/ansible/modules/storage/purestorage/purefa_vg.py
@@ -0,0 +1,189 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (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_vg
+version_added: '2.9'
+short_description: Manage volume groups on Pure Storage FlashArrays
+description:
+- Create, delete or modify volume groups on Pure Storage FlashArrays.
+author:
+- Pure Storage Ansible Team (@sdodsley) <pure-ansible-team@purestorage.com>
+options:
+  vgroup:
+    description:
+    - The name of the volume group.
+    type: str
+    required: true
+  state:
+    description:
+    - Define whether the volume group should exist or not.
+    type: str
+    default: present
+    choices: [ absent, present ]
+  eradicate:
+    description:
+    - Define whether to eradicate the volume group on delete and leave in trash.
+    type : bool
+    default: 'no'
+extends_documentation_fragment:
+- purestorage.fa
+'''
+
+EXAMPLES = r'''
+- name: Create new volune group
+  purefa_vg:
+    vgroup: foo
+    fa_url: 10.10.10.2
+    api_token: e31060a7-21fc-e277-6240-25983c6c4592
+
+- name: Destroy volume group
+  purefa_vg:
+    vgroup: foo
+    fa_url: 10.10.10.2
+    api_token: e31060a7-21fc-e277-6240-25983c6c4592
+    state: absent
+
+- name: Recover deleted volune group
+  purefa_vg:
+    vgroup: foo
+    fa_url: 10.10.10.2
+    api_token: e31060a7-21fc-e277-6240-25983c6c4592
+
+- name: Destroy and Eradicate volume group
+  purefa_vg:
+    vgroup: foo
+    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
+
+
+VGROUP_API_VERSION = '1.13'
+
+
+def get_pending_vgroup(module, array):
+    """ Get Deleted Volume Group"""
+    vgroup = None
+    for vgrp in array.list_vgroups(pending=True):
+        if vgrp["name"] == module.params['vgroup'] and vgrp['time_remaining']:
+            vgroup = vgrp
+            break
+
+    return vgroup
+
+
+def get_vgroup(module, array):
+    """ Get Volume Group"""
+    vgroup = None
+    for vgrp in array.list_vgroups():
+        if vgrp["name"] == module.params['vgroup']:
+            vgroup = vgrp
+            break
+
+    return vgroup
+
+
+def make_vgroup(module, array):
+    """ Create Volume Group"""
+    changed = True
+    if not module.check_mode:
+        try:
+            array.create_vgroup(module.params['vgroup'])
+        except Exception:
+            module.fail_json(msg='creation of volume group {0} failed.'.format(module.params['vgroup']))
+
+    module.exit_json(changed=changed)
+
+
+def recover_vgroup(module, array):
+    """ Recover Volume Group"""
+    changed = True
+    if not module.check_mode:
+        try:
+            array.recover_vgroup(module.params['vgroup'])
+        except Exception:
+            module.fail_json(msg='Recovery of volume group {0} failed.'.format(module.params['vgroup']))
+
+    module.exit_json(changed=changed)
+
+
+def eradicate_vgroup(module, array):
+    """ Eradicate Volume Group"""
+    changed = True
+    if not module.check_mode:
+        try:
+            array.eradicate_vgroup(module.params['vgroup'])
+        except Exception:
+            module.fail_json(msg='Eradicating vgroup {0} failed.'.format(module.params['vgroup']))
+    module.exit_json(changed=changed)
+
+
+def delete_vgroup(module, array):
+    """ Delete Volume Group"""
+    changed = True
+    if not module.check_mode:
+        try:
+            array.destroy_vgroup(module.params['vgroup'])
+        except Exception:
+            module.fail_json(msg='Deleting vgroup {0} failed.'.format(module.params['vgroup']))
+    if module.params['eradicate']:
+        eradicate_vgroup(module, array)
+
+    module.exit_json(changed=changed)
+
+
+def main():
+    argument_spec = purefa_argument_spec()
+    argument_spec.update(dict(
+        vgroup=dict(type='str', required=True),
+        state=dict(type='str', default='present', choices=['absent', 'present']),
+        eradicate=dict(type='bool', default=False),
+    ))
+
+    module = AnsibleModule(argument_spec,
+                           supports_check_mode=True)
+
+    state = module.params['state']
+    array = get_system(module)
+    api_version = array._list_available_rest_versions()
+    if VGROUP_API_VERSION not in api_version:
+        module.fail_json(msg='API version does not support volume groups.')
+
+    vgroup = get_vgroup(module, array)
+    xvgroup = get_pending_vgroup(module, array)
+
+    if xvgroup and state == 'present':
+        recover_vgroup(module, array)
+    elif vgroup and state == 'absent':
+        delete_vgroup(module, array)
+    elif xvgroup and state == 'absent' and module.params['eradicate']:
+        eradicate_vgroup(module, array)
+    elif not vgroup and not xvgroup and state == 'present':
+        make_vgroup(module, array)
+    elif vgroup is None and state == 'absent':
+        module.exit_json(changed=False)
+
+    module.exit_json(changed=False)
+
+
+if __name__ == '__main__':
+    main()