use of com.emc.storageos.driver.dellsc.scapi.StorageCenterAPIException in project coprhd-controller by CoprHD.
the class DellSCMirroring method splitVolumeMirror.
/**
* Delete volume mirror but leave the destination volume intact.
*
* @param mirrors The mirrors to split.
* @return The split task.
*/
public DriverTask splitVolumeMirror(List<VolumeMirror> mirrors) {
LOG.info("Splitting volume mirror");
DellSCDriverTask task = new DellSCDriverTask("splitVolumeMirror");
StringBuilder errBuffer = new StringBuilder();
int mirrorSplit = 0;
for (VolumeMirror mirror : mirrors) {
try {
StorageCenterAPI api = connectionManager.getConnection(mirror.getStorageSystemId());
api.deleteMirror(mirror.getNativeId());
task.setStatus(TaskStatus.READY);
mirrorSplit++;
} catch (StorageCenterAPIException | DellSCDriverException dex) {
String error = String.format("Error splitting volume mirror %s: %s", mirror.getDisplayName(), dex);
LOG.error(error);
errBuffer.append(String.format("%s%n", error));
}
}
task.setMessage(errBuffer.toString());
if (mirrorSplit == mirrors.size()) {
task.setStatus(TaskStatus.READY);
} else if (mirrorSplit == 0) {
task.setStatus(TaskStatus.FAILED);
} else {
task.setStatus(TaskStatus.PARTIALLY_FAILED);
}
return task;
}
use of com.emc.storageos.driver.dellsc.scapi.StorageCenterAPIException in project coprhd-controller by CoprHD.
the class DellSCProvisioning method getVolumeExportInfo.
/**
* Gets the mapping information for a volume to initiators.
*
* @param volumeId The volume instance ID.
* @param systemId The storage system ID.
* @return The mapping details. Map of HostName:HostExportInfo
*/
public Map<String, HostExportInfo> getVolumeExportInfo(String volumeId, String systemId) {
Map<String, HostExportInfo> result = new HashMap<>();
Map<String, ScServer> serverCache = new HashMap<>();
Map<String, Initiator> serverPortCache = new HashMap<>();
Map<String, StoragePort> portCache = new HashMap<>();
try {
StorageCenterAPI api = connectionManager.getConnection(systemId);
ScVolume scVol = api.getVolume(volumeId);
if (scVol == null) {
throw new DellSCDriverException(String.format("Volume %s could not be found.", volumeId));
}
ScMapping[] maps = api.getVolumeMaps(scVol.instanceId);
for (ScMapping map : maps) {
populateVolumeExportInfo(api, volumeId, map, result, serverCache, serverPortCache, portCache);
}
} catch (StorageCenterAPIException | DellSCDriverException dex) {
String message = String.format("Error getting export info for volume %s: %s", volumeId, dex);
LOG.warn(message);
}
return result;
}
use of com.emc.storageos.driver.dellsc.scapi.StorageCenterAPIException in project coprhd-controller by CoprHD.
the class DellSCProvisioning method createOrFindScServer.
/**
* Finds an existing server definition or creates a new one.
*
* @param ssn The Storage Center to check.
* @param api The API connection.
* @param initiators The list of initiators.
* @param matchedHbas The ScServerHbas that matched the provided initiators.
* @param createIfNotFound Whether to create the server if it's not found.
* @return The server object or null.
*/
private ScServer createOrFindScServer(StorageCenterAPI api, String ssn, List<Initiator> initiators, List<ScServerHba> matchedHbas, boolean createIfNotFound) {
ScServerOperatingSystem os = null;
Map<String, ScServer> serverLookup = new HashMap<>();
for (Initiator init : initiators) {
if (os == null) {
os = findOsType(api, ssn, init.getHostOsType());
}
if (os == null) {
LOG.warn("Unable to find OS type for initiator {}, skipping...", init.getPort());
continue;
}
String iqnOrWwn = init.getPort();
if (init.getProtocol().equals(Protocol.FC)) {
// Make sure it's in the format we expect
iqnOrWwn = iqnOrWwn.replace(":", "").toUpperCase();
}
// Try our cache first
ScServer individualServer = serverLookup.get(init.getHostName());
if (individualServer == null) {
individualServer = api.findServer(ssn, iqnOrWwn);
if (individualServer != null) {
serverLookup.put(init.getHostName(), individualServer);
}
}
// See if we need to create it
if (individualServer == null && createIfNotFound) {
try {
individualServer = api.createServer(ssn, init.getHostName(), init.getProtocol().equals(Protocol.iSCSI), os.instanceId);
} catch (StorageCenterAPIException e) {
// Well that's rather unfortunate
LOG.warn(String.format("Error creating server: %s", e));
continue;
}
// Need to add this initiator to existing server definition
ScServerHba hba = api.addHbaToServer(individualServer.instanceId, iqnOrWwn, init.getProtocol().equals(Protocol.iSCSI));
if (hba != null && !matchedHbas.contains(hba)) {
matchedHbas.add(hba);
}
}
if (individualServer != null) {
serverLookup.put(init.getHostName(), individualServer);
}
}
if (serverLookup.size() != 1) {
LOG.warn("Looking for server returned {} servers.", serverLookup.size());
}
for (ScServer scServer : serverLookup.values()) {
// Just return the first one
return scServer;
}
return null;
}
use of com.emc.storageos.driver.dellsc.scapi.StorageCenterAPIException in project coprhd-controller by CoprHD.
the class DellSCProvisioning method unexportVolumesFromInitiators.
/**
* Remove volume exports to initiators.
*
* @param initiators The initiators to remove from.
* @param volumes The volumes to remove.
* @return The unexport task.
*/
public DriverTask unexportVolumesFromInitiators(List<Initiator> initiators, List<StorageVolume> volumes) {
LOG.info("Unexporting volumes from initiators");
DriverTask task = new DellSCDriverTask("unexportVolumes");
ScServer server = null;
StringBuilder errBuffer = new StringBuilder();
int volumesUnmapped = 0;
for (StorageVolume volume : volumes) {
String ssn = volume.getStorageSystemId();
boolean isSnapshot = StringUtils.countMatches(volume.getNativeId(), ".") == 2;
try {
StorageCenterAPI api = connectionManager.getConnection(ssn);
// Find our actual volume
ScVolume scVol = null;
if (isSnapshot) {
scVol = api.findReplayView(volume.getNativeId());
// For snapshot views we can just delete the view
if (scVol != null) {
api.deleteVolume(scVol.instanceId);
volumesUnmapped++;
continue;
}
} else {
scVol = api.getVolume(volume.getNativeId());
}
if (scVol == null) {
throw new DellSCDriverException(String.format("Unable to find volume %s", volume.getNativeId()));
}
// Look up the server if needed
if (server == null) {
server = findScServer(api, ssn, initiators);
}
if (server == null) {
// Unable to find the server, can't continue
throw new DellSCDriverException(SERVER_CREATE_FAIL_MSG);
}
ScMappingProfile[] mappingProfiles = api.findMappingProfiles(server.instanceId, scVol.instanceId);
for (ScMappingProfile mappingProfile : mappingProfiles) {
api.deleteMappingProfile(mappingProfile.instanceId);
}
volumesUnmapped++;
LOG.info("Volume '{}' unexported from server '{}'", scVol.name, server.name);
} catch (StorageCenterAPIException | DellSCDriverException dex) {
String error = String.format("Error unmapping volume %s: %s", volume.getDisplayName(), dex);
LOG.error(error);
errBuffer.append(String.format("%s%n", error));
if (SERVER_CREATE_FAIL_MSG.equals(dex.getMessage())) {
// Game over
break;
}
}
}
task.setMessage(errBuffer.toString());
if (volumesUnmapped == volumes.size()) {
task.setStatus(TaskStatus.READY);
} else if (volumesUnmapped == 0) {
task.setStatus(TaskStatus.FAILED);
} else {
task.setStatus(TaskStatus.PARTIALLY_FAILED);
}
return task;
}
use of com.emc.storageos.driver.dellsc.scapi.StorageCenterAPIException in project coprhd-controller by CoprHD.
the class DellSCProvisioning method createVolumes.
/**
* Create storage volumes with a given set of capabilities.
* Before completion of the request, set all required data for provisioned
* volumes in "volumes" parameter.
*
* @param volumes Input/output argument for volumes.
* @param storageCapabilities Input argument for capabilities. Defines
* storage capabilities of volumes to create.
* @return The volume creation task.
*/
public DriverTask createVolumes(List<StorageVolume> volumes, StorageCapabilities storageCapabilities) {
DriverTask task = new DellSCDriverTask("createVolume");
StringBuilder errBuffer = new StringBuilder();
int volumesCreated = 0;
for (StorageVolume volume : volumes) {
LOG.debug("Creating volume {} on system {}", volume.getDisplayName(), volume.getStorageSystemId());
String ssn = volume.getStorageSystemId();
try {
StorageCenterAPI api = connectionManager.getConnection(ssn);
ScVolume scVol = api.createVolume(ssn, volume.getDisplayName(), volume.getStoragePoolId(), SizeUtil.byteToMeg(volume.getRequestedCapacity()), volume.getConsistencyGroup());
volume.setProvisionedCapacity(SizeUtil.sizeStrToBytes(scVol.configuredSize));
// New volumes don't allocate any space
volume.setAllocatedCapacity(0L);
volume.setWwn(scVol.deviceId);
volume.setNativeId(scVol.instanceId);
volume.setDeviceLabel(scVol.name);
volume.setAccessStatus(AccessStatus.READ_WRITE);
volumesCreated++;
LOG.info("Created volume '{}'", scVol.name);
} catch (StorageCenterAPIException | DellSCDriverException dex) {
String error = String.format("Error creating volume %s: %s", volume.getDisplayName(), dex);
LOG.error(error);
errBuffer.append(String.format("%s%n", error));
}
}
task.setMessage(errBuffer.toString());
if (volumesCreated == volumes.size()) {
task.setStatus(TaskStatus.READY);
} else if (volumesCreated == 0) {
task.setStatus(TaskStatus.FAILED);
} else {
task.setStatus(TaskStatus.PARTIALLY_FAILED);
}
return task;
}
Aggregations