/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.sa.service.vmware.tasks;
import org.apache.commons.lang.StringUtils;
import com.emc.sa.engine.ExecutionTask;
import com.vmware.vim25.TaskInfo;
import com.vmware.vim25.TaskInfoState;
import com.vmware.vim25.mo.Task;
public class VMwareTask<T> extends ExecutionTask<T> {
protected void waitForTask(Task task) throws Exception {
boolean cancel = false;
long maxTime = System.currentTimeMillis() + (60 * 1000);
while (!isComplete(task)) {
Thread.sleep(5000);
if (System.currentTimeMillis() > maxTime) {
cancel = true;
break;
}
}
if (cancel) {
cancelTask(task);
}
}
private boolean isComplete(Task task) throws Exception {
TaskInfo info = task.getTaskInfo();
TaskInfoState state = info.getState();
if (state == TaskInfoState.success) {
return true;
}
else if (state == TaskInfoState.error) {
String reason = info.getError().getLocalizedMessage();
error("Task '%s' failed, reason: %s", getDetail(), StringUtils.defaultIfBlank(reason, "unknown"));
}
return false;
}
public void cancelTask(Task task) throws Exception {
if (task == null || task.getTaskInfo() == null) {
warn("VMware task is null or has no task info. Unable to cancel it.");
} else {
TaskInfoState state = task.getTaskInfo().getState();
if (state == TaskInfoState.queued || state == TaskInfoState.running) {
info("Cancelling task '%s'", getDetail());
task.cancelTask();
}
}
}
public void cancelTaskNoException(Task task) {
try {
cancelTask(task);
} catch (Exception e) {
error(e, "Error when cancelling VMware task");
logError("VMwareTask.detail.cancelError");
}
}
}