diff options
author | Øyvind Grønnesby <oyving@verizonmedia.com> | 2020-10-22 14:12:20 +0200 |
---|---|---|
committer | Øyvind Grønnesby <oyving@verizonmedia.com> | 2020-10-22 14:12:20 +0200 |
commit | 8fd7d2fcf7cbd7ec2a060aec120d19ab730f7294 (patch) | |
tree | 3387fcd574b3131ac09c89ab393658ba24fca302 | |
parent | 001b0d91959381cff71ac1dcf0fd2baff7d023a9 (diff) |
Get quota usage from node repository
2 files changed, 21 insertions, 14 deletions
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 5970494d471..a09dc0589ed 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 @@ -34,6 +34,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.aws.ApplicationRoles; import com.yahoo.vespa.hosted.controller.api.integration.billing.BillingController; import com.yahoo.vespa.hosted.controller.api.integration.billing.Quota; import com.yahoo.vespa.hosted.controller.api.integration.certificates.EndpointCertificateMetadata; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServer; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ContainerEndpoint; @@ -353,15 +354,27 @@ public class ApplicationController { // Carry out deployment without holding the application lock. ActivateResult result = deploy(job.application(), applicationPackage, zone, platform, endpoints, endpointCertificateMetadata, applicationRoles); + // Record the quota usage for this application + var quotaUsage = deploymentQuotaUsage(zone, job.application()); + lockApplicationOrThrow(applicationId, application -> store(application.with(job.application().instance(), instance -> instance.withNewDeployment(zone, revision, platform, clock.instant(), warningsFrom(result), - QuotaUsage.create(result.quotaUsageRate()))))); + quotaUsage)))); return result; } } + private QuotaUsage deploymentQuotaUsage(ZoneId zoneId, ApplicationId applicationId) { + var quotaUsage = configServer.nodeRepository().getApplication(zoneId, applicationId) + .clusters().values().stream() + .map(Cluster::max) + .mapToDouble(max -> max.nodes() * max.nodeResources().cost()) + .sum(); + return QuotaUsage.create(quotaUsage); + } + private ApplicationPackage getApplicationPackage(ApplicationId application, ZoneId zone, ApplicationVersion revision) { return new ApplicationPackage(revision.isUnknown() ? applicationStore.getDev(application, zone) : applicationStore.get(application.tenant(), application.application(), revision)); @@ -429,11 +442,14 @@ public class ApplicationController { ActivateResult result = deploy(instanceId, applicationPackage, zone, platformVersion, endpoints, endpointCertificateMetadata, Optional.empty()); + // Record the quota usage for this application + var quotaUsage = deploymentQuotaUsage(zone, instanceId); + lockApplicationOrThrow(applicationId, application -> store(application.with(instanceId.instance(), instance -> instance.withNewDeployment(zone, applicationVersion, platformVersion, clock.instant(), warningsFrom(result), - QuotaUsage.create(result.quotaUsageRate()))))); + quotaUsage)))); return result; } } @@ -547,10 +563,8 @@ public class ApplicationController { endpoints, endpointCertificateMetadata, dockerImageRepo, domain, applicationRoles, quota)); - var quotaUsage = configServer.getQuotaUsage(new DeploymentId(application, zone)); - return new ActivateResult(new RevisionId(applicationPackage.hash()), preparedApplication.prepareResponse(), - applicationPackage.zippedContent().length, quotaUsage.rate); + applicationPackage.zippedContent().length); } finally { // Even if prepare fails, a load balancer may have been provisioned. Always refresh routing policies so that // any DNS updates can be propagated as early as possible. @@ -567,7 +581,7 @@ public class ApplicationController { PrepareResponse prepareResponse = new PrepareResponse(); prepareResponse.log = List.of(logEntry); prepareResponse.configChangeActions = new ConfigChangeActions(List.of(), List.of()); - return new ActivateResult(new RevisionId("0"), prepareResponse, 0, 0.0); + return new ActivateResult(new RevisionId("0"), prepareResponse, 0); } private LockedApplication withoutDeletedDeployments(LockedApplication application, InstanceName instance) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/api/ActivateResult.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/api/ActivateResult.java index e6c9e52ff69..5379a08afc0 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/api/ActivateResult.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/api/ActivateResult.java @@ -13,13 +13,11 @@ public class ActivateResult { private final RevisionId revisionId; private final PrepareResponse prepareResponse; private final long applicationZipSizeBytes; - private final double quotaUsageRate; - public ActivateResult(RevisionId revisionId, PrepareResponse prepareResponse, long applicationZipSizeBytes, double quotaUsageRate) { + public ActivateResult(RevisionId revisionId, PrepareResponse prepareResponse, long applicationZipSizeBytes) { this.revisionId = revisionId; this.prepareResponse = prepareResponse; this.applicationZipSizeBytes = applicationZipSizeBytes; - this.quotaUsageRate = quotaUsageRate; } public long applicationZipSizeBytes() { @@ -33,9 +31,4 @@ public class ActivateResult { public PrepareResponse prepareResponse() { return prepareResponse; } - - public double quotaUsageRate() { - return quotaUsageRate; - } - } |