New module to manage volume groups on Pure Storage FlashArray (#58854)

This commit is contained in:
Simon Dodsley 2019-08-27 17:44:04 -04:00 committed by John L
parent 41778a8e12
commit f4d336cf1f

View file

@ -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()