private Task doShutdown()

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);
      }
    }
  }