summaryrefslogtreecommitdiffstats
path: root/ansible_collections/dellemc/unity/plugins/modules/smbshare.py
diff options
context:
space:
mode:
Diffstat (limited to 'ansible_collections/dellemc/unity/plugins/modules/smbshare.py')
-rw-r--r--ansible_collections/dellemc/unity/plugins/modules/smbshare.py877
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()