use of com.emc.storageos.storagedriver.model.Initiator in project coprhd-controller by CoprHD.
the class ExternalDeviceUnManagedVolumeDiscoverer method verifyHostExports.
/**
* Validates that hostExportInfo has the same set of initiators and storage ports as provided input arguments.
*
* @param initiatorNetworkIds [IN] Set of initiator network ids
* @param storagePortNativeIds [IN] Set of storage ports network ids
* @param hostExportInfo [IN] host export info to verify
* @return true if verification passed, false otherwise
*/
boolean verifyHostExports(Set<String> initiatorNetworkIds, Set<String> storagePortNativeIds, HostExportInfo hostExportInfo) {
if (initiatorNetworkIds == null || storagePortNativeIds == null) {
return false;
}
boolean isValid = true;
Set<String> initiatorNetworkIdsSet = new HashSet<>();
Set<String> targetNativeIdsSet = new HashSet<>();
List<Initiator> initiatorsList = hostExportInfo.getInitiators();
List<StoragePort> targetsList = hostExportInfo.getTargets();
for (Initiator initiator : initiatorsList) {
initiatorNetworkIdsSet.add(initiator.getPort());
}
for (StoragePort port : targetsList) {
targetNativeIdsSet.add(port.getNativeId());
}
// compare with benchmark initiator and target set
if (!initiatorNetworkIds.equals(initiatorNetworkIdsSet) || !storagePortNativeIds.equals(targetNativeIdsSet)) {
isValid = false;
}
return isValid;
}
use of com.emc.storageos.storagedriver.model.Initiator in project coprhd-controller by CoprHD.
the class ExternalDeviceUnManagedVolumeDiscoverer method createUnManagedExportMask.
/**
* This method builds unManaged export mask from the provided hostExportInfo.
*
* @param hostExportInfo source for unmanaged export mask data
* @param unManagedVolumesUris set of unManaged volumes database ids for unManaged mask
* @param managedVolumesUris set of managed volumes database ids for unManaged mask
* @param dbClient reference to db client [IN]
* @return unManaged export mask
*/
private UnManagedExportMask createUnManagedExportMask(com.emc.storageos.db.client.model.StorageSystem storageSystem, HostExportInfo hostExportInfo, Set<String> unManagedVolumesUris, Set<String> managedVolumesUris, DbClient dbClient) {
UnManagedExportMask exportMask = new UnManagedExportMask();
exportMask.setId(URIUtil.createId(UnManagedExportMask.class));
StringSet knownInitiatorUris = new StringSet();
StringSet knownInitiatorNetworkIds = new StringSet();
StringSet unknownInitiatorNetworkIds = new StringSet();
StringSet knownStoragePortUris = new StringSet();
StringSet unmanagedStoragePortNetworkIds = new StringSet();
StringSet unknownVolumesUris = new StringSet();
StringSet knownVolumesUris = new StringSet();
List<com.emc.storageos.db.client.model.Initiator> knownFCInitiators = new ArrayList<>();
List<com.emc.storageos.db.client.model.StoragePort> knownFCPorts = new ArrayList<>();
// FQDN of a host
String hostName = hostExportInfo.getHostName();
// List of host initiators
List<Initiator> initiators = hostExportInfo.getInitiators();
// List of storage ports
List<StoragePort> targets = hostExportInfo.getTargets();
exportMask.setMaskName(getUnManagedMaskName(hostName, storageSystem.getNativeGuid()));
exportMask.setStorageSystemUri(storageSystem.getId());
// get URIs for the initiators
for (Initiator driverInitiator : initiators) {
com.emc.storageos.db.client.model.Initiator knownInitiator = NetworkUtil.getInitiator(driverInitiator.getPort(), dbClient);
if (knownInitiator != null) {
URI initiatorUri = knownInitiator.getId();
knownInitiatorUris.add(initiatorUri.toString());
knownInitiatorNetworkIds.add(driverInitiator.getPort());
if (HostInterface.Protocol.FC.toString().equals(knownInitiator.getProtocol())) {
knownFCInitiators.add(knownInitiator);
}
} else {
// unknown initiator
unknownInitiatorNetworkIds.add(driverInitiator.getPort());
}
}
exportMask.setKnownInitiatorNetworkIds(knownInitiatorNetworkIds);
exportMask.setKnownInitiatorUris(knownInitiatorUris);
exportMask.setUnmanagedInitiatorNetworkIds(unknownInitiatorNetworkIds);
// get URIs for storage ports
for (StoragePort driverPort : targets) {
String portNativeGuid = NativeGUIDGenerator.generateNativeGuid(storageSystem, driverPort.getNativeId(), NativeGUIDGenerator.PORT);
URIQueryResultList storagePortURIs = new URIQueryResultList();
dbClient.queryByConstraint(AlternateIdConstraint.Factory.getStoragePortByNativeGuidConstraint(portNativeGuid), storagePortURIs);
if (storagePortURIs.iterator().hasNext()) {
URI portUri = storagePortURIs.iterator().next();
knownStoragePortUris.add(portUri.toString());
com.emc.storageos.db.client.model.StoragePort port = dbClient.queryObject(com.emc.storageos.db.client.model.StoragePort.class, portUri);
if (com.emc.storageos.db.client.model.StoragePort.TransportType.FC.toString().equals(port.getTransportType())) {
knownFCPorts.add(port);
}
} else {
// unknown storage port
unmanagedStoragePortNetworkIds.add(driverPort.getPortNetworkId());
}
}
exportMask.setKnownStoragePortUris(knownStoragePortUris);
exportMask.setUnmanagedStoragePortNetworkIds(unmanagedStoragePortNetworkIds);
// set unManaged volume uris
if (unManagedVolumesUris != null && !unManagedVolumesUris.isEmpty()) {
unknownVolumesUris.addAll(unManagedVolumesUris);
exportMask.setUnmanagedVolumeUris(unknownVolumesUris);
}
// set managed volume uris
if (managedVolumesUris != null && !managedVolumesUris.isEmpty()) {
knownVolumesUris.addAll(managedVolumesUris);
exportMask.setKnownVolumeUris(knownVolumesUris);
}
// populate zone map for FC initiators and FC storage ports from the mask.
// we zone only known FC initiators to known FC ports defined in the mask.
updateZoningMap(exportMask, knownFCInitiators, knownFCPorts);
return exportMask;
}
use of com.emc.storageos.storagedriver.model.Initiator in project coprhd-controller by CoprHD.
the class ExternalDeviceExportOperations method addVolumes.
@Override
public void addVolumes(StorageSystem storage, URI exportMaskUri, VolumeURIHLU[] volumeURIHLUs, List<com.emc.storageos.db.client.model.Initiator> initiatorList, TaskCompleter taskCompleter) throws DeviceControllerException {
log.info("{} addVolumes START...", storage.getSerialNumber());
try {
log.info("addVolumes: Export mask id: {}", exportMaskUri);
log.info("addVolumes: New volumes to add: volume-HLU pairs: {}", Joiner.on(',').join(volumeURIHLUs));
if (initiatorList != null) {
log.info("addVolumes: initiators: {}", Joiner.on(',').join(initiatorList));
}
BlockStorageDriver driver = externalDevice.getDriver(storage.getSystemType());
ExportMask exportMask = (ExportMask) dbClient.queryObject(exportMaskUri);
StringSet maskInitiators = exportMask.getInitiators();
List<String> maskInitiatorList = new ArrayList<>();
for (String initiatorUri : maskInitiators) {
maskInitiatorList.add(initiatorUri);
}
log.info("Export mask existing initiators: {} ", Joiner.on(',').join(maskInitiatorList));
StringSet storagePorts = exportMask.getStoragePorts();
List<URI> portList = new ArrayList<>();
for (String portUri : storagePorts) {
portList.add(URI.create(portUri));
}
log.info("Export mask existing storage ports: {} ", Joiner.on(',').join(portList));
// Get export group uri from task completer
URI exportGroupUri = taskCompleter.getId();
ExportGroup exportGroup = (ExportGroup) dbClient.queryObject(exportGroupUri);
Set<URI> volumeUris = new HashSet<>();
for (VolumeURIHLU volumeURIHLU : volumeURIHLUs) {
URI volumeURI = volumeURIHLU.getVolumeURI();
volumeUris.add(volumeURI);
}
// Prepare volumes. We send to driver only new volumes for the export mask.
List<StorageVolume> driverVolumes = new ArrayList<>();
Map<String, String> driverVolumeToHLUMap = new HashMap<>();
Map<String, URI> volumeNativeIdToUriMap = new HashMap<>();
prepareVolumes(storage, volumeURIHLUs, driverVolumes, driverVolumeToHLUMap, volumeNativeIdToUriMap);
// Prepare initiators
Set<com.emc.storageos.db.client.model.Initiator> initiators = ExportMaskUtils.getInitiatorsForExportMask(dbClient, exportMask, null);
List<Initiator> driverInitiators = new ArrayList<>();
prepareInitiators(initiators, exportGroup.forCluster(), driverInitiators);
// Prepare target storage ports
List<StoragePort> recommendedPorts = new ArrayList<>();
List<StoragePort> availablePorts = new ArrayList<>();
List<StoragePort> selectedPorts = new ArrayList<>();
// Prepare ports for driver call. Populate lists of recommended and available ports.
Map<String, com.emc.storageos.db.client.model.StoragePort> nativeIdToAvailablePortMap = new HashMap<>();
// We use existing ports in the mask as recommended ports.
preparePorts(storage, exportMaskUri, portList, recommendedPorts, availablePorts, nativeIdToAvailablePortMap);
log.info("varray ports: {}", nativeIdToAvailablePortMap);
// For add volumes to existing export mask, we do not allow storage port change in the mask.
// Only ports in the mask are available for driver call.
availablePorts = recommendedPorts;
ExportPathParams pathParams = blockScheduler.calculateExportPathParamForVolumes(volumeUris, exportGroup.getNumPaths(), storage.getId(), exportGroupUri);
StorageCapabilities capabilities = new StorageCapabilities();
// Prepare num paths to send to driver
prepareCapabilities(pathParams, capabilities);
MutableBoolean usedRecommendedPorts = new MutableBoolean(true);
// Ready to call driver
DriverTask task = driver.exportVolumesToInitiators(driverInitiators, driverVolumes, driverVolumeToHLUMap, recommendedPorts, availablePorts, capabilities, usedRecommendedPorts, selectedPorts);
// todo: need to implement support for async case.
if (task.getStatus() == DriverTask.TaskStatus.READY) {
String msg = String.format("Created export for volumes: %s . Used recommended ports: %s .", task.getMessage(), usedRecommendedPorts);
log.info(msg);
log.info("Driver selected storage ports: {} ", Joiner.on(',').join(selectedPorts));
// auto san zoning is enabled, we will fail the request.
if (usedRecommendedPorts.isFalse() && !selectedPorts.containsAll(recommendedPorts)) {
// for auto san zoning enabled we can not support case when selected ports do not include ports which are already in the mask
VirtualArray varray = dbClient.queryObject(VirtualArray.class, exportGroup.getVirtualArray());
log.info("AutoSanZoning for varray {} is {} ", varray.getLabel(), varray.getAutoSanZoning());
if (varray.getAutoSanZoning()) {
String errorMsg = String.format("AutoSanZoning is enabled and driver selected ports do not contain ports from the export mask: %s .", task.getMessage());
log.error(errorMsg);
ServiceError serviceError = ExternalDeviceException.errors.addVolumesToExportMaskFailed("addVolumes", errorMsg);
taskCompleter.error(dbClient, serviceError);
} else {
// auto san zoning is disabled --- add new selected ports to the mask
// we do not care about zoning map in this case
List<com.emc.storageos.db.client.model.StoragePort> selectedPortsForMask = new ArrayList<>();
for (StoragePort driverPort : selectedPorts) {
log.info("Driver selected port: {}", driverPort);
com.emc.storageos.db.client.model.StoragePort port = nativeIdToAvailablePortMap.get(driverPort.getNativeId());
if (port != null) {
// add all ports, StringSet in the mask will ignore duplicates
log.info("System port: {}", port);
selectedPortsForMask.add(port);
}
}
for (com.emc.storageos.db.client.model.StoragePort port : selectedPortsForMask) {
exportMask.addTarget(port.getId());
}
dbClient.updateObject(exportMask);
taskCompleter.ready(dbClient);
}
} else {
// Update volumes Lun Ids in export mask based on driver selection
for (String volumeNativeId : driverVolumeToHLUMap.keySet()) {
String targetLunId = driverVolumeToHLUMap.get(volumeNativeId);
URI volumeUri = volumeNativeIdToUriMap.get(volumeNativeId);
exportMask.getVolumes().put(volumeUri.toString(), targetLunId);
}
dbClient.updateObject(exportMask);
taskCompleter.ready(dbClient);
}
} else {
String errorMsg = String.format("Failed to add volumes to export mask: %s .", task.getMessage());
log.error(errorMsg);
ServiceError serviceError = ExternalDeviceException.errors.addVolumesToExportMaskFailed("addVolumes", errorMsg);
taskCompleter.error(dbClient, serviceError);
}
} catch (Exception ex) {
log.error("Problem in addVolumes: ", ex);
String errorMsg = String.format("Failed to add volumes to export mask: %s .", ex.getMessage());
log.error(errorMsg);
ServiceError serviceError = ExternalDeviceException.errors.addVolumesToExportMaskFailed("addVolumes", errorMsg);
taskCompleter.error(dbClient, serviceError);
}
log.info("{} addVolumes END...", storage.getSerialNumber());
}
use of com.emc.storageos.storagedriver.model.Initiator in project coprhd-controller by CoprHD.
the class ExternalDeviceExportOperations method removeInitiators.
@Override
public void removeInitiators(StorageSystem storage, URI exportMaskUri, List<URI> volumeURIList, List<com.emc.storageos.db.client.model.Initiator> initiatorList, List<URI> targetURIList, TaskCompleter taskCompleter) throws DeviceControllerException {
log.info("{} removeInitiators START...", storage.getSerialNumber());
try {
log.info("removeInitiators: Export mask id: {}", exportMaskUri);
if (volumeURIList != null) {
log.info("removeInitiators: volumes : {}", Joiner.on(',').join(volumeURIList));
}
log.info("removeInitiators: initiators : {}", Joiner.on(',').join(initiatorList));
log.info("removeInitiators: targets : {}", Joiner.on(',').join(targetURIList));
BlockStorageDriver driver = externalDevice.getDriver(storage.getSystemType());
ExportMask exportMask = (ExportMask) dbClient.queryObject(exportMaskUri);
List<URI> volumeUris = ExportMaskUtils.getVolumeURIs(exportMask);
log.info("Export mask existing volumes: {} ", volumeUris);
// Prepare volumes
List<StorageVolume> driverVolumes = new ArrayList<>();
prepareVolumes(storage, volumeUris, driverVolumes);
// Prepare initiators
List<Initiator> driverInitiators = new ArrayList<>();
// Get export group uri from task completer
URI exportGroupUri = taskCompleter.getId();
ExportGroup exportGroup = (ExportGroup) dbClient.queryObject(exportGroupUri);
prepareInitiators(initiatorList, exportGroup.forCluster(), driverInitiators);
// Ready to call driver
DriverTask task = driver.unexportVolumesFromInitiators(driverInitiators, driverVolumes);
// todo: need to implement support for async case.
if (task.getStatus() == DriverTask.TaskStatus.READY) {
String msg = String.format("Removed initiators from export mask: %s.", task.getMessage());
log.info(msg);
taskCompleter.ready(dbClient);
} else {
String errorMsg = String.format("Failed to remove initiators from export mask: %s .", task.getMessage());
log.error(errorMsg);
ServiceError serviceError = ExternalDeviceException.errors.removeInitiatorsFromExportMaskFailed("removeInitiators", errorMsg);
taskCompleter.error(dbClient, serviceError);
}
} catch (Exception ex) {
log.error("Problem in removeInitiators: ", ex);
String errorMsg = String.format("Failed to remove initiators from export mask: %s .", ex.getMessage());
log.error(errorMsg);
ServiceError serviceError = ExternalDeviceException.errors.removeInitiatorsFromExportMaskFailed("removeInitiators", errorMsg);
taskCompleter.error(dbClient, serviceError);
}
log.info("{} removeInitiators END...", storage.getSerialNumber());
}
use of com.emc.storageos.storagedriver.model.Initiator in project coprhd-controller by CoprHD.
the class ExternalDeviceExportOperations method addInitiators.
@Override
public void addInitiators(StorageSystem storage, URI exportMaskUri, List<URI> volumeURIs, List<com.emc.storageos.db.client.model.Initiator> initiatorList, List<URI> targetURIList, TaskCompleter taskCompleter) throws DeviceControllerException {
log.info("{} addInitiators START...", storage.getSerialNumber());
try {
log.info("addInitiators: Export mask id: {}", exportMaskUri);
if (volumeURIs != null) {
log.info("addInitiators: volumes : {}", Joiner.on(',').join(volumeURIs));
}
log.info("addInitiators: initiators : {}", Joiner.on(',').join(initiatorList));
log.info("addInitiators: targets : {}", Joiner.on(",").join(targetURIList));
BlockStorageDriver driver = externalDevice.getDriver(storage.getSystemType());
ExportMask exportMask = (ExportMask) dbClient.queryObject(exportMaskUri);
// Get export group uri from task completer
URI exportGroupUri = taskCompleter.getId();
ExportGroup exportGroup = (ExportGroup) dbClient.queryObject(exportGroupUri);
List<URI> volumeUris = ExportMaskUtils.getVolumeURIs(exportMask);
// Prepare volumes
List<StorageVolume> driverVolumes = new ArrayList<>();
Map<String, String> driverVolumeToHLUMap = new HashMap<>();
Map<String, String> volumeNativeIdToUriMap = new HashMap<>();
prepareVolumes(storage, exportMask.getVolumes(), driverVolumes, driverVolumeToHLUMap, volumeNativeIdToUriMap);
// Prepare initiators
List<Initiator> driverInitiators = new ArrayList<>();
prepareInitiators(initiatorList, exportGroup.forCluster(), driverInitiators);
// Prepare target storage ports
List<StoragePort> recommendedPorts = new ArrayList<>();
List<StoragePort> availablePorts = new ArrayList<>();
List<StoragePort> selectedPorts = new ArrayList<>();
// Prepare ports for driver call. Populate lists of recommended and available ports.
Map<String, com.emc.storageos.db.client.model.StoragePort> nativeIdToAvailablePortMap = new HashMap<>();
preparePorts(storage, exportMaskUri, targetURIList, recommendedPorts, availablePorts, nativeIdToAvailablePortMap);
ExportPathParams pathParams = blockScheduler.calculateExportPathParamForVolumes(volumeUris, exportGroup.getNumPaths(), storage.getId(), exportGroupUri);
StorageCapabilities capabilities = new StorageCapabilities();
// Prepare num paths to send to driver
prepareCapabilitiesForAddInitiators(pathParams, exportMask.getZoningMap(), exportGroup.getVirtualArray(), initiatorList, capabilities);
MutableBoolean usedRecommendedPorts = new MutableBoolean(true);
// Ready to call driver
DriverTask task = driver.exportVolumesToInitiators(driverInitiators, driverVolumes, driverVolumeToHLUMap, recommendedPorts, availablePorts, capabilities, usedRecommendedPorts, selectedPorts);
// todo: need to implement support for async case.
if (task.getStatus() == DriverTask.TaskStatus.READY) {
// If driver used recommended ports, we are done.
// Otherwise, if driver did not use recommended ports, we have to get ports selected by driver
// and use them in export mask and zones.
// We will verify driver selected ports against available ports list.
String msg = String.format("addInitiators -- Added initiators: %s . Used recommended ports: %s .", task.getMessage(), usedRecommendedPorts);
log.info(msg);
if (usedRecommendedPorts.isFalse()) {
// process driver selected ports
log.info("Ports selected by driver: {}", selectedPorts);
if (validateSelectedPorts(availablePorts, selectedPorts, pathParams.getPathsPerInitiator())) {
List<com.emc.storageos.db.client.model.StoragePort> selectedPortsForMask = new ArrayList<>();
URI varrayUri = exportGroup.getVirtualArray();
for (StoragePort driverPort : selectedPorts) {
com.emc.storageos.db.client.model.StoragePort port = nativeIdToAvailablePortMap.get(driverPort.getNativeId());
selectedPortsForMask.add(port);
}
updateStoragePortsForAddInitiators((ExportMaskAddInitiatorCompleter) taskCompleter, storage, exportMask, initiatorList, selectedPortsForMask, varrayUri, pathParams);
taskCompleter.ready(dbClient);
} else {
// selected ports are not valid. failure
String errorMsg = "addInitiators -- Ports selected by driver failed validation.";
log.error("addInitiators -- Ports selected by driver failed validation.");
ServiceError serviceError = ExternalDeviceException.errors.addInitiatorsToExportMaskFailed("addInitiators", errorMsg);
taskCompleter.error(dbClient, serviceError);
}
} else {
// Used recommended ports.
taskCompleter.ready(dbClient);
}
} else {
String errorMsg = String.format("addInitiators -- Failed to add initiators to export mask: %s .", task.getMessage());
log.error(errorMsg);
ServiceError serviceError = ExternalDeviceException.errors.addInitiatorsToExportMaskFailed("addInitiators", errorMsg);
taskCompleter.error(dbClient, serviceError);
}
} catch (Exception ex) {
log.error("addInitiators -- Failed to add initiators to export mask. ", ex);
ServiceError serviceError = ExternalDeviceException.errors.addInitiatorsToExportMaskFailed("addInitiators", ex.getMessage());
taskCompleter.error(dbClient, serviceError);
}
log.info("{} addInitiators END...", storage.getSerialNumber());
}
Aggregations