diff options
Diffstat (limited to 'ansible_collections/dellemc/unity/plugins/modules/smbshare.py')
-rw-r--r-- | ansible_collections/dellemc/unity/plugins/modules/smbshare.py | 877 |
1 files changed, 877 insertions, 0 deletions
diff --git a/ansible_collections/dellemc/unity/plugins/modules/smbshare.py b/ansible_collections/dellemc/unity/plugins/modules/smbshare.py new file mode 100644 index 00000000..ae5fe182 --- /dev/null +++ b/ansible_collections/dellemc/unity/plugins/modules/smbshare.py @@ -0,0 +1,877 @@ +#!/usr/bin/python +# Copyright: (c) 2020, Dell Technologies + +# Apache License version 2.0 (see MODULE-LICENSE or http://www.apache.org/licenses/LICENSE-2.0.txt) + +from __future__ import (absolute_import, division, print_function) + +__metaclass__ = type + +DOCUMENTATION = r''' +--- +module: smbshare +version_added: '1.1.0' +short_description: Manage SMB shares on Unity storage system +extends_documentation_fragment: +- dellemc.unity.unity +author: +- P Srinivas Rao (@srinivas-rao5) <ansible.team@dell.com> +description: +- Managing SMB Shares on Unity storage system includes create, get, + modify, and delete the smb shares. +options: + share_name: + description: + - Name of the SMB share. + - Required during creation of the SMB share. + - For all other operations either I(share_name) or I(share_id) is required. + type: str + share_id: + description: + - ID of the SMB share. + - Should not be specified during creation. Id is auto generated. + - For all other operations either I(share_name) or I(share_id) is required. + - If I(share_id) is used then no need to pass nas_server/filesystem/snapshot/path. + type: str + path: + description: + - Local path to the file system/Snapshot or any existing sub-folder of + the file system/Snapshot that is shared over the network. + - Path is relative to the root of the filesystem. + - Required for creation of the SMB share. + type: str + filesystem_id: + description: + - The ID of the File System. + - Either I(filesystem_name) or I(filesystem_id) is required for creation of the SMB share for filesystem. + - If I(filesystem_name) is specified, then I(nas_server_name)/I(nas_server_id) is required to + uniquely identify the filesystem. + - Options I(filesystem_name) and I(filesystem_id) are mutually exclusive parameters. + type: str + snapshot_id: + description: + - The ID of the Filesystem Snapshot. + - Either I(snapshot_name) or I(snapshot_id) is required for creation of the SMB share for a snapshot. + - If I(snapshot_name) is specified, then I(nas_server_name)/I(nas_server_id) is required to + uniquely identify the snapshot. + - Options I(snapshot_name) and I(snapshot_id) are mutually exclusive parameters. + type: str + nas_server_id: + description: + - The ID of the NAS Server. + - It is not required if I(share_id) is used. + type: str + filesystem_name: + description: + - The Name of the File System. + - Either I(filesystem_name) or I(filesystem_id) is required for creation of the SMB share for filesystem. + - If I(filesystem_name) is specified, then I(nas_server_name)/I(nas_server_id) is required to + uniquely identify the filesystem. + - Options I(filesystem_name) and I(filesytem_id) are mutually exclusive parameters. + type: str + snapshot_name: + description: + - The Name of the Filesystem Snapshot. + - Either I(snapshot_name) or I(snapshot_id) is required for creation of the SMB share for a snapshot. + - If I(snapshot_name) is specified, then I(nas_server_name)/I(nas_server_id) is required to + uniquely identify the snapshot. + - Options I(snapshot_name) and I(snapshot_id) are mutually exclusive parameters. + type: str + nas_server_name: + description: + - The Name of the NAS Server. + - It is not required if I(share_id) is used. + - Options I(nas_server_name) and I(nas_server_id) are mutually exclusive parameters. + type: str + description: + description: + - Description for the SMB share. + - Optional parameter when creating a share. + - To modify, pass the new value in description field. + type: str + is_abe_enabled: + description: + - Indicates whether Access-based Enumeration (ABE) for SMB share is enabled. + - During creation, if not mentioned then default is C(false). + type: bool + is_branch_cache_enabled: + description: + - Indicates whether Branch Cache optimization for SMB share is enabled. + - During creation, if not mentioned then default is C(false). + type: bool + is_continuous_availability_enabled: + description: + - Indicates whether continuous availability for SMB 3.0 is enabled. + - During creation, if not mentioned then default is C(false). + type: bool + is_encryption_enabled: + description: + - Indicates whether encryption for SMB 3.0 is enabled at the shared folder level. + - During creation, if not mentioned then default is C(false). + type: bool + offline_availability: + description: + - Defines valid states of Offline Availability. + - C(MANUAL)- Only specified files will be available offline. + - C(DOCUMENTS)- All files that users open will be available offline. + - C(PROGRAMS)- Program will preferably run from the offline cache even when + connected to the network. All files that users open will be available offline. + - C(NONE)- Prevents clients from storing documents and programs in offline cache. + type: str + choices: ["MANUAL","DOCUMENTS","PROGRAMS","NONE"] + umask: + description: + - The default UNIX umask for new files created on the SMB Share. + type: str + state: + description: + - Define whether the SMB share should exist or not. + - Value C(present) indicates that the share should exist on the system. + - Value C(absent) indicates that the share should not exist on the system. + type: str + required: true + choices: ['absent', 'present'] +notes: +- When ID/Name of the filesystem/snapshot is passed then I(nas_server) is not required. + If passed, then filesystem/snapshot should exist for the mentioned I(nas_server), + else the task will fail. +- The I(check_mode) is not supported. +''' + +EXAMPLES = r''' +- name: Create SMB share for a filesystem + dellemc.unity.smbshare: + unispherehost: "{{unispherehost}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + share_name: "sample_smb_share" + filesystem_name: "sample_fs" + nas_server_id: "NAS_11" + path: "/sample_fs" + description: "Sample SMB share created" + is_abe_enabled: True + is_branch_cache_enabled: True + offline_availability: "DOCUMENTS" + is_continuous_availability_enabled: True + is_encryption_enabled: True + umask: "777" + state: "present" +- name: Modify Attributes of SMB share for a filesystem + dellemc.unity.smbshare: + unispherehost: "{{unispherehost}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + share_name: "sample_smb_share" + nas_server_name: "sample_nas_server" + description: "Sample SMB share attributes updated" + is_abe_enabled: False + is_branch_cache_enabled: False + offline_availability: "MANUAL" + is_continuous_availability_enabled: "False" + is_encryption_enabled: "False" + umask: "022" + state: "present" +- name: Create SMB share for a snapshot + dellemc.unity.smbshare: + unispherehost: "{{unispherehost}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + share_name: "sample_snap_smb_share" + snapshot_name: "sample_snapshot" + nas_server_id: "NAS_11" + path: "/sample_snapshot" + description: "Sample SMB share created for snapshot" + is_abe_enabled: True + is_branch_cache_enabled: True + is_continuous_availability_enabled: True + is_encryption_enabled: True + umask: "777" + state: "present" +- name: Modify Attributes of SMB share for a snapshot + dellemc.unity.smbshare: + unispherehost: "{{unispherehost}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + share_name: "sample_snap_smb_share" + snapshot_name: "sample_snapshot" + description: "Sample SMB share attributes updated for snapshot" + is_abe_enabled: False + is_branch_cache_enabled: False + offline_availability: "MANUAL" + is_continuous_availability_enabled: "False" + is_encryption_enabled: "False" + umask: "022" + state: "present" +- name: Get details of SMB share + dellemc.unity.smbshare: + unispherehost: "{{unispherehost}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + share_id: "{{smb_share_id}}" + state: "present" +- name: Delete SMB share + dellemc.unity.smbshare: + unispherehost: "{{unispherehost}}" + username: "{{username}}" + password: "{{password}}" + validate_certs: "{{validate_certs}}" + share_id: "{{smb_share_id}}" + state: "absent" +''' + +RETURN = r''' +changed: + description: Whether or not the resource has changed. + returned: always + type: bool + sample: True +smb_share_details: + description: The SMB share details. + type: dict + returned: When share exists. + contains: + id: + description: The ID of the SMB share. + type: str + name: + description: Name of the SMB share. + type: str + sample: "sample_smb_share" + filesystem_id: + description: The ID of the Filesystem. + type: str + filesystem_name: + description: The Name of the filesystem + type: str + snapshot_id: + description: The ID of the Snapshot. + type: str + snapshot_name: + description: The Name of the Snapshot. + type: str + nas_server_id: + description: The ID of the nas_server. + type: str + nas_server_name: + description: The Name of the nas_server. + type: str + description: + description: Additional information about the share. + type: str + sample: This share is created for demo purpose only. + is_abe_enabled: + description: Whether Access Based enumeration is enforced or not. + type: bool + sample: false + is_branch_cache_enabled: + description: Whether branch cache is enabled or not. + type: bool + sample: false + is_continuous_availability_enabled: + description: Whether the share will be available continuously or not. + type: bool + sample: false + is_encryption_enabled: + description: Whether encryption is enabled or not. + type: bool + sample: false + umask: + description: Unix mask for the SMB share. + type: str + sample: { + "creation_time": "2022-03-17 11:56:54.867000+00:00", + "description": "", + "existed": true, + "export_paths": [ + "\\\\multi-prot-pie.extreme1.com\\multi-prot-hui", + "\\\\10.230.24.26\\multi-prot-hui" + ], + "filesystem": { + "UnityFileSystem": { + "hash": 8748426746492 + } + }, + "filesystem_id": "fs_140", + "filesystem_name": "multi-prot-hui", + "hash": 8748426746588, + "id": "SMBShare_20", + "is_abe_enabled": false, + "is_ace_enabled": false, + "is_branch_cache_enabled": false, + "is_continuous_availability_enabled": false, + "is_dfs_enabled": false, + "is_encryption_enabled": false, + "is_read_only": null, + "modified_time": "2022-03-17 11:56:54.867000+00:00", + "name": "multi-prot-hui", + "nas_server_id": "nas_5", + "nas_server_name": "multi-prot", + "offline_availability": "CifsShareOfflineAvailabilityEnum.NONE", + "path": "/", + "snap": null, + "type": "CIFSTypeEnum.CIFS_SHARE", + "umask": "022" + } +''' + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.dellemc.unity.plugins.module_utils.storage.dell \ + import utils + +LOG = utils.get_logger('smbshare') + +application_type = "Ansible/1.5.0" + + +class SMBShare(object): + """Class with SMB Share operations""" + + def __init__(self): + """ Define all parameters required by this module""" + self.module_params = utils.get_unity_management_host_parameters() + self.module_params.update(get_smb_share_parameters()) + + # initialize the ansible module + mut_ex_args = [['share_name', 'share_id'], + ['nas_server_name', 'nas_server_id'], + ['filesystem_name', 'snapshot_name', + 'filesystem_id', 'snapshot_id'], + ['share_id', 'nas_server_name'], + ['share_id', 'nas_server_id'], + ['share_id', 'filesystem_name'], + ['share_id', 'filesystem_id'], + ['share_id', 'path'], + ['share_id', 'snapshot_name'], + ['share_id', 'snapshot_id']] + required_one_of = [['share_id', 'share_name']] + + self.module = AnsibleModule( + argument_spec=self.module_params, + supports_check_mode=False, + mutually_exclusive=mut_ex_args, + required_one_of=required_one_of + ) + utils.ensure_required_libs(self.module) + + # result is a dictionary that contains changed status and + # snapshot details + self.result = {"changed": False, + 'smb_share_details': {}} + + self.unity_conn = utils.get_unity_unisphere_connection( + self.module.params, application_type) + self.smb_share_conn_obj = utils.cifs_share.UnityCifsShare( + self.unity_conn) + LOG.info('Connection established with the Unity Array') + + def get_offline_availability_enum(self, offline_availability): + """ + Get the enum of the Offline Availability parameter. + :param offline_availability: The offline_availability string + :return: offline_availability enum + """ + if offline_availability in \ + utils.CifsShareOfflineAvailabilityEnum.__members__: + return utils.CifsShareOfflineAvailabilityEnum[ + offline_availability] + else: + error_msg = "Invalid value {0} for offline availability" \ + " provided".format(offline_availability) + LOG.error(error_msg) + self.module.fail_json(msg=error_msg) + + def get_smb_share_obj(self, share_id=None, share_name=None, + filesystem_obj=None, snap_obj=None, nas_obj=None): + """Get SMB share details""" + msg = "Failed to get details of SMB Share {0} with error {1} " + smb_share = share_name if share_name else share_id + try: + if share_id: + obj_smb = self.unity_conn.get_cifs_share(_id=share_id) + if obj_smb and obj_smb.existed: + LOG.info("Successfully got the SMB share " + "object %s ", obj_smb) + return obj_smb + + elif share_name is not None and filesystem_obj: + # There might be a case where SMB share with same name exists + # for different nas server. Hence, filesystem_obj is passed + # along with share name to get a unique resource. + return self.unity_conn.get_cifs_share( + name=share_name, filesystem=filesystem_obj) + + elif share_name is not None and snap_obj: + # There might be a case where SMB share with same name exists + # for different nas server. Hence, snap_obj is passed + # along with share name to get a unique resource. + return self.unity_conn.get_cifs_share( + name=share_name, snap=snap_obj) + + # This elif is addressing scenario where nas server details is + # passed and neither filesystem nor snapshot details are passed. + elif share_name is not None and nas_obj: + # Multiple smb shares can be received, as only name is passed + smb_share_obj = self.unity_conn.get_cifs_share( + name=share_name) + + # Checking if instance or list of instance is returned. + if isinstance(smb_share_obj, + utils.cifs_share.UnityCifsShareList): + LOG.info("Multiple SMB share with same name found.") + smb_share_obj_list = smb_share_obj + + for smb_share in smb_share_obj_list: + if smb_share.filesystem.nas_server == nas_obj: + return smb_share + + msg = "No SMB share found with the given NAS Server." \ + " Please provide correct share name and" \ + " nas server details." + return None + + # Below statements will execute when there is only single + # smb share returned. + if smb_share_obj.filesystem.nas_server == nas_obj: + return smb_share_obj + msg = "No SMB share found with the given NAS Server." \ + " Please provide correct share name and" \ + " nas server details." + return None + + else: + self.module.fail_json( + msg="Share Name is Passed. Please enter Filesystem/" + "Snapshot/NAS Server Resource along with share_name" + " to get the details of the SMB share") + + except utils.HttpError as e: + if e.http_status == 401: + cred_err = "Incorrect username or password , {0}".format( + e.message) + self.module.fail_json(msg=cred_err) + else: + err_msg = msg.format(smb_share, str(e)) + LOG.error(err_msg) + self.module.fail_json(msg=err_msg) + + except utils.UnityResourceNotFoundError as e: + err_msg = msg.format(smb_share, str(e)) + LOG.error(err_msg) + return None + + except Exception as e: + err_msg = msg.format(smb_share, str(e)) + LOG.error(err_msg) + self.module.fail_json(msg=err_msg) + + def create_smb_share(self, share_name, path, filesystem_obj=None, + snapshot_obj=None, description=None, + is_abe_enabled=None, is_branch_cache_enabled=None, + is_continuous_availability_enabled=None, + is_encryption_enabled=None, + offline_availability=None, umask=None): + """ + Create SMB Share + :return: SMB Share Object if successful, else error. + """ + if path is None or path == "": + self.module.fail_json(msg="Please enter a valid path." + " Empty string or None provided.") + if not filesystem_obj and not snapshot_obj: + self.module.fail_json(msg="Either Filesystem or Snapshot " + "Resource's Name/ID is required to" + " Create a SMB share") + try: + if filesystem_obj: + return self.smb_share_conn_obj.create( + cli=self.unity_conn._cli, name=share_name, + fs=filesystem_obj, path=path, + is_encryption_enabled=is_encryption_enabled, + is_con_avail_enabled=is_continuous_availability_enabled, + is_abe_enabled=is_abe_enabled, + is_branch_cache_enabled=is_branch_cache_enabled, + umask=umask, description=description, + offline_availability=offline_availability) + else: + return self.smb_share_conn_obj.create_from_snap( + cli=self.unity_conn._cli, name=share_name, + snap=snapshot_obj, path=path, + is_encryption_enabled=is_encryption_enabled, + is_con_avail_enabled=is_continuous_availability_enabled, + is_abe_enabled=is_abe_enabled, + is_branch_cache_enabled=is_branch_cache_enabled, + umask=umask, description=description, + offline_availability=offline_availability) + + except Exception as e: + error_msg = "Failed to create SMB share" \ + " %s with error %s" % (share_name, str(e)) + LOG.error(error_msg) + self.module.fail_json(msg=error_msg) + + def get_filesystem(self, filesystem_id=None, filesystem_name=None, + nas_server_obj=None): + """ + Get the Filesystem Object. + :param filesystem_id: ID of the Filesystem. + :param filesystem_name: Name of the filesystem. + :param nas_server_obj: NAS Server object. + :return: Object of the filesystem. + """ + try: + if filesystem_id: + obj_fs = self.unity_conn.get_filesystem(_id=filesystem_id) + if obj_fs and obj_fs.existed: + LOG.info("Successfully got the filesystem " + "object %s ", obj_fs) + return obj_fs + else: + return self.unity_conn.get_filesystem( + name=filesystem_name, nas_server=nas_server_obj) + return None + except Exception as e: + filesystem = filesystem_name if filesystem_name \ + else filesystem_id + err_msg = "Failed to get filesystem details {0} with" \ + " error {1}".format(filesystem, str(e)) + LOG.error(err_msg) + self.module.fail_json(msg=err_msg) + + def get_snapshot(self, snapshot_name, snapshot_id): + """ + Get the Snapshot Object. + :param snapshot_id: ID of the Snapshot. + :param snapshot_name: Name of the Snapshot + :return: Object of the filesystem. + """ + try: + obj_snap = self.unity_conn.get_snap(_id=snapshot_id, + name=snapshot_name) + if snapshot_id and obj_snap and not obj_snap.existed: + LOG.info("Snapshot object does not exist %s ", obj_snap) + return None + return obj_snap + except Exception as e: + snapshot = snapshot_name if snapshot_name else snapshot_id + err_msg = "Failed to get filesystem snapshots details {0} with" \ + " error {1}".format(snapshot, str(e)) + LOG.error(err_msg) + self.module.fail_json(msg=err_msg) + + def get_nas_server(self, nas_server_name, nas_server_id): + """ + Get the NAS Server Object using NAME/ID of the NAS Server. + :param nas_server_name: Name of the NAS Server + :param nas_server_id: ID of the NAS Server + :return: NAS Server object. + """ + nas_server = nas_server_name if nas_server_name else nas_server_id + try: + obj_nas = self.unity_conn.get_nas_server(_id=nas_server_id, + name=nas_server_name) + if nas_server_id and obj_nas and not obj_nas.existed: + LOG.info("NAS Server object does not exist %s ", obj_nas) + return None + return obj_nas + except utils.HttpError as e: + if e.http_status == 401: + cred_err = "Incorrect username or password , {0}".format( + e.message) + self.module.fail_json(msg=cred_err) + else: + err_msg = "Failed to get details of NAS Server" \ + " {0} with error {1}".format(nas_server, str(e)) + LOG.error(err_msg) + self.module.fail_json(msg=err_msg) + except Exception as e: + nas_server = nas_server_name if nas_server_name \ + else nas_server_id + err_msg = "Failed to get nas server details {0} with" \ + " error {1}".format(nas_server, str(e)) + LOG.error(err_msg) + self.module.fail_json(msg=err_msg) + + def delete_smb_share(self, smb_share_obj): + """ + Delete SMB share if exists, else thrown error. + """ + try: + smb_share_obj.delete() + except Exception as e: + error_msg = "Failed to Delete SMB share" \ + " %s with error %s" % (smb_share_obj.name, str(e)) + LOG.error(error_msg) + self.module.fail_json(msg=error_msg) + + def to_update(self, smb_share_obj): + LOG.info("Checking Whether the parameters are modified or not.") + + offline_availability = self.module.params['offline_availability'] + # Get the enum for the corresponding offline_availability + if offline_availability: + offline_availability = \ + self.get_offline_availability_enum(offline_availability) + if offline_availability is not None and \ + offline_availability != smb_share_obj.offline_availability: + return True + + smb_share_dict = smb_share_obj._get_properties() + params_list = ['is_abe_enabled', 'is_branch_cache_enabled', + 'is_continuous_availability_enabled', + 'is_encryption_enabled', 'description', 'umask'] + for param in params_list: + if self.module.params[param] is not None and \ + self.module.params[param] != smb_share_dict[param]: + return True + return False + + def update_smb_share(self, smb_share_obj, is_encryption_enabled=None, + is_continuous_availability_enabled=None, + is_abe_enabled=None, + is_branch_cache_enabled=None, + umask=None, description=None, + offline_availability=None): + """ + The Details of the SMB share will be updated in the function. + """ + try: + smb_share_obj.modify( + is_encryption_enabled=is_encryption_enabled, + is_con_avail_enabled=is_continuous_availability_enabled, + is_abe_enabled=is_abe_enabled, + is_branch_cache_enabled=is_branch_cache_enabled, + umask=umask, description=description, + offline_availability=offline_availability) + + except Exception as e: + error_msg = "Failed to Update parameters of SMB share" \ + " %s with error %s" % (smb_share_obj.name, str(e)) + LOG.error(error_msg) + self.module.fail_json(msg=error_msg) + + def perform_module_operation(self): + """ + Perform different actions on SMB share based on user parameters + chosen in playbook + """ + state = self.module.params['state'] + share_name = self.module.params['share_name'] + filesystem_name = self.module.params['filesystem_name'] + snapshot_name = self.module.params['snapshot_name'] + nas_server_name = self.module.params['nas_server_name'] + share_id = self.module.params['share_id'] + filesystem_id = self.module.params['filesystem_id'] + snapshot_id = self.module.params['snapshot_id'] + nas_server_id = self.module.params['nas_server_id'] + path = self.module.params['path'] + + description = self.module.params['description'] + is_branch_cache_enabled = \ + self.module.params['is_branch_cache_enabled'] + is_continuous_availability_enabled = \ + self.module.params['is_continuous_availability_enabled'] + is_encryption_enabled = self.module.params['is_encryption_enabled'] + is_abe_enabled = self.module.params['is_abe_enabled'] + umask = self.module.params['umask'] + + offline_availability = self.module.params['offline_availability'] + # Get the enum for the corresponding offline_availability + if offline_availability: + offline_availability = \ + self.get_offline_availability_enum(offline_availability) + + changed = False + ''' + Validate parameters. + ''' + if share_id is not None and \ + (share_id == "" or len(share_id.split()) == 0): + self.module.fail_json(msg="Invalid share id provided." + " Please enter a valid share ID.") + + ''' + Get details of NAS Server, if entered. + ''' + nas_server_obj = None + if nas_server_name or nas_server_id: + nas_server_obj = self.get_nas_server(nas_server_name, + nas_server_id) + if nas_server_obj: + msg = "NAS Server Object:" \ + " {0}".format(nas_server_obj._get_properties()) + LOG.info(msg) + else: + msg = "NAS Server Resource not fetched." + LOG.info(msg) + + ''' + Get details of Filesystem, if entered. + ''' + filesystem_obj = None + if filesystem_id: + filesystem_obj = self.get_filesystem(filesystem_id) + if filesystem_name: + # nas_server_obj is required to uniquely identify filesystem + # resource. If neither nas_server_name nor nas_server_id + # is passed along with filesystem_name then error is thrown. + if not nas_server_obj: + self.module.fail_json(msg="nas_server_id/nas_server_name is " + "required when filesystem_name is " + "passed") + filesystem_obj = self.get_filesystem( + None, filesystem_name, nas_server_obj) + if filesystem_obj: + msg = "Filesystem Object:" \ + " {0}".format(filesystem_obj._get_properties()) + LOG.info(msg) + # Checking if filesystem supports SMB protocol or not. + if filesystem_obj and \ + filesystem_obj.supported_protocols.name == "NFS": + self.module.fail_json(msg="Cannot perform SMB share operations " + "as file system supports only NFS " + "protocol. Please enter a valid " + "Filesystem having supported protocol" + " as SMB or Multiprotocol.") + ''' + Get details of Snapshot, if entered. + ''' + snapshot_obj = None + if snapshot_id or snapshot_name: + # Snapshot Name and Snapshot ID both are unique across array. + # Hence no need to mention nas server details + snapshot_obj = self.get_snapshot(snapshot_name, snapshot_id) + if snapshot_obj: + msg = "Snapshot Object:" \ + " {0}".format(snapshot_obj._get_properties()) + LOG.info(msg) + else: + msg = "Snapshot Resource not fetched." + LOG.info(msg) + + ''' + Get the Details of the SMB Share + ''' + smb_share_obj = self.get_smb_share_obj( + share_id, share_name, filesystem_obj, snapshot_obj, + nas_server_obj) + if smb_share_obj: + msg = "SMB Share Object:" \ + " {0}".format(smb_share_obj._get_properties()) + LOG.info(msg) + elif state == 'present' and share_id: + msg = "Unable to fetch SMB Share Resource. " \ + "Incorrect SMB share id provided. " \ + "Please enter a correct share id." + LOG.error(msg) + self.module.fail_json(msg=msg) + + ''' + Creation of SMB Share + ''' + if state == "present" and not smb_share_obj: + smb_share_obj = self.create_smb_share( + share_name, path, filesystem_obj, snapshot_obj, description, + is_abe_enabled, is_branch_cache_enabled, + is_continuous_availability_enabled, is_encryption_enabled, + offline_availability, umask) + changed = True + + ''' + Update the SMB share details + ''' + if state == "present" and smb_share_obj: + LOG.info("Modify the details of the SMB share.") + update_flag = self.to_update(smb_share_obj) + msg = "Update Flag: {0}".format(str(update_flag)) + LOG.info(msg) + if update_flag: + self.update_smb_share(smb_share_obj, is_encryption_enabled, + is_continuous_availability_enabled, + is_abe_enabled, + is_branch_cache_enabled, + umask, description, + offline_availability) + changed = True + + ''' + Delete the SMB share details + ''' + if state == "absent" and smb_share_obj: + self.delete_smb_share(smb_share_obj) + changed = True + + ''' + Update the changed state and SMB share details + ''' + + self.result["changed"] = changed + smb_details = self.prepare_output_dict(state, share_id, share_name, + filesystem_obj, snapshot_obj, + nas_server_obj) + self.result["smb_share_details"] = smb_details + self.module.exit_json(**self.result) + + def prepare_output_dict(self, state, share_id, share_name, + filesystem_obj, snapshot_obj, nas_server_obj): + smb_share_details = None + smb_share_obj = None + if state == 'present': + smb_share_obj = self.get_smb_share_obj( + share_id, share_name, filesystem_obj, + snapshot_obj, nas_server_obj) + smb_share_details = smb_share_obj._get_properties() + if smb_share_details: + # Get Snapshot NAME and ID if SMB share exists for Snapshot + if smb_share_obj.type.name == "CIFS_SNAPSHOT": + smb_share_details['snapshot_name'] = smb_share_obj.snap.name + smb_share_details['snapshot_id'] = smb_share_obj.snap.id + + # Get Filesystem NAME and ID + smb_share_details['filesystem_name'] = \ + smb_share_obj.filesystem.name + smb_share_details['filesystem_id'] = smb_share_obj.filesystem.id + + # Get NAS server NAME and ID + smb_share_details['nas_server_name'] = \ + smb_share_obj.filesystem.nas_server.name + smb_share_details['nas_server_id'] = \ + smb_share_obj.filesystem.nas_server.id + return smb_share_details + + +def get_smb_share_parameters(): + """ + This method provides parameters required for the ansible smb share + modules on Unity + """ + + return dict( + share_name=dict(), share_id=dict(), + filesystem_name=dict(), filesystem_id=dict(), + snapshot_name=dict(), snapshot_id=dict(), + nas_server_name=dict(), nas_server_id=dict(), + path=dict(no_log=True), umask=dict(), description=dict(), + offline_availability=dict( + choices=["MANUAL", "DOCUMENTS", "PROGRAMS", "NONE"]), + is_abe_enabled=dict(type='bool'), + is_branch_cache_enabled=dict(type='bool'), + is_continuous_availability_enabled=dict(type='bool'), + is_encryption_enabled=dict(type='bool'), + state=dict(required=True, choices=['present', 'absent'], type='str') + ) + + +def main(): + """ Create Unity SMB share object and perform action on it + based on user input from playbook""" + obj = SMBShare() + obj.perform_module_operation() + + +if __name__ == '__main__': + main() |