1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4# (c) 2018, Simon Dodsley (simon@purestorage.com)
5# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
6
7from __future__ import absolute_import, division, print_function
8__metaclass__ = type
9
10ANSIBLE_METADATA = {'metadata_version': '1.1',
11                    'status': ['preview'],
12                    'supported_by': 'community'}
13
14DOCUMENTATION = r'''
15---
16module: purefb_s3acc
17version_added: '2.8'
18short_description: Create or delete FlashBlade Object Store accounts
19description:
20- Create or delete object store accounts on a Pure Storage FlashBlade.
21author:
22- Pure Storage Ansible Team (@sdodsley) <pure-ansible-team@purestorage.com>
23options:
24  state:
25    description:
26    - Create or delete object store account
27    default: present
28    choices: [ absent, present ]
29    type: str
30  name:
31    description:
32    - The name of object store account
33    type: str
34extends_documentation_fragment:
35- purestorage.fb
36'''
37
38EXAMPLES = r'''
39- name: Create object store account foo
40  purefb_s3acc:
41    name: foo
42    fb_url: 10.10.10.2
43    api_token: e31060a7-21fc-e277-6240-25983c6c4592
44
45- name: Delete object store account foo
46  purefb_s3acc:
47    name: foo
48    state: absent
49    fb_url: 10.10.10.2
50    api_token: e31060a7-21fc-e277-6240-25983c6c4592
51'''
52
53RETURN = r'''
54'''
55
56
57from ansible.module_utils.basic import AnsibleModule
58from ansible.module_utils.pure import get_blade, purefb_argument_spec
59
60
61MIN_REQUIRED_API_VERSION = '1.3'
62
63
64def get_s3acc(module, blade):
65    """Return Object Store Account or None"""
66    s3acc = None
67    accts = blade.object_store_accounts.list_object_store_accounts()
68    for acct in range(0, len(accts.items)):
69        if accts.items[acct].name == module.params['name']:
70            s3acc = accts.items[acct]
71    return s3acc
72
73
74def update_s3acc(module, blade):
75    """Update Object Store Account"""
76    changed = False
77    module.exit_json(changed=changed)
78
79
80def create_s3acc(module, blade):
81    """Create Object Store Account"""
82    changed = False
83    try:
84        blade.object_store_accounts.create_object_store_accounts(names=[module.params['name']])
85        changed = True
86    except Exception:
87        module.fail_json(msg='Object Store Account {0}: Creation failed'.format(module.params['name']))
88    module.exit_json(changed=changed)
89
90
91def delete_s3acc(module, blade):
92    """Delete Object Store Account"""
93    changed = False
94    count = len(blade.object_store_users.list_object_store_users(filter='name=\'' + module.params['name'] + '/*\'').items)
95    if count != 0:
96        module.fail_json(msg='Remove all Users from Object Store Account {0} before deletion'.format(module.params['name']))
97    else:
98        try:
99            blade.object_store_accounts.delete_object_store_accounts(names=[module.params['name']])
100            changed = True
101        except Exception:
102            module.fail_json(msg='Object Store Account {0}: Deletion failed'.format(module.params['name']))
103    module.exit_json(changed=changed)
104
105
106def main():
107    argument_spec = purefb_argument_spec()
108    argument_spec.update(dict(
109        name=dict(required=True, type='str'),
110        state=dict(default='present', choices=['present', 'absent']),
111    ))
112
113    module = AnsibleModule(argument_spec,
114                           supports_check_mode=False)
115
116    state = module.params['state']
117    blade = get_blade(module)
118    versions = blade.api_version.list_versions().versions
119
120    if MIN_REQUIRED_API_VERSION not in versions:
121        module.fail_json(msg='FlashBlade REST version not supported. Minimum version required: {0}'.format(MIN_REQUIRED_API_VERSION))
122
123    s3acc = get_s3acc(module, blade)
124
125    if state == 'absent' and s3acc:
126        delete_s3acc(module, blade)
127    elif state == 'present' and s3acc:
128        update_s3acc(module, blade)
129    elif not s3acc and state == 'present':
130        create_s3acc(module, blade)
131    else:
132        module.exit_json(changed=False)
133
134
135if __name__ == '__main__':
136    main()
137