diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-07-15 17:00:52 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-07-15 17:01:21 +0200 |
commit | f449a4f2d1e477afcc30050f6f72f2cb996f26ae (patch) | |
tree | a58d43de3f4345e83e2d4a043c4928a1a10153ad | |
parent | 1063287741c52f132a43d6993c7caea98a3caf2c (diff) |
Use RestApi in AthenzApiHandler
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/athenz/AthenzApiHandler.java | 92 |
1 files changed, 32 insertions, 60 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/athenz/AthenzApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/athenz/AthenzApiHandler.java index 9ac94d0208c..621ce9189e9 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/athenz/AthenzApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/athenz/AthenzApiHandler.java @@ -1,19 +1,14 @@ // Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.restapi.athenz; +import com.google.inject.Inject; import com.yahoo.config.provision.SystemName; -import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; -import com.yahoo.container.jdisc.LoggingRequestHandler; -import com.yahoo.jdisc.http.HttpRequest.Method; -import com.yahoo.restapi.ErrorResponse; -import com.yahoo.restapi.MessageResponse; -import com.yahoo.restapi.Path; import com.yahoo.restapi.ResourceResponse; -import com.yahoo.restapi.SlimeJsonResponse; +import com.yahoo.restapi.RestApi; +import com.yahoo.restapi.RestApiRequestHandler; import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; -import com.yahoo.text.Text; import com.yahoo.vespa.athenz.api.AthenzDomain; import com.yahoo.vespa.athenz.api.AthenzPrincipal; import com.yahoo.vespa.athenz.api.AthenzUser; @@ -22,20 +17,19 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.Property; import com.yahoo.vespa.hosted.controller.api.identifiers.PropertyId; import com.yahoo.vespa.hosted.controller.api.integration.entity.EntityService; import com.yahoo.vespa.hosted.controller.athenz.impl.AthenzFacade; -import com.yahoo.yolean.Exceptions; import java.util.Map; -import java.util.Optional; -import java.util.logging.Level; import java.util.logging.Logger; +import static com.yahoo.restapi.RestApi.route; + /** * This API proxies requests to an Athenz server. * * @author jonmv */ @SuppressWarnings("unused") // Handler -public class AthenzApiHandler extends LoggingRequestHandler { +public class AthenzApiHandler extends RestApiRequestHandler<AthenzApiHandler> { private final static Logger log = Logger.getLogger(AthenzApiHandler.class.getName()); @@ -43,55 +37,32 @@ public class AthenzApiHandler extends LoggingRequestHandler { private final AthenzDomain sandboxDomain; private final EntityService properties; + @Inject public AthenzApiHandler(Context parentCtx, AthenzFacade athenz, Controller controller) { - super(parentCtx); + super(parentCtx, AthenzApiHandler::createRestApi); this.athenz = athenz; this.sandboxDomain = new AthenzDomain(sandboxDomainIn(controller.system())); this.properties = controller.serviceRegistry().entityService(); } - @Override - public HttpResponse handle(HttpRequest request) { - Method method = request.getMethod(); - try { - switch (method) { - case GET: return get(request); - case POST: return post(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()); - if (path.matches("/athenz/v1")) return root(request); - if (path.matches("/athenz/v1/domains")) return domainList(request); - if (path.matches("/athenz/v1/properties")) return properties(); - - return ErrorResponse.notFoundError(Text.format("No '%s' handler at '%s'", request.getMethod(), - request.getUri().getPath())); + private static RestApi createRestApi(AthenzApiHandler self) { + return RestApi.builder() + .addRoute(route("/athenz/v1") + .get(self::root)) + .addRoute(route("/athenz/v1/domains") + .get(self::domainList)) + .addRoute(route("/athenz/v1/properties") + .get(self::properties)) + .addRoute(route("/athenz/v1/user") + .post(self::signup)) + .build(); } - private HttpResponse post(HttpRequest request) { - Path path = new Path(request.getUri()); - if (path.matches("/athenz/v1/user")) return signup(request); - return ErrorResponse.notFoundError(Text.format("No '%s' handler at '%s'", request.getMethod(), - request.getUri().getPath())); + private HttpResponse root(RestApi.RequestContext ctx) { + return new ResourceResponse(ctx.request(), "domains", "properties"); } - private HttpResponse root(HttpRequest request) { - return new ResourceResponse(request, "domains", "properties"); - } - - - private HttpResponse properties() { + private Slime properties(RestApi.RequestContext ctx) { Slime slime = new Slime(); Cursor response = slime.setObject(); Cursor array = response.setArray("properties"); @@ -100,26 +71,27 @@ public class AthenzApiHandler extends LoggingRequestHandler { propertyObject.setString("propertyid", entry.getKey().id()); propertyObject.setString("property", entry.getValue().id()); } - return new SlimeJsonResponse(slime); + return slime; } - private HttpResponse domainList(HttpRequest request) { + private Slime domainList(RestApi.RequestContext ctx) { Slime slime = new Slime(); Cursor array = slime.setObject().setArray("data"); - for (AthenzDomain athenzDomain : athenz.getDomainList(request.getProperty("prefix"))) + for (AthenzDomain athenzDomain : athenz.getDomainList(ctx.queryParameters().getString("prefix").orElse(null))) array.addString(athenzDomain.getName()); - return new SlimeJsonResponse(slime); + return slime; } - private HttpResponse signup(HttpRequest request) { - AthenzUser user = athenzUser(request); + private String signup(RestApi.RequestContext ctx) { + AthenzUser user = athenzUser(ctx); athenz.addTenantAdmin(sandboxDomain, user); - return new MessageResponse("User '" + user.getName() + "' added to admin role of '" + sandboxDomain.getName() + "'"); + return "User '" + user.getName() + "' added to admin role of '" + sandboxDomain.getName() + "'"; } - private static AthenzUser athenzUser(HttpRequest request) { - return Optional.ofNullable(request.getJDiscRequest().getUserPrincipal()).filter(AthenzPrincipal.class::isInstance) + private static AthenzUser athenzUser(RestApi.RequestContext ctx) { + return ctx.userPrincipal() + .filter(AthenzPrincipal.class::isInstance) .map(AthenzPrincipal.class::cast) .map(AthenzPrincipal::getIdentity) .filter(AthenzUser.class::isInstance) |