summaryrefslogtreecommitdiffstats
path: root/config-model/src
diff options
context:
space:
mode:
authorØyvind Grønnesby <oyving@verizonmedia.com>2020-09-30 11:03:43 +0200
committerØyvind Grønnesby <oyving@verizonmedia.com>2020-09-30 11:03:43 +0200
commit68176288649b5ebc3bbf00ae934875c17b9a75b7 (patch)
treeb262777aba8cde3e3c05dd6a2cc3583db0778a00 /config-model/src
parent628a9a9dd57d9eadd3ad786c5cde40ccfec1ba63 (diff)
Use BigDecimal for budget inside the Quota
- To allow budgets below $1/hour we change the internal representation of budget to a decimal number. Some interfaces that assume integers are kept to keep the API stable. - Created a nicer method .unlimited() instead of .empt() to better show semantics. - Added some serialisation tests to make sure we support integers and decimals.
Diffstat (limited to 'config-model/src')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java9
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/QuotaValidatorTest.java3
3 files changed, 8 insertions, 6 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
index 31c72e1be69..1455b4d8007 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
@@ -51,7 +51,7 @@ public class TestProperties implements ModelContext.Properties {
private Optional<EndpointCertificateSecrets> endpointCertificateSecrets = Optional.empty();
private AthenzDomain athenzDomain;
private ApplicationRoles applicationRoles;
- private Quota quota = Quota.empty();
+ private Quota quota = Quota.unlimited();
@Override public boolean multitenant() { return multitenant; }
@Override public ApplicationId applicationId() { return applicationId; }
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java
index c0a2fe4fdf2..d06d616efac 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java
@@ -6,6 +6,7 @@ import com.yahoo.config.provision.Capacity;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.vespa.model.VespaModel;
+import java.math.BigDecimal;
import java.util.Locale;
import java.util.stream.Collectors;
@@ -19,17 +20,17 @@ public class QuotaValidator extends Validator {
public void validate(VespaModel model, DeployState deployState) {
var quota = deployState.getProperties().quota();
quota.maxClusterSize().ifPresent(maxClusterSize -> validateMaxClusterSize(maxClusterSize, model));
- quota.budget().ifPresent(budget -> validateBudget(budget, model));
+ quota.budgetAsDecimal().ifPresent(budget -> validateBudget(budget, model));
}
- private void validateBudget(int budget, VespaModel model) {
+ private void validateBudget(BigDecimal budget, VespaModel model) {
var spend = model.allClusters().stream()
.map(clusterId -> model.provisioned().all().get(clusterId))
.map(Capacity::maxResources)
.map(clusterCapacity -> clusterCapacity.nodeResources().cost() * clusterCapacity.nodes())
.reduce(0.0, Double::sum);
- if (spend > budget) {
+ if (budget.doubleValue() < spend) {
throwBudgetExceeded(spend, budget);
}
}
@@ -51,7 +52,7 @@ public class QuotaValidator extends Validator {
}
}
- private void throwBudgetExceeded(double spend, double budget) {
+ private void throwBudgetExceeded(double spend, BigDecimal budget) {
var message = String.format(Locale.US, "Hourly spend for maximum specified resources ($%.2f) exceeds budget from quota ($%.2f)!", spend, budget);
throw new IllegalArgumentException(message);
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/QuotaValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/QuotaValidatorTest.java
index 10199bfe6b9..70a6bbbf659 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/QuotaValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/QuotaValidatorTest.java
@@ -6,6 +6,7 @@ import com.yahoo.config.model.deploy.TestProperties;
import com.yahoo.config.provision.Environment;
import org.junit.Test;
+import java.math.BigDecimal;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
@@ -16,7 +17,7 @@ import static org.junit.Assert.fail;
*/
public class QuotaValidatorTest {
- private final Quota quota = new Quota(Optional.of(10), Optional.of(1));
+ private final Quota quota = Quota.unlimited().withClusterSize(Optional.of(10)).withBudget(Optional.of(BigDecimal.valueOf(1)));
@Test
public void test_deploy_under_quota() {