diff options
author | andreer <andreer@verizonmedia.com> | 2020-10-23 16:20:09 +0200 |
---|---|---|
committer | andreer <andreer@verizonmedia.com> | 2020-10-23 16:20:09 +0200 |
commit | 4fc57f5fca98a9a0f879c6afbfffd8a8c3ce8b39 (patch) | |
tree | 1619075031f5c57ee637d0b5e802ccaf2cb3aee5 | |
parent | 80391c46eeafa371d1d6f991a4f984b50add7ad3 (diff) |
extract class for deployment quota calculation
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()); + } +} |