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