@Override public void deleteExportMask( StorageSystem storage, URI exportMaskId, List<URI> volumeURIList, List<URI> targetURIList, List<Initiator> initiatorList, TaskCompleter taskCompleter) throws DeviceControllerException { log.info("{} deleteExportMask START...", storage.getSerialNumber()); log.info("Export mask id: {}", exportMaskId); try { // There is no masking concept on Cinder to delete the export mask. // But before marking the task completer as ready, // detach the volumes from the initiators that are there in the export mask. ExportMask exportMask = dbClient.queryObject(ExportMask.class, exportMaskId); List<Volume> volumeList = new ArrayList<Volume>(); StringMap volumes = exportMask.getUserAddedVolumes(); StringMap initiators = exportMask.getUserAddedInitiators(); if (volumes != null) { for (String vol : volumes.values()) { URI volumeURI = URI.create(vol); volumeURIList.add(volumeURI); Volume volume = dbClient.queryObject(Volume.class, volumeURI); volumeList.add(volume); } } if (initiators != null) { for (String ini : initiators.values()) { Initiator initiatorObj = dbClient.queryObject(Initiator.class, URI.create(ini)); initiatorList.add(initiatorObj); } } log.info("deleteExportMask: volumes: {}", volumeURIList); log.info("deleteExportMask: assignments: {}", targetURIList); log.info("deleteExportMask: initiators: {}", initiatorList); detachVolumesFromInitiators(storage, volumeList, initiatorList); taskCompleter.ready(dbClient); } catch (final Exception ex) { log.error("Problem in DetachVolumes: ", ex); ServiceError serviceError = DeviceControllerErrors.cinder.operationFailed("doDetachVolumes", ex.getMessage()); taskCompleter.error(dbClient, serviceError); } log.info("{} deleteExportMask END...", storage.getSerialNumber()); }
@Override public void removeInitiator( StorageSystem storage, URI exportMaskId, List<Initiator> initiators, List<URI> targets, TaskCompleter taskCompleter) throws DeviceControllerException { log.info("{} removeInitiator START...", storage.getSerialNumber()); log.info("Export mask id: {}", exportMaskId); log.info("removeInitiator: initiators : {}", initiators); log.info("removeInitiator: targets : {}", targets); try { ExportMask exportMask = dbClient.queryObject(ExportMask.class, exportMaskId); List<Volume> volumeList = new ArrayList<Volume>(); StringMap volumes = exportMask.getUserAddedVolumes(); for (String vol : volumes.values()) { Volume volume = dbClient.queryObject(Volume.class, URI.create(vol)); volumeList.add(volume); } detachVolumesFromInitiators(storage, volumeList, initiators); taskCompleter.ready(dbClient); } catch (final Exception ex) { log.error("Problem in RemoveInitiators: ", ex); ServiceError serviceError = DeviceControllerErrors.cinder.operationFailed("doRemoveInitiators", ex.getMessage()); taskCompleter.error(dbClient, serviceError); } log.info("{} removeInitiator END...", storage.getSerialNumber()); }
@Override public void addVolume( StorageSystem storage, URI exportMaskId, VolumeURIHLU[] volumeURIHLUs, TaskCompleter taskCompleter) throws DeviceControllerException { log.info("{} addVolume START...", storage.getSerialNumber()); log.info("Export mask id: {}", exportMaskId); log.info("addVolume: volume-HLU pairs: {}", volumeURIHLUs); log.info("User assigned HLUs will be ignored as Cinder does not support it."); try { ExportMask exportMask = dbClient.queryObject(ExportMask.class, exportMaskId); List<Volume> volumes = new ArrayList<Volume>(); List<Initiator> initiatorList = new ArrayList<Initiator>(); // map to store target LUN id generated for each volume Map<URI, Integer> volumeToTargetLunMap = new HashMap<URI, Integer>(); StringMap initiators = exportMask.getUserAddedInitiators(); for (VolumeURIHLU volumeURIHLU : volumeURIHLUs) { URI volumeURI = volumeURIHLU.getVolumeURI(); Volume volume = dbClient.queryObject(Volume.class, volumeURI); volumes.add(volume); } for (String ini : initiators.values()) { Initiator initiator = dbClient.queryObject(Initiator.class, URI.create(ini)); initiatorList.add(initiator); } // Map to store volume to initiatorTargetMap Map<Volume, Map<String, List<String>>> volumeToFCInitiatorTargetMap = new HashMap<Volume, Map<String, List<String>>>(); attachVolumesToInitiators( storage, volumes, initiatorList, volumeToTargetLunMap, volumeToFCInitiatorTargetMap, exportMask); // Update targets in the export mask if (!volumeToFCInitiatorTargetMap.isEmpty()) { updateTargetsInExportMask( storage, volumes.get(0), volumeToFCInitiatorTargetMap, initiatorList, exportMask); } updateTargetLunIdInExportMask(volumeToTargetLunMap, exportMask); dbClient.updateAndReindexObject(exportMask); taskCompleter.ready(dbClient); } catch (final Exception ex) { log.error("Problem in AddVolumes: ", ex); ServiceError serviceError = DeviceControllerErrors.cinder.operationFailed("doAddVolumes", ex.getMessage()); taskCompleter.error(dbClient, serviceError); } log.info("{} addVolume END...", storage.getSerialNumber()); }
@Override public void addInitiator( StorageSystem storage, URI exportMaskId, List<Initiator> initiators, List<URI> targets, TaskCompleter taskCompleter) throws DeviceControllerException { log.info("{} addInitiator START...", storage.getSerialNumber()); log.info("Export mask id: {}", exportMaskId); log.info("addInitiator: initiators : {}", initiators); log.info("addInitiator: targets : {}", targets); try { ExportMask exportMask = dbClient.queryObject(ExportMask.class, exportMaskId); List<Volume> volumeList = new ArrayList<Volume>(); // map to store target LUN id generated for each volume Map<URI, Integer> volumeToTargetLunMap = new HashMap<URI, Integer>(); StringMap volumes = exportMask.getUserAddedVolumes(); for (String vol : volumes.values()) { Volume volume = dbClient.queryObject(Volume.class, URI.create(vol)); volumeList.add(volume); } // Map to store volume to initiatorTargetMap Map<Volume, Map<String, List<String>>> volumeToFCInitiatorTargetMap = new HashMap<Volume, Map<String, List<String>>>(); attachVolumesToInitiators( storage, volumeList, initiators, volumeToTargetLunMap, volumeToFCInitiatorTargetMap, exportMask); // Update targets in the export mask if (!volumeToFCInitiatorTargetMap.isEmpty()) { updateTargetsInExportMask( storage, volumeList.get(0), volumeToFCInitiatorTargetMap, initiators, exportMask); dbClient.updateAndReindexObject(exportMask); } // TODO : update volumeToTargetLunMap in export mask.? // Do we get different LUN ID for the new initiators from the same Host.? taskCompleter.ready(dbClient); } catch (final Exception ex) { log.error("Problem in AddInitiators: ", ex); ServiceError serviceError = DeviceControllerErrors.cinder.operationFailed("doAddInitiators", ex.getMessage()); taskCompleter.error(dbClient, serviceError); } log.info("{} addInitiator END...", storage.getSerialNumber()); }