diff options
author | Torbjørn Smørgrav <smorgrav@users.noreply.github.com> | 2019-07-09 15:04:19 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-09 15:04:19 +0200 |
commit | f1a9976c46aa77325dda5053f8d12fba3462c98e (patch) | |
tree | f91b23322f9c8c465863d70dd90e45d3871b6d4f | |
parent | 9d31550a54a394026791b3f69664c1faac139ad9 (diff) | |
parent | 1c2d659bee05d86f2ffd2a90e4748d16f8fa71fb (diff) |
Merge pull request #9999 from vespa-engine/smorgrav/metering_rest_api_skeleton
Add rest endpoint for metering data
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 |