summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTorbjørn Smørgrav <smorgrav@users.noreply.github.com>2019-07-09 15:04:19 +0200
committerGitHub <noreply@github.com>2019-07-09 15:04:19 +0200
commitf1a9976c46aa77325dda5053f8d12fba3462c98e (patch)
treef91b23322f9c8c465863d70dd90e45d3871b6d4f
parent9d31550a54a394026791b3f69664c1faac139ad9 (diff)
parent1c2d659bee05d86f2ffd2a90e4748d16f8fa71fb (diff)
Merge pull request #9999 from vespa-engine/smorgrav/metering_rest_api_skeleton
Add rest endpoint for metering data
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java40
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java10
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-metering.json34
4 files changed, 85 insertions, 2 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
index 1ec75e0c998..08702027264 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/role/PathGroup.java
@@ -76,7 +76,8 @@ enum PathGroup {
"/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/logs",
"/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/suspended",
"/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/service/{*}",
- "/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/global-rotation/{*}"),
+ "/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/global-rotation/{*}",
+ "/application/v4/tenant/{tenant}/application/{application}/metering"),
/** Path used to restart development nodes. */
developmentRestart(Matcher.tenant,
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
index 9c320df2f6c..868272e5051 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java
@@ -176,6 +176,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return application(path.get("tenant"), path.get("application"), "default", request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying")) return deploying(path.get("tenant"), path.get("application"), "default", request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying/pin")) return deploying(path.get("tenant"), path.get("application"), "default", request);
+ if (path.matches("/application/v4/tenant/{tenant}/application/{application}/metering")) return metering(path.get("tenant"), path.get("application"), request);
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/nodes")) return nodes(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"));
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/logs")) return logs(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request.propertyMap());
if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance")) return applications(path.get("tenant"), Optional.of(path.get("application")), request);
@@ -772,6 +773,45 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
return new SlimeJsonResponse(slime);
}
+ private HttpResponse metering(String tenant, String application, HttpRequest request) {
+ Slime slime = new Slime();
+ Cursor root = slime.setObject();
+
+ Cursor currentRate = root.setObject("currentrate");
+ currentRate.setDouble("cpu", 0);
+ currentRate.setDouble("mem", 0);
+ currentRate.setDouble("disk", 0);
+
+ Cursor thismonth = root.setObject("thismonth");
+ thismonth.setDouble("cpu", 0);
+ thismonth.setDouble("mem", 0);
+ thismonth.setDouble("disk", 0);
+
+ Cursor lastmonth = root.setObject("lastmonth");
+ lastmonth.setDouble("cpu", 0);
+ lastmonth.setDouble("mem", 0);
+ lastmonth.setDouble("disk", 0);
+
+ Cursor details = root.setObject("details");
+
+ Cursor detailsCpu = details.setObject("cpu");
+ Cursor detailsCpuDummyApp = detailsCpu.setObject("dummy");
+ Cursor detailsCpuDummyData = detailsCpuDummyApp.setArray("data");
+
+ // The data array should be filled with objects like: { unixms: <number>, valur: <number }
+
+ Cursor detailsMem = details.setObject("mem");
+ Cursor detailsMemDummyApp = detailsMem.setObject("dummy");
+ Cursor detailsMemDummyData = detailsMemDummyApp.setArray("data");
+
+ Cursor detailsDisk = details.setObject("disk");
+ Cursor detailsDiskDummyApp = detailsDisk.setObject("dummy");
+ Cursor detailsDiskDummyData = detailsDiskDummyApp.setArray("data");
+
+
+ return new SlimeJsonResponse(slime);
+ }
+
private HttpResponse deploying(String tenant, String application, String instance, HttpRequest request) {
Application app = controller.applications().require(ApplicationId.from(tenant, application, instance));
Slime slime = new Slime();
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
index 29931a1f626..577b8491bd2 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java
@@ -856,7 +856,15 @@ public class ApplicationApiTest extends ControllerContainerTest {
.userIdentity(USER_ID),
new File("application-without-change-multiple-deployments.json"));
}
-
+
+ @Test
+ public void testMeteringResponses() {
+ tester.assertResponse(request("/application/v4/tenant/doesnotexist/application/doesnotexist/metering", GET)
+ .userIdentity(USER_ID)
+ .oktaAccessToken(OKTA_AT),
+ new File("application1-metering.json"));
+ }
+
@Test
public void testErrorResponses() throws Exception {
tester.computeVersionStatus();
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-metering.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-metering.json
new file mode 100644
index 00000000000..63e1c1ebbd1
--- /dev/null
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/application1-metering.json
@@ -0,0 +1,34 @@
+{
+ "currentrate": {
+ "cpu": 0.0,
+ "mem": 0.0,
+ "disk": 0.0
+ },
+ "thismonth": {
+ "cpu": 0.0,
+ "mem": 0.0,
+ "disk": 0.0
+ },
+ "lastmonth": {
+ "cpu": 0.0,
+ "mem": 0.0,
+ "disk": 0.0
+ },
+ "details": {
+ "cpu": {
+ "dummy": {
+ "data": []
+ }
+ },
+ "mem": {
+ "dummy": {
+ "data": []
+ }
+ },
+ "disk": {
+ "dummy": {
+ "data": []
+ }
+ }
+ }
+} \ No newline at end of file