summaryrefslogtreecommitdiff
path: root/lib/ansible/modules/storage/purestorage/purefa_vg.py
blob: 2bb3591b408e2272dcd2f8c4ee95821a176361f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
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 volume 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 volume 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()