From e8f8420eab675350e61260578bd10228645c51f1 Mon Sep 17 00:00:00 2001 From: Øyvind Grønnesby Date: Thu, 1 Oct 2020 12:23:53 +0200 Subject: Quota as BigDecimals in the controller - Added support for BigDecimal flags - Changed internal representation of quota budget to BigDecimal - Changed flag type for TENANT_BUDGET_QUOTA to BigDecimal. Since flag is not in use this should not cause any issues. --- .../integration/billing/MockBillingController.java | 2 +- .../controller/api/integration/billing/Quota.java | 53 ++++++++++++---------- 2 files changed, 29 insertions(+), 26 deletions(-) (limited to 'controller-api') diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java index 5db89ccc656..19dfe0d9dcc 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java @@ -33,7 +33,7 @@ public class MockBillingController implements BillingController { @Override public Optional getQuota(TenantName tenant, Environment environment) { - return Optional.of(new Quota(5)); + return Optional.of(Quota.unlimited().withMaxClusterSize(5)); } @Override diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Quota.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Quota.java index 4e1efc1b6d9..511d7bf1d09 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Quota.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Quota.java @@ -1,57 +1,60 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.api.integration.billing; +import java.math.BigDecimal; import java.util.Objects; import java.util.Optional; +import java.util.OptionalInt; /** - * Quota information transmitted to the configserver on deploy. + * Quota information transmitted to the configserver on deploy. All limits are represented + * with an Optional type where the empty optional means unlimited resource use. * * @author andreer * @author ogronnesby */ public class Quota { - private static final Quota UNLIMITED = new Quota(Optional.empty(), Optional.empty()); - private static final Quota ZERO = new Quota(0, 0); + private static final Quota UNLIMITED = new Quota(OptionalInt.empty(), Optional.empty()); + private static final Quota ZERO = new Quota(OptionalInt.of(0), Optional.of(BigDecimal.ZERO)); - private final Optional maxClusterSize; - private final Optional budget; // in USD/hr, as calculated by NodeResources + private final OptionalInt maxClusterSize; + private final Optional budget; // in USD/hr, as calculated by NodeResources - public Quota(int maxClusterSize) { - this(Optional.of(maxClusterSize), Optional.empty()); - } - - public Quota(int maxClusterSize, int dollarsPerHour) { - this(Optional.of(maxClusterSize), Optional.of(dollarsPerHour)); - } - - public Quota(Optional maxClusterSize, Optional budget) { + private Quota(OptionalInt maxClusterSize, Optional budget) { this.maxClusterSize = Objects.requireNonNull(maxClusterSize); this.budget = Objects.requireNonNull(budget); } - public Optional maxClusterSize() { - return maxClusterSize; + public Quota withMaxClusterSize(int clusterSize) { + return new Quota(OptionalInt.of(clusterSize), budget); } - public Optional budget() { - return budget; + /** Construct a Quota that allows zero resource usage */ + public static Quota zero() { + return ZERO; } - public Quota withMaxClusterSize(int clusterSize) { - return new Quota(Optional.of(clusterSize), budget); + /** Construct a Quota that allows unlimited resource usage */ + public static Quota unlimited() { + return UNLIMITED; + } + + public Quota withBudget(BigDecimal budget) { + return new Quota(maxClusterSize, Optional.ofNullable(budget)); } public Quota withBudget(int budget) { - return new Quota(maxClusterSize, Optional.of(budget)); + return withBudget(BigDecimal.valueOf(budget)); } - public static Quota zero() { - return ZERO; + /** Maximum number of nodes in a cluster in a Vespa deployment */ + public OptionalInt maxClusterSize() { + return maxClusterSize; } - public static Quota unlimited() { - return UNLIMITED; + /** Maximum $/hour run-rate for the Vespa deployment */ + public Optional budget() { + return budget; } @Override -- cgit v1.2.3