summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorØyvind Grønnesby <oyving@verizonmedia.com>2020-10-08 14:32:46 +0200
committerØyvind Grønnesby <oyving@verizonmedia.com>2020-10-08 14:32:46 +0200
commitb0ab9ed9ebc8908b9fec91d26119d4bc270a07c0 (patch)
treeef62ea7a7bf003103fd2117688c55f444f8f328b /configserver
parentf7060198a5ddb5e11de592b2b93a39c016e47f23 (diff)
Serve quota usage rate from configuration server
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java9
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java17
2 files changed, 26 insertions, 0 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index 083112d8456..cfccd0f7e16 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -11,6 +11,7 @@ import com.yahoo.config.application.api.DeployLogger;
import com.yahoo.config.model.api.HostInfo;
import com.yahoo.config.model.api.ServiceInfo;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.Capacity;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.HostFilter;
import com.yahoo.config.provision.InfraDeployer;
@@ -981,6 +982,14 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
return null;
}
+ public double getQuotaUsageRate(ApplicationId applicationId) {
+ var application = getApplication(applicationId);
+ return application.getModel().provisioned().all().values().stream()
+ .map(Capacity::maxResources)
+ .mapToDouble(resources -> resources.nodes() * resources.nodeResources().cost())
+ .sum();
+ }
+
private static void logConfigChangeActions(ConfigChangeActions actions, DeployLogger logger) {
RestartActions restartActions = actions.getRestartActions();
if ( ! restartActions.isEmpty()) {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
index 17b132a3df8..59523a28b33 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java
@@ -52,6 +52,7 @@ public class ApplicationHandler extends HttpHandler {
"http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*/logs",
"http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*/tester/*/*",
"http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*/tester/*",
+ "http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*/quota",
"http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*",
"http://*/application/v2/tenant/*/application/*")
.map(UriPattern::new)
@@ -157,6 +158,11 @@ public class ApplicationHandler extends HttpHandler {
}
}
+ if (isQuotaUsageRequest(request)) {
+ var quotaUsageRate = applicationRepository.getQuotaUsageRate(applicationId);
+ return new QuotaUsageResponse(quotaUsageRate);
+ }
+
return getApplicationResponse(applicationId);
}
@@ -267,6 +273,11 @@ public class ApplicationHandler extends HttpHandler {
request.getUri().getPath().contains("/tester/run/");
}
+ private static boolean isQuotaUsageRequest(HttpRequest request) {
+ return getBindingMatch(request).groupCount() > 7 &&
+ request.getUri().getPath().contains("/quota");
+ }
+
private static String getHostNameFromRequest(HttpRequest req) {
BindingMatch<?> bm = getBindingMatch(req);
return bm.group(7);
@@ -343,4 +354,10 @@ public class ApplicationHandler extends HttpHandler {
}
}
+ private static class QuotaUsageResponse extends JSONResponse {
+ QuotaUsageResponse(double usageRate) {
+ super(Response.Status.OK);
+ object.setDouble("rate", usageRate);
+ }
+ }
}