New module to manage volume groups on Pure Storage FlashArray (#58854)
This commit is contained in:
parent
41778a8e12
commit
f4d336cf1f
1 changed files with 189 additions and 0 deletions
189
lib/ansible/modules/storage/purestorage/purefa_vg.py
Normal file
189
lib/ansible/modules/storage/purestorage/purefa_vg.py
Normal 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()
|
Loading…
Reference in a new issue