summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2020-10-23 14:11:35 +0200
committerGitHub <noreply@github.com>2020-10-23 14:11:35 +0200
commitabcbe2b9255aff9d67997866f5b76975a1a2b8f0 (patch)
tree751eb3563aa06e5be6845fa161e9653c7ef6fbf2
parent2d01323ce5ab1aef39f1790e50c3cae1ef218dca (diff)
parent2698aa3a5be6351f429ff2a73cf70bb790df6526 (diff)
Merge pull request #15008 from vespa-engine/ogronnesby/use-node-repo-for-quota-usage
Get quota usage from node repository
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java26
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/api/ActivateResult.java9
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/QuotaUsageTest.java21
3 files changed, 42 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;
- }
-
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/QuotaUsageTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/QuotaUsageTest.java
new file mode 100644
index 00000000000..d2901aeac97
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/QuotaUsageTest.java
@@ -0,0 +1,21 @@
+// 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.deployment;
+
+import com.yahoo.config.provision.zone.ZoneId;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author ogronnesby
+ */
+public class QuotaUsageTest {
+
+ @Test
+ public void testQuotaUsageIsPersisted() {
+ var tester = new DeploymentTester();
+ var context = tester.newDeploymentContext().submit().deploy();
+ assertEquals(1.062, context.deployment(ZoneId.from("prod.us-west-1")).quota().rate(), 0.01);
+ }
+
+}