use of com.emc.vipr.client.Task in project coprhd-controller by CoprHD.
the class ComputeUtils method exportBootVols.
/**
* Exports all boot volumes to respective hosts.
*
* Since exporting to boot volumes requires only one volume be exported for OS install, we have extra checks
* in here:
* - If there is an existing EG with the same name, we need to make additional checks:
* - If the EG has no initiators and volumes, re-use it. Add the host and volume.
* - If the EG has our initiators and a volume (or more), error out.
* - If the EG has different initiators, create an EG with a different name.
* - If the EG has our initiators and no volumes, re-use it. Add the volume only.
*
* @param hostToVolumeIdMap host to boot volume ID map
* @param project project
* @param virtualArray virtual array
* @param hlu HLU
* @param portGroup port group URI
* @return returns a map of hosts to Export Group URIs
*/
public static Map<Host, URI> exportBootVols(Map<Host, URI> hostToVolumeIdMap, URI project, URI virtualArray, Integer hlu, URI portGroup) {
if (hostToVolumeIdMap == null || hostToVolumeIdMap.isEmpty()) {
return Maps.newHashMap();
}
Map<Task<ExportGroupRestRep>, Host> taskToHostMap = new HashMap<>();
for (Entry<Host, URI> hostToVolumeIdEntry : hostToVolumeIdMap.entrySet()) {
Host host = hostToVolumeIdEntry.getKey();
URI volumeId = hostToVolumeIdEntry.getValue();
if (!NullColumnValueGetter.isNullURI(volumeId) && (host != null) && !(host.getInactive())) {
try {
ExportGroupRestRep export = BlockStorageUtils.findExportByHost(host, project, virtualArray, null);
if (export != null && !export.getVolumes().isEmpty()) {
throw new IllegalStateException(new Throwable("Existing export contains other volumes. Controller supports only the boot volume visible to host." + host.getHostName()));
}
// We can add the host to that export group if it's empty.
if (export == null) {
export = BlockStorageUtils.findExportsByName(host.getHostName(), project, virtualArray);
}
boolean createExport = export == null;
boolean isEmptyExport = export != null && BlockStorageUtils.isEmptyExport(export);
String exportName = host.getHostName();
if (export != null && !isEmptyExport) {
exportName = exportName + BlockStorageUtils.UNDERSCORE + new SimpleDateFormat("yyyyMMddhhmmssSSS").format(new Date());
createExport = true;
}
Task<ExportGroupRestRep> task = null;
if (createExport) {
task = BlockStorageUtils.createHostExportNoWait(exportName, project, virtualArray, Arrays.asList(volumeId), hlu, host, portGroup);
} else {
task = BlockStorageUtils.addHostAndVolumeToExportNoWait(export.getId(), // Don't add the host if there are already initiators in this export group.
export.getInitiators() != null && !export.getInitiators().isEmpty() ? null : host.getId(), volumeId, hlu, portGroup);
}
taskToHostMap.put(task, host);
} catch (ExecutionException e) {
String errorMessage = e.getMessage() == null ? "" : e.getMessage();
ExecutionUtils.currentContext().logError("computeutils.exportbootvolumes.failure", host.getHostName(), errorMessage);
}
// prevent exports from rolling back on exception
ExecutionUtils.clearRollback();
}
}
// Monitor tasks
Map<Host, URI> hostToEgIdMap = new HashMap<>();
List<Task<ExportGroupRestRep>> tasks = new ArrayList<>(taskToHostMap.keySet());
while (!tasks.isEmpty()) {
tasks = waitAndRefresh(tasks);
for (Task<ExportGroupRestRep> successfulTask : getSuccessfulTasks(tasks)) {
URI exportId = successfulTask.getResourceId();
addAffectedResource(exportId);
hostToEgIdMap.put(taskToHostMap.get(successfulTask), exportId);
tasks.remove(successfulTask);
}
for (Task<ExportGroupRestRep> failedTask : getFailedTasks(tasks)) {
String errorMessage = failedTask.getMessage() == null ? "" : failedTask.getMessage();
ExecutionUtils.currentContext().logError("computeutils.exportbootvolumes.failure", failedTask.getResource().getName(), errorMessage);
tasks.remove(failedTask);
}
}
return hostToEgIdMap;
}
use of com.emc.vipr.client.Task in project coprhd-controller by CoprHD.
the class ComputeUtils method installOsOnHosts.
/**
* Install OS image on the specified hosts
* @param map of Host to OsInstallParam -- this param has the details of which image to use, the netmask, ip address, etc required for installing os
*/
public static void installOsOnHosts(Map<Host, OsInstallParam> osInstallParamMap) {
if ((osInstallParamMap == null) || osInstallParamMap.isEmpty()) {
return;
}
Set<Host> hosts = osInstallParamMap.keySet();
// execute all tasks (no waiting)
List<Task<HostRestRep>> tasks = Lists.newArrayList();
for (Host host : hosts) {
if (host != null) {
if (osInstallParamMap.get(host) == null) {
continue;
}
try {
tasks.add(execute(new InstallOs(host, osInstallParamMap.get(host))));
} catch (Exception e) {
ExecutionUtils.currentContext().logError("computeutils.installOs.failure", host.getId() + " " + e.getMessage());
}
}
}
// monitor tasks
while (!tasks.isEmpty()) {
tasks = waitAndRefresh(tasks);
for (Task<HostRestRep> successfulTask : getSuccessfulTasks(tasks)) {
tasks.remove(successfulTask);
URI hostId = successfulTask.getResource().getId();
Host newHost = execute(new GetHost(hostId));
if (newHost == null) {
ExecutionUtils.currentContext().logError("computeutils.installOs.installing.failure", successfulTask.getResource().getName());
} else {
ExecutionUtils.currentContext().logInfo("computeutils.installOs.success", newHost.getHostName());
addAffectedResource(hostId);
}
}
for (Task<HostRestRep> failedTask : getFailedTasks(tasks)) {
tasks.remove(failedTask);
String errorMessage = failedTask.getMessage() == null ? "" : failedTask.getMessage();
ExecutionUtils.currentContext().logError("computeutils.installOs.installing.failure.task", failedTask.getResource().getName(), errorMessage);
}
}
}
use of com.emc.vipr.client.Task in project coprhd-controller by CoprHD.
the class ComputeUtils method setHostBootVolumes.
/**
* Sets the specified host's boot volume association; Optionally also sets the UCS service profile's san boot targets
* Any hosts for which boot volume association could not be set are deactivated.
*
* @param Map of Host to bootVolume URI
* @param boolean set to true to update the UCS service profile's san boot targets
* @return list of hosts for which boot volume association was successfully set.
*/
public static List<Host> setHostBootVolumes(Map<Host, URI> hostToVolumeIdMap, boolean updateSanBootTargets) {
List<Task<HostRestRep>> tasks = new ArrayList<>();
Map<URI, URI> volumeIdToHostIdMap = new HashMap<>();
for (Entry<Host, URI> hostToVolumeIdEntry : hostToVolumeIdMap.entrySet()) {
Host host = hostToVolumeIdEntry.getKey();
URI volumeId = hostToVolumeIdEntry.getValue();
volumeIdToHostIdMap.put(volumeId, host.getId());
if (host != null && !host.getInactive()) {
host.setBootVolumeId(volumeId);
try {
Task<HostRestRep> task = ViPRExecutionUtils.execute(new SetBootVolume(host, volumeId, updateSanBootTargets));
tasks.add(task);
} catch (Exception e) {
ExecutionUtils.currentContext().logError("computeutils.sethostbootvolume.failure", host.getHostName() + " " + e.getMessage());
}
}
}
// monitor tasks
List<URI> successfulHostIds = Lists.newArrayList();
List<URI> hostsToRemove = Lists.newArrayList();
List<URI> bootVolumesToRemove = Lists.newArrayList();
while (!tasks.isEmpty()) {
tasks = waitAndRefresh(tasks);
for (Task<HostRestRep> successfulTask : getSuccessfulTasks(tasks)) {
tasks.remove(successfulTask);
URI hostId = successfulTask.getResource().getId();
Host newHost = execute(new GetHost(hostId));
if (newHost == null || newHost.getBootVolumeId() == null || newHost.getBootVolumeId().equals("null")) {
ExecutionUtils.currentContext().logError("computeutils.sethostbootvolume.failure", successfulTask.getResource().getName());
hostsToRemove.add(hostId);
} else {
ExecutionUtils.currentContext().logInfo("computeutils.sethostbootvolume.success", newHost.getHostName());
addAffectedResource(hostId);
successfulHostIds.add(hostId);
}
}
for (Task<HostRestRep> failedTask : getFailedTasks(tasks)) {
tasks.remove(failedTask);
String errorMessage = failedTask.getMessage() == null ? "" : failedTask.getMessage();
ExecutionUtils.currentContext().logError("computeutils.sethostbootvolume.failure.task", failedTask.getResource().getName(), errorMessage);
URI hostId = failedTask.getResource().getId();
execute(new GetHost(hostId));
hostsToRemove.add(hostId);
}
}
for (Host host : hostToVolumeIdMap.keySet()) {
if (host != null && !host.getInactive()) {
if (!successfulHostIds.contains(host.getId()) && !hostsToRemove.contains(host.getId())) {
hostsToRemove.add(host.getId());
}
}
}
for (URI hostId : hostsToRemove) {
for (Host host : hostToVolumeIdMap.keySet()) {
if (host.getId().equals(hostId)) {
ExecutionUtils.currentContext().logInfo("computeutils.deactivatehost.nobootvolumeassociation", host.getHostName());
bootVolumesToRemove.add(hostToVolumeIdMap.get(host));
break;
}
}
execute(new DeactivateHost(hostId, true));
}
// Cleanup all boot volumes of the deactivated host so that we do not leave any unused boot volumes.
if (!bootVolumesToRemove.isEmpty()) {
try {
ExecutionUtils.currentContext().logInfo("computeutils.deactivatebootvolume.nobootvolumeassociation");
for (URI bootVolToRemove : bootVolumesToRemove) {
BlockObjectRestRep volume = BlockStorageUtils.getBlockResource(bootVolToRemove);
URI hostId = volumeIdToHostIdMap.get(bootVolToRemove);
removeBootVolumeTag(volume, hostId);
}
BlockStorageUtils.deactivateVolumes(bootVolumesToRemove, VolumeDeleteTypeEnum.FULL);
} catch (Exception e) {
ExecutionUtils.currentContext().logError("computeutils.bootvolume.deactivate.failure", e.getMessage());
}
}
// Only return successful hosts
List<Host> successfulHosts = new ArrayList<>();
for (Host host : hostToVolumeIdMap.keySet()) {
if ((host != null) && successfulHostIds.contains(host.getId())) {
successfulHosts.add(host);
}
}
return successfulHosts;
}
use of com.emc.vipr.client.Task in project coprhd-controller by CoprHD.
the class BlockExportGroups method delete.
private static void delete(List<URI> ids) {
if (ids != null) {
ViPRCoreClient client = BourneUtil.getViprClient();
List<Task<ExportGroupRestRep>> tasks = Lists.newArrayList();
for (URI id : ids) {
Task<ExportGroupRestRep> task = client.blockExports().deactivate(id);
tasks.add(task);
}
flash.put("info", MessagesUtils.get("resources.exportgroups.deactivate", tasks.size()));
}
exportGroups(null);
}
use of com.emc.vipr.client.Task in project coprhd-controller by CoprHD.
the class BlockSnapshots method snapshotDetails.
public static void snapshotDetails(String snapshotId) {
ViPRCoreClient client = BourneUtil.getViprClient();
AffectedResources.BlockSnapshotDetails blockSnapshot = new AffectedResources.BlockSnapshotDetails(uri(snapshotId));
if (blockSnapshot.blockSnapshot == null) {
flash.error(MessagesUtils.get(UNKNOWN, snapshotId));
snapshots(null);
}
AffectedResources.VolumeDetails volume = new AffectedResources.VolumeDetails(blockSnapshot.volume.getId());
List<Task<BlockSnapshotRestRep>> tasks = null;
if (blockSnapshot.blockSnapshot != null) {
Tasks<BlockSnapshotRestRep> tasksResponse = client.blockSnapshots().getTasks(blockSnapshot.blockSnapshot.getId());
tasks = tasksResponse.getTasks();
}
render(blockSnapshot, volume, tasks);
}
Aggregations