summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandreer <andreer@verizonmedia.com>2020-10-23 16:20:09 +0200
committerandreer <andreer@verizonmedia.com>2020-10-23 16:20:09 +0200
commit4fc57f5fca98a9a0f879c6afbfffd8a8c3ce8b39 (patch)
tree1619075031f5c57ee637d0b5e802ccaf2cb3aee5
parent80391c46eeafa371d1d6f991a4f984b50add7ad3 (diff)
extract class for deployment quota calculation
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java3
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java9
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java18
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java8
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentQuotaCalculator.java20
6 files changed, 40 insertions, 21 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java
index 24fb05a134a..30ebfd8e44f 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java
@@ -1,7 +1,6 @@
// 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 com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.TenantName;
import com.yahoo.vespa.hosted.controller.api.integration.user.User;
@@ -17,7 +16,7 @@ public interface BillingController {
PlanId getPlan(TenantName tenant);
- Quota getQuota(TenantName tenant, Environment environment);
+ Quota getQuota(TenantName tenant);
/**
* @return String containing error message if something went wrong. Empty otherwise
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 38bb790c814..848c630b156 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
@@ -1,7 +1,6 @@
// 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 com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.TenantName;
import com.yahoo.vespa.hosted.controller.api.integration.user.User;
@@ -32,7 +31,7 @@ public class MockBillingController implements BillingController {
}
@Override
- public Quota getQuota(TenantName tenant, Environment environment) {
+ public Quota getQuota(TenantName tenant) {
return Quota.unlimited().withMaxClusterSize(5);
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java
index 0e2ab2472ad..7700e35d0af 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java
@@ -5,7 +5,9 @@ import com.google.common.collect.ImmutableSortedMap;
import com.yahoo.component.Version;
import com.yahoo.config.application.api.DeploymentSpec;
import com.yahoo.config.application.api.ValidationOverrides;
+import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.InstanceName;
+import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion;
import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId;
import com.yahoo.vespa.hosted.controller.api.integration.organization.User;
@@ -180,11 +182,10 @@ public class Application {
.min(Comparator.naturalOrder());
}
- /** Returns the total quota usage for this application */
- public QuotaUsage quotaUsage() {
+ /** Returns the total quota usage for this application, excluding one specific deployment */
+ public QuotaUsage quotaUsageExcluding(ApplicationId application, ZoneId zone) {
return instances().values().stream()
- .flatMap(instance -> instance.deployments().values().stream())
- .map(Deployment::quota)
+ .map(instance -> instance.quotaUsageExcluding(application, zone))
.reduce(QuotaUsage::add).orElse(QuotaUsage.none);
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
index d03ed86919c..728ed47187a 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
@@ -52,6 +52,7 @@ import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackageValidator;
import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
+import com.yahoo.vespa.hosted.controller.application.DeploymentQuotaCalculator;
import com.yahoo.vespa.hosted.controller.application.QuotaUsage;
import com.yahoo.vespa.hosted.controller.application.SystemApplication;
import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId;
@@ -528,27 +529,18 @@ public class ApplicationController {
.filter(tenant-> tenant instanceof AthenzTenant)
.map(tenant -> ((AthenzTenant)tenant).domain());
- var tenantQuota = billingController.getQuota(application.tenant(), zone.environment());
-
- var tenantUsage = asList(application.tenant()).stream()
- .map(Application::quotaUsage)
- .reduce(QuotaUsage::add)
- .orElse(QuotaUsage.none);
-
- var currentDeploymentUsage = getInstance(application)
- .flatMap(i -> Optional.ofNullable(i.deployments().get(zone)).map(Deployment::quota)).orElse(QuotaUsage.none);
-
- var quotaForDeployment = tenantQuota.subtractUsage(tenantUsage.sub(currentDeploymentUsage).rate());
-
if (zone.environment().isManuallyDeployed())
controller.applications().applicationStore().putMeta(new DeploymentId(application, zone),
clock.instant(),
applicationPackage.metaDataZip());
+ Quota deploymentQuota = DeploymentQuotaCalculator.calculate(
+ billingController.getQuota(application.tenant()), asList(application.tenant()), application, zone);
+
ConfigServer.PreparedApplication preparedApplication =
configServer.deploy(new DeploymentData(application, zone, applicationPackage.zippedContent(), platform,
endpoints, endpointCertificateMetadata, dockerImageRepo, domain,
- applicationRoles, quotaForDeployment));
+ applicationRoles, deploymentQuota));
var quotaUsage = configServer.getQuotaUsage(new DeploymentId(application, zone));
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java
index e2ff017caac..cfed19bc2a8 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Instance.java
@@ -166,6 +166,14 @@ public class Instance {
return change;
}
+ /** Returns the total quota usage for this instance, excluding one zone */
+ public QuotaUsage quotaUsageExcluding(ApplicationId application, ZoneId zone) {
+ return deployments.values().stream()
+ .filter(d -> !(application.equals(id) && d.zone().equals(zone)))
+ .map(Deployment::quota)
+ .reduce(QuotaUsage::add).orElse(QuotaUsage.none);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentQuotaCalculator.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentQuotaCalculator.java
new file mode 100644
index 00000000000..039a186b9d5
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentQuotaCalculator.java
@@ -0,0 +1,20 @@
+package com.yahoo.vespa.hosted.controller.application;
+
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.zone.ZoneId;
+import com.yahoo.vespa.hosted.controller.Application;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.Quota;
+
+import java.util.List;
+
+public class DeploymentQuotaCalculator {
+
+ public static Quota calculate(Quota tenantQuota, List<Application> applications, ApplicationId application, ZoneId zone) {
+
+ var tenantUsage = applications.stream()
+ .map(a -> a.quotaUsageExcluding(application, zone))
+ .reduce(QuotaUsage::add).orElse(QuotaUsage.none);
+
+ return tenantQuota.subtractUsage(tenantUsage.rate());
+ }
+}