summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/AthenzProxyHandler.java87
-rw-r--r--tenant-cd/pom.xml2
3 files changed, 90 insertions, 2 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 123d1a2e6b1..503e9e13aec 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
@@ -78,6 +78,7 @@ import com.yahoo.vespa.hosted.controller.restapi.SlimeJsonResponse;
import com.yahoo.vespa.hosted.controller.restapi.StringResponse;
import com.yahoo.vespa.hosted.controller.tenant.AthenzTenant;
import com.yahoo.vespa.hosted.controller.tenant.Tenant;
+import com.yahoo.vespa.hosted.controller.tenant.Tenant.Type;
import com.yahoo.vespa.hosted.controller.tenant.UserTenant;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
import com.yahoo.vespa.serviceview.bindings.ApplicationView;
@@ -275,7 +276,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler {
Cursor tenantsArray = response.setArray("tenants");
for (Tenant tenant : tenants)
tenantInTenantsListToSlime(tenant, request.getUri(), tenantsArray.addObject());
- response.setBool("tenantExists", tenants.stream().anyMatch(tenant -> tenant instanceof UserTenant && // TODO jvenstad: No.
+ response.setBool("tenantExists", tenants.stream().anyMatch(tenant -> tenant.type() == Type.user &&
((UserTenant) tenant).is(user.getIdentity().getName())));
return new SlimeJsonResponse(slime);
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/AthenzProxyHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/AthenzProxyHandler.java
new file mode 100644
index 00000000000..ad9b1573538
--- /dev/null
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/AthenzProxyHandler.java
@@ -0,0 +1,87 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.restapi.application;
+
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.container.jdisc.HttpRequest;
+import com.yahoo.container.jdisc.HttpResponse;
+import com.yahoo.container.jdisc.LoggingRequestHandler;
+import com.yahoo.jdisc.Response;
+import com.yahoo.jdisc.http.HttpRequest.Method;
+import com.yahoo.restapi.Path;
+import com.yahoo.vespa.hosted.controller.Controller;
+import com.yahoo.vespa.hosted.controller.api.integration.athenz.AthenzClientFactory;
+import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType;
+import com.yahoo.vespa.hosted.controller.athenz.impl.AthenzFacade;
+import com.yahoo.vespa.hosted.controller.restapi.ErrorResponse;
+import com.yahoo.yolean.Exceptions;
+
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * This API proxies requests to an Athenz server.
+ *
+ * @author jonmv
+ */
+@SuppressWarnings("unused") // Handler
+public class AthenzProxyHandler extends LoggingRequestHandler {
+
+ private final static Logger log = Logger.getLogger(AthenzProxyHandler.class.getName());
+
+ private final AthenzFacade athenz;
+
+ public AthenzProxyHandler(Context parentCtx, AthenzFacade athenz) {
+ super(parentCtx);
+ this.athenz = athenz;
+ }
+
+ @Override
+ public HttpResponse handle(HttpRequest request) {
+ Method method = request.getMethod();
+ try {
+ switch (method) {
+ case GET: return get(request);
+ default: return ErrorResponse.methodNotAllowed("Method '" + method + "' is unsupported");
+ }
+ } catch (IllegalArgumentException|IllegalStateException e) {
+ return ErrorResponse.badRequest(Exceptions.toMessageString(e));
+ } catch (RuntimeException e) {
+ log.log(Level.WARNING, "Unexpected error handling '" + request.getUri() + "'", e);
+ return ErrorResponse.internalServerError(Exceptions.toMessageString(e));
+ }
+ }
+
+ private HttpResponse get(HttpRequest request) {
+ Path path = new Path(request.getUri().getPath());
+ if (path.matches("/badge/v1/{tenant}/{application}/{instance}")) return badge(path.get("tenant"), path.get("application"), path.get("instance"));
+ if (path.matches("/badge/v1/{tenant}/{application}/{instance}/{jobName}")) return badge(path.get("tenant"), path.get("application"), path.get("instance"), path.get("jobName"), request.getProperty("historyLength"));
+
+ return ErrorResponse.notFoundError(String.format("No '%s' handler at '%s'", request.getMethod(),
+ request.getUri().getPath()));
+ }
+
+ /** Returns a URI which points to an overview badge for the given application. */
+ private HttpResponse badge(String tenant, String application, String instance) {
+ URI location = controller.jobController().overviewBadge(ApplicationId.from(tenant, application, instance));
+ return redirect(location);
+ }
+
+ /** Returns a URI which points to a history badge for the given application and job type. */
+ private HttpResponse badge(String tenant, String application, String instance, String jobName, String historyLength) {
+ URI location = controller.jobController().historicBadge(ApplicationId.from(tenant, application, instance),
+ JobType.fromJobName(jobName),
+ historyLength == null ? 5 : Math.min(32, Math.max(0, Integer.parseInt(historyLength))));
+ return redirect(location);
+ }
+
+ private static HttpResponse redirect(URI location) {
+ HttpResponse httpResponse = new HttpResponse(Response.Status.FOUND) {
+ @Override public void render(OutputStream outputStream) { }
+ };
+ httpResponse.headers().add("Location", location.toString());
+ return httpResponse;
+ }
+
+}
diff --git a/tenant-cd/pom.xml b/tenant-cd/pom.xml
index e9853dfa368..8907e56762c 100644
--- a/tenant-cd/pom.xml
+++ b/tenant-cd/pom.xml
@@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>tenant-cd</artifactId>
- <name>Hosted Vespa tenant CD.</name>
+ <name>Hosted Vespa tenant CD</name>
<description>Test library for hosted Vespa applications.</description>
<url>https://github.com/vespa-engine</url>
<packaging>jar</packaging>