diff options
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" +}] |