From 524c5190b80dce849a30dca3f7a89935dd7b28a7 Mon Sep 17 00:00:00 2001 From: Tzur Eliyahu Date: Mon, 29 Oct 2018 15:50:50 +0200 Subject: [PATCH] =?UTF-8?q?IBM=5FStorage:=20Added=20a=20module=20to=20defi?= =?UTF-8?q?ne=20volume=20mapping=20on=20IBM=20spectrum=20=E2=80=A6=20(#451?= =?UTF-8?q?10)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * IBM_Storage: Added a module to define volume mapping on IBM spectrum Accelerate storage systems. * docs fix * IBM_storage: review and pep8 fixes --- .../modules/storage/ibm/ibm_sa_vol_map.py | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 lib/ansible/modules/storage/ibm/ibm_sa_vol_map.py diff --git a/lib/ansible/modules/storage/ibm/ibm_sa_vol_map.py b/lib/ansible/modules/storage/ibm/ibm_sa_vol_map.py new file mode 100644 index 00000000000..2a48d468fa9 --- /dev/null +++ b/lib/ansible/modules/storage/ibm/ibm_sa_vol_map.py @@ -0,0 +1,140 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright (C) 2018 IBM CORPORATION +# Author(s): Tzur Eliyahu +# +# 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 = {'status': ['preview'], + 'supported_by': 'community', + 'metadata_version': '1.1'} + +DOCUMENTATION = ''' +--- +module: ibm_sa_vol_map +short_description: Handles volume mapping on an IBM Spectrum Accelerate storage array. +version_added: "2.8" + +description: + - "This module maps volumes to or unmaps them from the hosts on + IBM Spectrum Accelerate storage systems." + +options: + vol: + description: + - Volume name. + required: true + state: + default: "present" + choices: [ "present", "absent" ] + description: + - When the state is present the volume is mapped. + When the state is absent, the volume is meant to be unmapped. + required: true + cluster: + description: + - Maps the volume to a cluster. + required: false + host: + description: + - Maps the volume to a host. + required: false + lun: + description: + - The LUN identifier. + required: false + override: + description: + - Overrides the existing volume mapping. + required: false + +extends_documentation_fragment: + - ibm_storage + +author: + - Tzur Eliyahu (tzure@il.ibm.com) +''' + +EXAMPLES = ''' +- name: Map volume to host. + ibm_sa_vol_map: + vol: volume_name + lun: 1 + host: host_name + username: admin + password: secret + endpoints: hostdev-system + state: present + +- name: Map volume to cluster. + ibm_sa_vol_map: + vol: volume_name + lun: 1 + cluster: cluster_name + username: admin + password: secret + endpoints: hostdev-system + state: present + +- name: Unmap volume. + ibm_sa_vol_map: + host: host_name + username: admin + password: secret + endpoints: hostdev-system + state: absent +''' +RETURN = ''' +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.ibm_sa_utils import (execute_pyxcli_command, + connect_ssl, spectrum_accelerate_spec, is_pyxcli_installed) + + +def main(): + argument_spec = spectrum_accelerate_spec() + argument_spec.update( + dict( + state=dict(default='present', choices=['present', 'absent']), + vol=dict(required=True), + lun=dict(), + cluster=dict(), + host=dict(), + override=dict() + ) + ) + + module = AnsibleModule(argument_spec) + is_pyxcli_installed(module) + + xcli_client = connect_ssl(module) + # required args + mapping = False + try: + mapped_hosts = xcli_client.cmd.vol_mapping_list( + vol=module.params.get('vol')).as_list + for host in mapped_hosts: + if host['host'] == module.params.get("host", ""): + mapping = True + except Exception: + pass + state = module.params['state'] + + state_changed = False + if state == 'present' and not mapping: + state_changed = execute_pyxcli_command(module, 'map_vol', xcli_client) + if state == 'absent' and mapping: + state_changed = execute_pyxcli_command( + module, 'unmap_vol', xcli_client) + + module.exit_json(changed=state_changed) + + +if __name__ == '__main__': + main()