def generate_csi_publish_volume_response(lun, connectivity_type, config, array_initiators): logger.debug( "generating publish volume response for lun :{0}, connectivity : {1}". format(lun, connectivity_type)) lun_param = config["controller"]["publish_context_lun_parameter"] connectivity_param = config["controller"][ "publish_context_connectivity_parameter"] separator = config["controller"]["publish_context_separator"] publish_context = { lun_param: str(lun), connectivity_param: connectivity_type } if connectivity_type == ISCSI_CONNECTIVITY_TYPE: for iqn, ips in array_initiators.items(): publish_context[iqn] = separator.join(ips) array_initiators_param = config["controller"][ "publish_context_array_iqn"] publish_context[array_initiators_param] = separator.join( array_initiators.keys()) else: array_initiators_param = config["controller"][ "publish_context_fc_initiators"] publish_context[array_initiators_param] = separator.join( array_initiators) res = csi_pb2.ControllerPublishVolumeResponse( publish_context=publish_context) logger.debug("publish volume response is :{0}".format(res)) return res
def ControllerUnpublishVolume(self, request, context): set_current_thread_name(request.volume_id) logger.info("ControllerUnpublishVolume") try: try: utils.validate_unpublish_volume_request(request) except ValidationException as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.INVALID_ARGUMENT) return csi_pb2.ControllerUnpublishVolumeResponse() array_type, vol_id = utils.get_volume_id_info(request.volume_id) node_id_info = NodeIdInfo(request.node_id) node_name = node_id_info.node_name initiators = node_id_info.initiators logger.debug( "node name for this unpublish operation is : {0}".format( node_name)) user, password, array_addresses = utils.get_array_connection_info_from_secret( request.secrets) with get_agent(user, password, array_addresses, array_type).get_mediator() as array_mediator: array_mediator.unmap_volume_by_initiators(vol_id, initiators) logger.info("finished ControllerUnpublishVolume") return csi_pb2.ControllerUnpublishVolumeResponse() except controller_errors.VolumeAlreadyUnmappedError: logger.debug("Idempotent case. volume is already unmapped.") return csi_pb2.ControllerUnpublishVolumeResponse() except controller_errors.VolumeNotFoundError as ex: logger.debug("Idempotent case. volume is already deleted.") return csi_pb2.ControllerUnpublishVolumeResponse() except controller_errors.PermissionDeniedError as ex: context.set_code(grpc.StatusCode.PERMISSION_DENIED) context.set_details(ex) return csi_pb2.ControllerPublishVolumeResponse() except controller_errors.HostNotFoundError as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.NOT_FOUND) return csi_pb2.ControllerUnpublishVolumeResponse() except Exception as ex: logger.debug("an internal exception occurred") logger.exception(ex) context.set_code(grpc.StatusCode.INTERNAL) context.set_details( 'an internal exception occurred : {}'.format(ex)) return csi_pb2.ControllerUnpublishVolumeResponse()
def ControllerPublishVolume(self, request, context): set_current_thread_name(request.volume_id) logger.info("ControllerPublishVolume") try: utils.validate_publish_volume_request(request) array_type, vol_id = utils.get_volume_id_info(request.volume_id) node_id_info = NodeIdInfo(request.node_id) node_name = node_id_info.node_name initiators = node_id_info.initiators logger.debug("node name for this publish operation is : {0}".format(node_name)) user, password, array_addresses = utils.get_array_connection_info_from_secret(request.secrets) lun, connectivity_type, array_initiators = map_volume(user, password, array_addresses, array_type, vol_id, initiators) logger.info("finished ControllerPublishVolume") res = utils.generate_csi_publish_volume_response(lun, connectivity_type, self.cfg, array_initiators) return res except controller_errors.VolumeMappedToMultipleHostsError as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.FAILED_PRECONDITION) return csi_pb2.ControllerPublishVolumeResponse() except controller_errors.PermissionDeniedError as ex: context.set_code(grpc.StatusCode.PERMISSION_DENIED) context.set_details(ex) return csi_pb2.ControllerPublishVolumeResponse() except (controller_errors.LunAlreadyInUseError, controller_errors.NoAvailableLunError) as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.RESOURCE_EXHAUSTED) return csi_pb2.ControllerPublishVolumeResponse() except (controller_errors.HostNotFoundError, controller_errors.VolumeNotFoundError, controller_errors.BadNodeIdError) as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.NOT_FOUND) return csi_pb2.ControllerPublishVolumeResponse() except ValidationException as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.INVALID_ARGUMENT) return csi_pb2.ControllerPublishVolumeResponse() except Exception as ex: logger.debug("an internal exception occurred") logger.exception(ex) context.set_code(grpc.StatusCode.INTERNAL) context.set_details('an internal exception occurred : {}'.format(ex)) return csi_pb2.ControllerPublishVolumeResponse()
def generate_csi_publish_volume_response(lun, connectivity_type, config, array_initiators): logger.debug("generating publish volume response for lun :{0}, connectivity : {1}".format(lun, connectivity_type)) lun_param = config["controller"]["publish_context_lun_parameter"] connectivity_param = config["controller"]["publish_context_connectivity_parameter"] hash_by_connectivity = { 'iscsi': config["controller"]["publish_context_array_iqn"], 'fc': config["controller"]["publish_context_fc_initiators"]} array_initiators = ",".join(array_initiators) res = csi_pb2.ControllerPublishVolumeResponse( publish_context={lun_param: str(lun), connectivity_param: connectivity_type, hash_by_connectivity[connectivity_type]: array_initiators}) logger.debug("publish volume response is :{0}".format(res)) return res
def ControllerPublishVolume(self, request, context): set_current_thread_name(request.volume_id) logger.info("ControllerPublishVolume") try: utils.validate_publish_volume_request(request) volume_id_info = utils.get_volume_id_info(request.volume_id) system_id = volume_id_info.system_id array_type = volume_id_info.array_type volume_id = volume_id_info.object_id node_id_info = NodeIdInfo(request.node_id) node_name = node_id_info.node_name initiators = node_id_info.initiators logger.debug( "node name for this publish operation is : {0}".format( node_name)) array_connection_info = utils.get_array_connection_info_from_secrets( request.secrets, system_id=system_id) with get_agent(array_connection_info, array_type).get_mediator() as array_mediator: lun, connectivity_type, array_initiators = array_mediator.map_volume_by_initiators( volume_id, initiators) logger.info("finished ControllerPublishVolume") res = utils.generate_csi_publish_volume_response( lun, connectivity_type, self.cfg, array_initiators) return res except array_errors.VolumeMappedToMultipleHostsError as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.FAILED_PRECONDITION) return csi_pb2.ControllerPublishVolumeResponse() except array_errors.PermissionDeniedError as ex: context.set_code(grpc.StatusCode.PERMISSION_DENIED) context.set_details(ex.message) return csi_pb2.ControllerPublishVolumeResponse() except (array_errors.LunAlreadyInUseError, array_errors.NoAvailableLunError) as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.RESOURCE_EXHAUSTED) return csi_pb2.ControllerPublishVolumeResponse() except (array_errors.HostNotFoundError, array_errors.ObjectNotFoundError, array_errors.NoIscsiTargetsFoundError, ObjectIdError) as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.NOT_FOUND) return csi_pb2.ControllerPublishVolumeResponse() except (ValidationException, array_errors.IllegalObjectID, array_errors.UnsupportedConnectivityTypeError) as ex: logger.exception(ex) context.set_details(ex.message) context.set_code(grpc.StatusCode.INVALID_ARGUMENT) return csi_pb2.ControllerPublishVolumeResponse() except Exception as ex: logger.debug("an internal exception occurred") logger.exception(ex) context.set_code(grpc.StatusCode.INTERNAL) context.set_details( 'an internal exception occurred : {}'.format(ex)) return csi_pb2.ControllerPublishVolumeResponse()