Server IP : 85.214.239.14 / Your IP : 3.145.40.234 Web Server : Apache/2.4.62 (Debian) System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.18 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /usr/lib/python3/dist-packages/ansible_collections/infinidat/infinibox/plugins/modules/ |
Upload File : |
#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright: (c) 2022, Infinidat <info@infinidat.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 DOCUMENTATION = r''' --- module: infini_fs version_added: '2.3.0' short_description: Create, Delete or Modify filesystems on Infinibox description: - This module creates, deletes or modifies filesystems on Infinibox. author: David Ohlemacher (@ohlemacher) options: name: description: - File system name. required: true type: str state: description: - Creates/Modifies file system when present or removes when absent. required: false default: present choices: [ "stat", "present", "absent" ] type: str thin_provision: description: - Whether the master file system should be thin or thick provisioned. required: false default: true type: bool pool: description: - Pool that will host file system. required: true type: str size: description: - File system size in MB, GB or TB units. See examples. required: false type: str extends_documentation_fragment: - infinibox requirements: - capacity ''' EXAMPLES = r''' - name: Create new file system named foo under pool named bar infini_fs: name: foo size: 1TB pool: bar thin_provision: true state: present user: admin password: secret system: ibox001 ''' # RETURN = r''' # ''' from ansible.module_utils.basic import AnsibleModule, missing_required_lib import traceback try: from ansible_collections.infinidat.infinibox.plugins.module_utils.infinibox import ( HAS_INFINISDK, api_wrapper, infinibox_argument_spec, get_pool, get_system, get_filesystem ) except ModuleNotFoundError: from infinibox import ( # Used when hacking HAS_INFINISDK, api_wrapper, infinibox_argument_spec, get_pool, get_system, get_filesystem ) CAPACITY_IMP_ERR = None try: from capacity import KiB, Capacity HAS_CAPACITY = True except ImportError: HAS_CAPACITY = False @api_wrapper def create_filesystem(module, system): """Create Filesystem""" changed = True if not module.check_mode: if module.params['thin_provision']: provisioning = 'THIN' else: provisioning = 'THICK' filesystem = system.filesystems.create( name=module.params['name'], pool=get_pool(module, system), provtype=provisioning, ) if module.params['size']: size = Capacity(module.params['size']).roundup(64 * KiB) filesystem.update_size(size) return changed @api_wrapper def update_filesystem(module, filesystem): """Update Filesystem""" changed = False if module.params['size']: size = Capacity(module.params['size']).roundup(64 * KiB) if filesystem.get_size() != size: if not module.check_mode: filesystem.update_size(size) changed = True provisioning = str(filesystem.get_provisioning()) if provisioning == 'THICK' and module.params['thin_provision']: if not module.check_mode: filesystem.update_provisioning('THIN') changed = True if provisioning == 'THIN' and not module.params['thin_provision']: if not module.check_mode: filesystem.update_provisioning('THICK') changed = True return changed @api_wrapper def delete_filesystem(module, filesystem): """ Delete Filesystem""" if not module.check_mode: filesystem.delete() module.exit_json(changed=True) def get_sys_pool_fs(module): system = get_system(module) pool = get_pool(module, system) filesystem = get_filesystem(module, system) return (system, pool, filesystem) def handle_stat(module): system, pool, filesystem = get_sys_pool_fs(module) if not pool: module.fail_json(msg='Pool {0} not found'.format(module.params['pool'])) if not filesystem: module.fail_json(msg='File system {0} not found'.format(module.params['name'])) fields = filesystem.get_fields() # from_cache=True, raw_value=True) name = fields.get("name", None) used = fields.get('used_size', None) filesystem_id = fields.get('id', None) provisioning = fields.get('provisioning', None) result = dict( changed=False, name=name, size=str(filesystem.get_size()), used=str(used), filesystem_id=filesystem_id, provisioning=provisioning, msg='File system stat found' ) module.exit_json(**result) def handle_present(module): system, pool, filesystem = get_sys_pool_fs(module) if not pool: module.fail_json(msg='Pool {0} not found'.format(module.params['pool'])) if not filesystem: changed = create_filesystem(module, system) module.exit_json(changed=changed, msg="File system created") else: changed = update_filesystem(module, filesystem) module.exit_json(changed=changed, msg="File system updated") def handle_absent(module): system, pool, filesystem = get_sys_pool_fs(module) if not pool or not filesystem: module.exit_json(changed=False, msg="File system already absent") else: changed = delete_filesystem(module, filesystem) module.exit_json(changed=changed, msg="File system removed") def execute_state(module): state = module.params['state'] try: if state == 'stat': handle_stat(module) elif state == 'present': handle_present(module) elif state == 'absent': handle_absent(module) else: module.fail_json(msg='Internal handler error. Invalid state: {0}'.format(state)) finally: system = get_system(module) system.logout() def main(): argument_spec = infinibox_argument_spec() argument_spec.update( dict( name=dict(required=True), state=dict(default='present', choices=['stat', 'present', 'absent']), pool=dict(required=True), size=dict(), thin_provision=dict(type=bool, default=True), ) ) module = AnsibleModule(argument_spec, supports_check_mode=True) if not HAS_INFINISDK: module.fail_json(msg=missing_required_lib('infinisdk')) if not HAS_CAPACITY: module.fail_json(msg=missing_required_lib('capacity')) if module.params['size']: try: Capacity(module.params['size']) except Exception: module.fail_json(msg='size (Physical Capacity) should be defined in MB, GB, TB or PB units') execute_state(module) if __name__ == '__main__': main()