diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2021-01-11 12:41:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-11 12:41:11 +0100 |
commit | 43d350047e8c7ba83fd3d5d671f16ca23b089fdb (patch) | |
tree | 3d99287c9fe0cabf6826da5606a0adedf3b624e6 /controller-server | |
parent | f97496e54edbfc95fb73a9be27a1e6d169197930 (diff) | |
parent | db3f6f1fae59128b2cab987e7604abeb2ee0daaa (diff) |
Merge pull request #15970 from vespa-engine/ldalves/tenant-metadata
add more fields to tenant metaData
Diffstat (limited to 'controller-server')
3 files changed, 50 insertions, 0 deletions
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 67490bf9d8c..eb6d0d16737 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 @@ -1983,6 +1983,23 @@ public class ApplicationApiHandler extends LoggingRequestHandler { default: throw new IllegalArgumentException("Unexpected tenant type '" + tenant.type() + "'."); } object.setString("url", withPath("/application/v4/tenant/" + tenant.name().value(), requestURI).toString()); + tenantMetaDataToSlime(tenant, metaData); + } + + private void tenantMetaDataToSlime(Tenant tenant, Cursor object) { + List<com.yahoo.vespa.hosted.controller.Application> applications = controller.applications().asList(tenant.name()); + Optional<Instant> lastDev = applications.stream() + .flatMap(application -> application.instances().values().stream()) + .flatMap(instance -> controller.jobController().jobs(instance.id()).stream() + .filter(jobType -> jobType.environment() == Environment.dev) + .flatMap(jobType -> controller.jobController().last(instance.id(), jobType).stream())) + .map(Run::start) + .max(Comparator.naturalOrder()); + Optional<Instant> lastSubmission = applications.stream() + .flatMap(app -> app.latestVersion().flatMap(ApplicationVersion::buildTime).stream()) + .max(Comparator.naturalOrder()); + lastDev.ifPresent(instant -> object.setLong("lastDeploymentToDevMillis", instant.toEpochMilli())); + lastSubmission.ifPresent(instant -> object.setLong("lastSubmissionToProdMillis", instant.toEpochMilli())); } /** Returns a copy of the given URI with the host and port from the given URI, the path set to the given path and the query set to given query*/ 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 d9234c9a28e..16896b1a5f5 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 @@ -92,6 +92,7 @@ import static com.yahoo.application.container.handler.Request.Method.GET; import static com.yahoo.application.container.handler.Request.Method.PATCH; import static com.yahoo.application.container.handler.Request.Method.POST; import static com.yahoo.application.container.handler.Request.Method.PUT; +import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.applicationPackage; import static java.net.URLEncoder.encode; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.stream.Collectors.joining; @@ -1531,6 +1532,19 @@ public class ApplicationApiTest extends ControllerContainerTest { new File("deployment-without-shared-endpoints.json")); } + @Test + public void testTenantMetaData() { + createAthenzDomainWithAdmin(ATHENZ_TENANT_DOMAIN, USER_ID); + deploymentTester.clock().setInstant(Instant.parse("2020-01-08T10:47:01Z")); + deploymentTester.controllerTester().createTenant("tenant1", "domain1", 1L); + deploymentTester.controllerTester().createApplication("tenant1", "application1", "instance1"); + var app = deploymentTester.newDeploymentContext(); + app.submit(applicationPackageDefault).deploy(); + deploymentTester.jobs().deploy(app.instanceId(), JobType.devUsEast1, Optional.empty(), applicationPackage()); + tester.assertResponse(request("/application/v4/tenant", GET).userIdentity(USER_ID), + new File("tenant-with-metadata.json")); + } + private MultiPartStreamer createApplicationDeployData(ApplicationPackage applicationPackage, boolean deployDirectly) { return createApplicationDeployData(Optional.of(applicationPackage), deployDirectly); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/tenant-with-metadata.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/tenant-with-metadata.json new file mode 100644 index 00000000000..a30f3ddf992 --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/tenant-with-metadata.json @@ -0,0 +1,19 @@ +[{ + "tenant": "tenant", + "metaData": { + "type": "ATHENS", + "athensDomain": "domain1000", + "property": "Property1000", + "lastDeploymentToDevMillis": 1578480421000, + "lastSubmissionToProdMillis": 1000 + }, + "url": "http://localhost:8080/application/v4/tenant/tenant" +}, { + "tenant": "tenant1", + "metaData": { + "type": "ATHENS", + "athensDomain": "domain1", + "property": "Property1" + }, + "url": "http://localhost:8080/application/v4/tenant/tenant1" +}] |