diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDao.java b/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDao.java index 4b25c63403e2..409042e7e33c 100644 --- a/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDao.java +++ b/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDao.java @@ -35,4 +35,6 @@ public interface AutoScaleVmGroupVmMapDao extends GenericDao= 0; } + + @Override + public int getErroredInstanceCount(long vmGroupId) { + SearchCriteria sc = CountBy.create(); + sc.setParameters("vmGroupId", vmGroupId); + sc.setJoinParameters("vmSearch", "states", State.Error); + final List results = customSearch(sc, null); + return results.get(0); + } } diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index 4c03122e4637..b10b69503405 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -47,6 +47,7 @@ import com.cloud.hypervisor.HypervisorGuru; +import com.cloud.network.as.AutoScaleManager; import com.cloud.user.AccountManagerImpl; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.host.HostTagVO; @@ -570,6 +571,7 @@ protected void populateConfigValuesForValidationSet() { configValuesForValidation.add(UserDataManager.VM_USERDATA_MAX_LENGTH_STRING); configValuesForValidation.add(UnmanagedVMsManager.RemoteKvmInstanceDisksCopyTimeout.key()); configValuesForValidation.add(UnmanagedVMsManager.ConvertVmwareInstanceToKvmTimeout.key()); + configValuesForValidation.add(AutoScaleManager.AutoScaleErroredInstanceThreshold.key()); } private void weightBasedParametersForValidation() { diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManager.java b/server/src/main/java/com/cloud/network/as/AutoScaleManager.java index cf6aab6a7bb5..26598879a51a 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManager.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManager.java @@ -38,6 +38,12 @@ public interface AutoScaleManager extends AutoScaleService { "The Number of worker threads to scan the autoscale vm groups.", false); + ConfigKey AutoScaleErroredInstanceThreshold = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, Integer.class, + "autoscale.errored.instance.threshold", + "10", + "The number of Error Instances allowed in autoscale vm groups for scale up.", + true); + void checkAutoScaleUser(Long autoscaleUserId, long accountId); boolean deleteAutoScaleVmGroupsByAccount(Long accountId); diff --git a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java index 5bbd85c2415d..8e6b7222da27 100644 --- a/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/main/java/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1716,6 +1716,11 @@ private boolean checkConditionUp(AutoScaleVmGroupVO asGroup, Integer numVm) { s_logger.warn("number of VM will greater than the maximum in this group if scaling up, so do nothing more"); return false; } + int erroredInstanceCount = autoScaleVmGroupVmMapDao.getErroredInstanceCount(asGroup.getId()); + if (erroredInstanceCount > AutoScaleManager.AutoScaleErroredInstanceThreshold.value()) { + s_logger.warn("Number of Errored Instances are greater than the threshold in this group for scaling up, so do nothing more"); + return false; + } return true; } @@ -2202,7 +2207,8 @@ public ConfigKey[] getConfigKeys() { return new ConfigKey[] { AutoScaleStatsInterval, AutoScaleStatsCleanupDelay, - AutoScaleStatsWorker + AutoScaleStatsWorker, + AutoScaleErroredInstanceThreshold }; }