in cloud-vmware-server/src/main/java/jetbrains/buildServer/clouds/vmware/connector/VMWareApiConnectorImpl.java [978:1067]
private Task doShutdown(@NotNull final VmwareCloudInstance instance, @NotNull final VirtualMachine vm) throws VmwareCheckedCloudException {
try {
guestShutdown(instance, vm);
final long shutdownStartTime = System.currentTimeMillis();
return new Task(null, null){
private final long guestShutdownTimeout = getGuestShutdownTimeout();
private final long checkInstanceStatusDelay = getCheckInstanceStatusDelay();
private volatile TaskInfo myInfo = new TaskInfo();
{myInfo.setState(TaskInfoState.running);}
public String waitForTask() throws RemoteException, InterruptedException {
return waitForTaskInternal(false);
}
public String waitForTaskInternal(boolean isForce) throws RemoteException, InterruptedException {
final InstanceStatus status = waitForStatus(guestShutdownTimeout, checkInstanceStatusDelay);
if (status != InstanceStatus.STOPPED) {
if (isForce) {
myInfo.setState(TaskInfoState.error);
} else {
final Task task = forceShutdown(vm);
task.waitForTask();
myInfo = task.getTaskInfo();
//return waitForTaskInternal(true);
}
} else {
myInfo.setState(TaskInfoState.success);
}
return myInfo.getState().name();
}
@Override
public String waitForTask(final int runningDelayInMillSecond, final int queuedDelayInMillSecond) throws RemoteException, InterruptedException {
if (runningDelayInMillSecond >= (System.currentTimeMillis() - shutdownStartTime)){
return waitForTask();
} else {
final InstanceStatus instanceStatus = waitForStatus(runningDelayInMillSecond, checkInstanceStatusDelay);
if (instanceStatus == InstanceStatus.STOPPED){
myInfo.setState(TaskInfoState.success);
}
}
return myInfo.getState().name();
}
@Override
public TaskInfo getTaskInfo() throws RemoteException {
try {
final InstanceStatus instanceStatus = waitForStatus(0, checkInstanceStatusDelay);
if (instanceStatus == InstanceStatus.STOPPED){
myInfo.setState(TaskInfoState.success);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return myInfo;
}
public InstanceStatus waitForStatus(long maxWaitTime, long delay) throws RemoteException, InterruptedException {
//TODO rework
try {
VirtualMachine vmCopy = findEntityByIdNameOld(instance.getInstanceId(), VirtualMachine.class).getFirst();
final long startHere = System.currentTimeMillis();
while (getInstanceStatus(vmCopy) != InstanceStatus.STOPPED && (System.currentTimeMillis() - shutdownStartTime) < guestShutdownTimeout) {
if ((System.currentTimeMillis() - startHere) >= maxWaitTime) {
break;
}
Thread.sleep(delay);
vmCopy = findEntityByIdNameOld(instance.getInstanceId(), VirtualMachine.class).getFirst();
}
return getInstanceStatus(vmCopy);
} catch (VmwareCheckedCloudException e) {
throw new RemoteException(e.getMessage(), e);
}
}
@Override
public void cancelTask() throws RemoteException {
// do nothing;
}
};
} catch (RemoteException e) {
LOG.info("Will attempt to force shutdown due to error: " + e.toString());
try {
return forceShutdown(vm);
} catch (RemoteException e1) {
throw new VmwareCheckedCloudException(e1);
}
}
}