public synchronized CanStartNewInstanceResult canStartNewInstanceWithDetails()

in cloud-vmware-server/src/main/java/jetbrains/buildServer/clouds/vmware/VmwareCloudImage.java [340:371]


  public synchronized CanStartNewInstanceResult canStartNewInstanceWithDetails() {
    if (getErrorInfo() != null){
      return CanStartNewInstanceResult.no("Image is erroneous.");
    }

    final String sourceId = myImageDetails.getSourceId();
    if (myImageDetails.getBehaviour().isUseOriginal()) {
      final VmwareCloudInstance myInstance = findInstanceById(sourceId);
      if (myInstance == null) {
        return CanStartNewInstanceResult.no("Can't find original instance by id " + sourceId);
      }
      if (myInstance.getStatus() == InstanceStatus.STOPPED) {
        return CanStartNewInstanceResult.yes();
      }
      return CanStartNewInstanceResult.no("Original instance with id " + sourceId + " is not being stopped");
    }

    final boolean countStoppedVmsInLimit = TeamCityProperties.getBoolean(VmwareConstants.CONSIDER_STOPPED_VMS_LIMIT)
                                           && myImageDetails.getBehaviour().isDeleteAfterStop();

    final List<String> consideredInstances = new ArrayList<String>();
    for (VmwareCloudInstance instance : getInstances()) {
      if (instance.getStatus() != InstanceStatus.STOPPED || countStoppedVmsInLimit)
        consideredInstances.add(instance.getInstanceId());
    }
    final boolean canStartMore =  consideredInstances.size() < myImageDetails.getMaxInstances();
    if (LOG.isDebugEnabled()) {
      LOG.debug(String.format("[%s] Instances count: %d %s, can start more: %s", sourceId,
                              consideredInstances.size(), Arrays.toString(consideredInstances.toArray()), String.valueOf(canStartMore)));
    }
    return canStartMore ? CanStartNewInstanceResult.yes() : CanStartNewInstanceResult.no("Image instance limit exceeded");
  }