diff options
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 |
commit | 68176288649b5ebc3bbf00ae934875c17b9a75b7 (patch) | |
tree | b262777aba8cde3e3c05dd6a2cc3583db0778a00 /config-model/src | |
parent | 628a9a9dd57d9eadd3ad786c5cde40ccfec1ba63 (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')
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() { |