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