def update_shelve(client_obj, shelf_serial, **kwargs): if utils.is_null_or_empty(shelf_serial): return (False, False, "Shelf update failed as no shelf id provided.", {}) try: shelf_resp = client_obj.shelves.get() if utils.is_null_or_empty(shelf_resp): return (False, False, f"Shelf serial '{shelf_serial}' is not present on array.", {}) else: # check if the given shelf serial is present on array if shelf_serial == shelf_resp.attrs.get("serial"): changed_attrs_dict, params = utils.remove_unchanged_or_null_args( shelf_resp, **kwargs) if changed_attrs_dict.__len__() > 0: shelf_resp = client_obj.shelves.update( id=shelf_resp.attrs.get("id"), **params) return (True, True, f"Successfully updated Shelf '{shelf_serial}'.", shelf_resp.attrs) else: return (True, False, f"Shelf serial '{shelf_serial}' already updated.", shelf_resp.attrs) else: return (False, False, f"Shelf serial '{shelf_serial}' not found.", {}) except Exception as e: return (False, False, "Shelf update failed | %s" % str(e), {})
def update_perf_policy(client_obj, perf_policy_resp, **kwargs): if utils.is_null_or_empty(perf_policy_resp): return ( False, False, "Update performance policy failed. Performance policy name is not present.", {}, {}) try: perf_policy_name = perf_policy_resp.attrs.get("name") changed_attrs_dict, params = utils.remove_unchanged_or_null_args( perf_policy_resp, **kwargs) if changed_attrs_dict.__len__() > 0: perf_policy_resp = client_obj.performance_policies.update( id=perf_policy_resp.attrs.get("id"), **params) return ( True, True, f"Performance policy '{perf_policy_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, perf_policy_resp.attrs) else: return ( True, False, f"Performance policy '{perf_policy_name}' already present in given state.", {}, perf_policy_resp.attrs) except Exception as ex: return (False, False, f"Performance policy update failed | {ex}", {}, {})
def update_user(client_obj, user_name, **kwargs): if utils.is_null_or_empty(user_name): return (False, False, "Update user failed as user is not present.", {}, {}) try: user_resp = client_obj.users.get(id=None, name=user_name) if utils.is_null_or_empty(user_resp): return ( False, False, f"User '{user_name}' cannot be updated as it is not present.", {}, {}) changed_attrs_dict, params = utils.remove_unchanged_or_null_args( user_resp, **kwargs) if changed_attrs_dict.__len__() > 0: user_resp = client_obj.users.update(id=user_resp.attrs.get("id"), **params) return ( True, True, f"User '{user_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, user_resp.attrs) else: return ( True, False, f"User '{user_resp.attrs.get('name')}' already present in given state.", {}, user_resp.attrs) except Exception as ex: return (False, False, f"User update failed | {ex}", {}, {})
def update_snapshot(client_obj, snap_resp, **kwargs): if utils.is_null_or_empty(snap_resp): return (False, False, "Update snapshot failed as snapshot is not present.", {}, {}) try: snapshot_name = snap_resp.attrs.get("name") changed_attrs_dict, params = utils.remove_unchanged_or_null_args( snap_resp, **kwargs) if changed_attrs_dict.__len__() > 0: snap_resp = client_obj.snapshots.update( id=snap_resp.attrs.get("id"), **params) return ( True, True, f"Snapshot '{snapshot_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, snap_resp.attrs) else: return ( True, False, f"Snapshot '{snapshot_name}' already present in given state.", {}, snap_resp.attrs) except Exception as ex: return (False, False, f"Snapshot update failed | {ex}", {}, {})
def update_volcoll(client_obj, volcoll_resp, **kwargs): if utils.is_null_or_empty(volcoll_resp): return ( False, False, "Update volume collection failed as volume collection is not present.", {}, {}) try: volcoll_name = volcoll_resp.attrs.get("name") changed_attrs_dict, params = utils.remove_unchanged_or_null_args( volcoll_resp, **kwargs) if changed_attrs_dict.__len__() > 0: volcoll_resp = client_obj.volume_collections.update( id=volcoll_resp.attrs.get("id"), **params) return ( True, True, f"Volume collection '{volcoll_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, volcoll_resp.attrs) else: return ( True, False, f"Volume collection '{volcoll_name}' already present in given state.", {}, volcoll_resp.attrs) except Exception as ex: return (False, False, f"Volume collection update failed | {ex}", {}, {})
def group_encryption(client_obj, group_name, encryption_config): if utils.is_null_or_empty(group_name): return ( False, False, "Encryption setting for group failed as group name is not present.", {}, {}) try: group_resp = client_obj.groups.get(id=None, name=group_name) if utils.is_null_or_empty(group_resp): return ( False, False, f"Encryption setting for group '{group_name}' cannot be done as it is not present.", {}, {}) changed_attrs_dict, params = utils.remove_unchanged_or_null_args( group_resp, encryption_config=encryption_config) if changed_attrs_dict.__len__() > 0: group_resp = client_obj.groups.update( id=group_resp.attrs.get("id"), encryption_config=encryption_config) return ( True, True, f"Encryption setting for group '{group_name}' changed successfully. ", changed_attrs_dict, group_resp.attrs) else: return ( True, False, f"Encryption setting for group '{group_resp.attrs.get('name')}' is already in same state.", {}, group_resp.attrs) except Exception as ex: return (False, False, f"Encryption setting for group failed |{ex}", {}, {})
def update_master_key(client_obj, master_key, **kwargs): if utils.is_null_or_empty(master_key): return (False, False, "Update master key failed as master key is not present.", {}, {}) try: master_key_resp = client_obj.master_key.get(id=None, name=master_key) if utils.is_null_or_empty(master_key_resp): return ( False, False, f"Master key '{master_key}' cannot be updated as it is not present.", {}, {}) changed_attrs_dict, params = utils.remove_unchanged_or_null_args( master_key_resp, **kwargs) changed_attrs_dict.pop('passphrase') if changed_attrs_dict.__len__() > 0: master_key_resp = client_obj.master_key.update( id=master_key_resp.attrs.get("id"), name=master_key, **params) return ( True, True, f"Master key '{master_key}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, master_key_resp.attrs) else: return ( True, False, f"Master key '{master_key}' already present in given state.", {}, master_key_resp.attrs) except Exception as ex: return (False, False, f"Master key update failed |{ex}", {}, {})
def update_group(client_obj, group_name, **kwargs): if utils.is_null_or_empty(group_name): return (False, False, "Update group failed as it is not present.", {}, {}) try: group_resp = client_obj.groups.get(id=None, name=group_name) if utils.is_null_or_empty(group_resp): return ( False, False, f"Group '{group_name}' cannot be updated as it is not present.", {}, {}) changed_attrs_dict, params = utils.remove_unchanged_or_null_args( group_resp, **kwargs) if changed_attrs_dict.__len__() > 0: group_resp = client_obj.groups.update( id=group_resp.attrs.get("id"), **params) return ( True, True, f"Group '{group_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, group_resp.attrs) else: return ( True, False, f"Group '{group_resp.attrs.get('name')}' already present in given state.", {}, group_resp.attrs) except Exception as ex: return (False, False, f"Group update failed | '{ex}'", {}, {})
def update_prot_template(client_obj, prot_template_resp, **kwargs): if utils.is_null_or_empty(prot_template_resp): return ( False, False, "Update protection template failed as protection template is not present.", {}, {}) try: prot_template_name = prot_template_resp.attrs.get("name") changed_attrs_dict, params = utils.remove_unchanged_or_null_args( prot_template_resp, **kwargs) if changed_attrs_dict.__len__() > 0: prot_template_resp = client_obj.protection_templates.update( id=prot_template_resp.attrs.get("id"), **params) return ( True, True, f"Protection template '{prot_template_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, prot_template_resp.attrs) else: return ( True, False, f"Protection template '{prot_template_name}' already present in given state.", {}, prot_template_resp.attrs) except Exception as ex: return (False, False, f"Protection template update failed | {ex}", {}, {})
def update_volume(client_obj, vol_resp, **kwargs): if utils.is_null_or_empty(vol_resp): return (False, False, "Invalid volume to update.", {}, {}) try: changed_attrs_dict, params = utils.remove_unchanged_or_null_args( vol_resp, **kwargs) if 'volcoll_name' in kwargs: if kwargs['volcoll_name'] == "" and vol_resp.attrs.get( 'volcoll_id') != "": params['volcoll_id'] = "" changed_attrs_dict['volcoll_id'] = "" else: if 'volcoll_name' in params: params.pop('volcoll_name') changed_attrs_dict.pop('volcoll_name') if changed_attrs_dict.__len__() > 0: resp = client_obj.volumes.update(id=vol_resp.attrs.get("id"), **params) return ( True, True, f"Volume '{vol_resp.attrs.get('name')}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, resp.attrs) else: return ( True, False, f"Volume '{vol_resp.attrs.get('name')}' already present in given state.", {}, vol_resp.attrs) except Exception as ex: return (False, False, f"Volume update failed '{ex}'", {}, {})
def create_acr(client_obj, state, initiator_group, volume, **kwargs): if utils.is_null_or_empty(initiator_group): return ( False, False, "Access control record creation failed. No initiator group provided.", {}) if utils.is_null_or_empty(volume): return ( False, False, "Access control record creation failed. No volume name provided.", {}) try: # see if the igroup is already present ig_resp = client_obj.initiator_groups.get(id=None, name=initiator_group) if ig_resp is None: return ( False, False, f"Initiator Group '{initiator_group}' is not present on array.", {}) vol_resp = client_obj.volumes.get(id=None, name=volume) if vol_resp is None: return (False, False, f"Volume name '{volume}' is not present on array.", {}) acr_resp = client_obj.access_control_records.get( vol_name=volume, initiator_group_name=initiator_group, apply_to=kwargs['apply_to']) if utils.is_null_or_empty(acr_resp) is False: changed_attrs_dict, params = utils.remove_unchanged_or_null_args( acr_resp, **kwargs) else: params = utils.remove_null_args(**kwargs) if acr_resp is None or changed_attrs_dict.__len__() > 0: acr_resp = client_obj.access_control_records.create( initiator_group_id=ig_resp.attrs.get("id"), vol_id=vol_resp.attrs.get("id"), **params) # params['volume'] = volume # params['initiator_group'] = initiator_group return (True, True, "Successfully created access control record.", acr_resp.attrs) else: # if state is set to present, we pass if state == "present": return ( True, False, f"Access control record for volume '{volume}' with initiator group '{initiator_group}' is already present.", acr_resp.attrs) return ( False, False, f"Access control record for volume '{volume}' with initiator group '{initiator_group}' cannot " "be created as it is already present.", {}) except Exception as ex: return (False, False, f"Access control record creation failed | {ex}", {})
def update_fc_interface(client_obj, array_name_or_serial, fc_name, controller, online): if utils.is_null_or_empty(array_name_or_serial): return ( False, False, "Fibre channel interface update failed as no array name is provided.", {}, {}) if utils.is_null_or_empty(fc_name): return ( False, False, "Fibre channel interface update failed as no interface name is provided.", {}, {}) if utils.is_null_or_empty(controller): return ( False, False, "Fibre channel interface update failed as no controller name is provided.", {}, {}) if utils.is_null_or_empty(online): return ( False, False, "Fibre channel interface update failed as online flag is not provided.", {}, {}) try: # get the details of the fc fc_resp = client_obj.fibre_channel_interfaces.list( detail=True, array_name_or_serial=array_name_or_serial) if fc_resp is None: return ( False, False, f"No fibre channel is present for array '{array_name_or_serial}'.", {}, {}) else: fc_result = None for fc_interface_obj in fc_resp: if fc_interface_obj.attrs.get( "name") == fc_name and fc_interface_obj.attrs.get( "controller_name") == controller: fc_result = fc_interface_obj break if fc_result is not None: changed_attrs_dict, params = utils.remove_unchanged_or_null_args( fc_result, online=online) if changed_attrs_dict.__len__() > 0: fc_result = client_obj.fibre_channel_interfaces.update( id=fc_result.attrs.get("id"), online=online) if hasattr(fc_result, 'attrs'): fc_result = fc_result.attrs return (True, True, "Updated fibre channel interface.", {}, fc_result) else: if hasattr(fc_result, 'attrs'): fc_result = fc_result.attrs return (True, False, "Fibre channel interface already in given state.", {}, fc_result) except Exception as ex: return (False, False, f"Fibre channel update failed |'{ex}'", {}, {})
def create_update_network_config(client_obj, name, state, iscsi_automatic_connection_method, iscsi_connection_rebalancing, mgmt_ip, change_name, **kwargs): if utils.is_null_or_empty(name): return (False, False, "Create network config failed as name is not present.", {}, {}) try: network_resp = client_obj.network_configs.get(id=None, name=name) if utils.is_null_or_empty(network_resp): params = utils.remove_null_args(**kwargs) network_resp = client_obj.network_configs.create( name=name, iscsi_automatic_connection_method= iscsi_automatic_connection_method, iscsi_connection_rebalancing=iscsi_connection_rebalancing, mgmt_ip=mgmt_ip, **params) return (True, True, f"Network config '{name}' created successfully.", {}, network_resp.attrs) else: if state == "create": return ( False, False, f"Network config '{name}' cannot be created as it is already present in given state.", {}, network_resp.attrs) # update case kwargs['name'] = change_name changed_attrs_dict, params = utils.remove_unchanged_or_null_args( network_resp, **kwargs) # even though some of the attributes have not changed but it still has to be passed in case of update. params = utils.remove_null_args(**kwargs) if changed_attrs_dict.__len__() > 0: network_resp = client_obj.network_configs.update( id=network_resp.attrs.get("id"), name=name, iscsi_automatic_connection_method= iscsi_automatic_connection_method, iscsi_connection_rebalancing=iscsi_connection_rebalancing, mgmt_ip=mgmt_ip, **params) return ( True, True, f"Network config '{name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, network_resp.attrs) else: return ( True, False, f"Network config '{network_resp.attrs.get('name')}' already present in given state.", {}, network_resp.attrs) except Exception as ex: return (False, False, f"Network config creation failed |'{ex}'", {}, {})
def create_acr(client_obj, initiator_group, volume, state, **kwargs): if utils.is_null_or_empty(initiator_group): return ( False, False, "Access control record creation failed. No initiator group provided." ) if utils.is_null_or_empty(volume): return ( False, False, "Access control record creation failed. No volume name provided.") try: # see if the igroup is already present ig_resp = client_obj.initiator_groups.get(id=None, name=initiator_group) if ig_resp is None: return ( False, False, f"Initiator Group '{initiator_group}' is not present on array." ) vol_resp = client_obj.volumes.get(id=None, name=volume) if vol_resp is None: return (False, False, f"Volume name '{volume}' is not present on array.") acr_resp = client_obj.access_control_records.get(id=None, vol_name=volume) if utils.is_null_or_empty(acr_resp) is False: changed_attrs_dict, params = utils.remove_unchanged_or_null_args( acr_resp, **kwargs) else: params = utils.remove_null_args(**kwargs) if acr_resp is None or acr_resp.attrs.get( "initiator_group_id") != ig_resp.attrs.get("id"): acr_resp = client_obj.access_control_records.create( initiator_group_id=ig_resp.attrs.get("id"), vol_id=vol_resp.attrs.get("id"), **params) return ( True, True, f"Successfully created access control record for volume '{volume}'." ) else: # check the state. if it is set to present ,we pass else if it is 'create' then we will fail if state == "present": return ( True, False, f"Access control record is already present for volume '{volume}'." ) return ( False, False, f"Access control record for volume '{volume}' cannot be created as it is already present." ) except Exception as ex: return (False, False, f"Access control record creation failed | {ex}")
def update_volume(client_obj, vol_resp, **kwargs): if utils.is_null_or_empty(vol_resp): return (False, False, "Invalid volume to update.", {}) try: changed_attrs_dict, params = utils.remove_unchanged_or_null_args( vol_resp, **kwargs) if changed_attrs_dict.__len__() > 0: client_obj.volumes.update(id=vol_resp.attrs.get("id"), **params) return ( True, True, f"Volume '{vol_resp.attrs.get('name')}' already present. Modified the following fields:", changed_attrs_dict) else: return (True, False, f"Volume '{vol_resp.attrs.get('name')}' already present.", {}) except Exception as ex: return (False, False, f"Volume update failed '{ex}'", {})
def update_user_policy(client_obj, **kwargs): try: user_resp = client_obj.user_policies.get() if utils.is_null_or_empty(user_resp): return (False, False, "User policy is not present on Array", {}, {}) changed_attrs_dict, params = utils.remove_unchanged_or_null_args( user_resp, **kwargs) if changed_attrs_dict.__len__() > 0: user_resp = client_obj.user_policies.update( id=user_resp.attrs.get("id"), **params) return ( True, True, f"Updated user policy successfully with following attributes '{changed_attrs_dict}'.", changed_attrs_dict, user_resp.attrs) else: return (True, False, "User Policy already present in given state.", {}, user_resp.attrs) except Exception as ex: return (False, False, f"User Policy Update failed | {ex}", {}, {})
def update_partner( client_obj, downstream_hostname, # downstream secret, **kwargs): if utils.is_null_or_empty(downstream_hostname): return ( False, False, "Update replication partner failed as no downstream partner is provided.", {}, {}) try: upstream_repl_resp = client_obj.replication_partners.get( id=None, hostname=downstream_hostname) if utils.is_null_or_empty(upstream_repl_resp): return ( False, False, f"Replication partner '{downstream_hostname}' cannot be updated as it is not present.", {}, {}) changed_attrs_dict, params = utils.remove_unchanged_or_null_args( upstream_repl_resp, **kwargs) if changed_attrs_dict.__len__() > 0: upstream_repl_resp = client_obj.replication_partners.update( id=upstream_repl_resp.attrs.get("id"), secret=secret, **params) return ( True, True, f"Replication partner '{downstream_hostname}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, upstream_repl_resp.attrs) else: return ( True, False, f"Replication partner '{upstream_repl_resp.attrs.get('name')}' already present in given state.", {}, upstream_repl_resp.attrs) except Exception as ex: return (False, False, f"Replication partner update failed |{ex}", {}, {})
def update_igroup(client_obj, ig_resp, **kwargs): if utils.is_null_or_empty(ig_resp): return (False, False, "Update initiator group failed as it is not present.", {}, {}) try: ig_name = ig_resp.attrs.get("name") changed_attrs_dict, params = utils.remove_unchanged_or_null_args( ig_resp, **kwargs) if changed_attrs_dict.__len__() > 0: ig_resp = client_obj.initiator_groups.update( id=ig_resp.attrs.get("id"), **params) return ( True, True, f"Initiator group '{ig_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, ig_resp.attrs) else: return ( True, False, f"Initiator group '{ig_name}' already present in given state.", {}, ig_resp.attrs) except Exception as ex: return (False, False, f"Initiator group update failed | {ex}", {}, {})
def update_array(client_obj, array_resp, **kwargs): if utils.is_null_or_empty(array_resp): return (False, False, "Update array failed as array name is not present.", {}, {}) try: array_name = array_resp.attrs.get("name") changed_attrs_dict, params = utils.remove_unchanged_or_null_args( array_resp, **kwargs) if changed_attrs_dict.__len__() > 0: array_resp = client_obj.arrays.update( id=array_resp.attrs.get("id"), **params) return ( True, True, f"Array '{array_name}' already present. Modified the following attributes '{changed_attrs_dict}'", changed_attrs_dict, array_resp.attrs) else: return (True, False, f"Array '{array_name}' already present in given state.", {}, array_resp.attrs) except Exception as ex: return (False, False, f"Array update failed |{ex}", {}, {})