diff options
4 files changed, 54 insertions, 11 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlag.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlag.java new file mode 100644 index 00000000000..1c59113787d --- /dev/null +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlag.java @@ -0,0 +1,48 @@ +// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.config.server.http.flags; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.yahoo.container.jdisc.HttpResponse; +import com.yahoo.jdisc.Response; +import com.yahoo.vespa.config.server.http.HttpConfigResponse; +import com.yahoo.vespa.flags.FlagDefinition; +import com.yahoo.vespa.flags.json.DimensionHelper; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Optional; + +/** + * @author hakonhall + */ +public class DefinedFlag extends HttpResponse { + private static ObjectMapper mapper = new ObjectMapper(); + + private final Optional<FlagDefinition> flagDefinition; + + public DefinedFlag(Optional<FlagDefinition> flagDefinition) { + super(Response.Status.OK); + this.flagDefinition = flagDefinition; + } + + @Override + public void render(OutputStream outputStream) throws IOException { + ObjectNode rootNode = mapper.createObjectNode(); + flagDefinition.ifPresent(definition -> renderFlagDefinition(definition, rootNode)); + mapper.writeValue(outputStream, rootNode); + } + + static void renderFlagDefinition(FlagDefinition flagDefinition, ObjectNode definitionNode) { + definitionNode.put("description", flagDefinition.getDescription()); + definitionNode.put("modification-effect", flagDefinition.getModificationEffect()); + ArrayNode dimensionsNode = definitionNode.putArray("dimensions"); + flagDefinition.getDimensions().forEach(dimension -> dimensionsNode.add(DimensionHelper.toWire(dimension))); + } + + @Override + public String getContentType() { + return HttpConfigResponse.JSON_CONTENT_TYPE; + } +} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlags.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlags.java index 6d5d0df8f1a..9604c51ee4b 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlags.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlags.java @@ -2,13 +2,11 @@ package com.yahoo.vespa.config.server.http.flags; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.jdisc.Response; import com.yahoo.vespa.config.server.http.HttpConfigResponse; import com.yahoo.vespa.flags.FlagDefinition; -import com.yahoo.vespa.flags.json.DimensionHelper; import java.io.IOException; import java.io.OutputStream; @@ -35,10 +33,7 @@ public class DefinedFlags extends HttpResponse { ObjectNode rootNode = mapper.createObjectNode(); flags.stream().sorted(sortByFlagId).forEach(flagDefinition -> { ObjectNode definitionNode = rootNode.putObject(flagDefinition.getUnboundFlag().id().toString()); - definitionNode.put("description", flagDefinition.getDescription()); - definitionNode.put("modification-effect", flagDefinition.getModificationEffect()); - ArrayNode dimensionsNode = definitionNode.putArray("dimensions"); - flagDefinition.getDimensions().forEach(dimension -> dimensionsNode.add(DimensionHelper.toWire(dimension))); + DefinedFlag.renderFlagDefinition(flagDefinition, definitionNode); }); mapper.writeValue(outputStream, rootNode); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagsHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagsHandler.java index 1b1595eb897..1cf1ff3c307 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagsHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagsHandler.java @@ -40,7 +40,8 @@ public class FlagsHandler extends HttpHandler { if (path.matches("/flags/v1")) return new V1Response(flagsV1Uri(request), "data", "defined"); if (path.matches("/flags/v1/data")) return getFlagDataList(request); if (path.matches("/flags/v1/data/{flagId}")) return getFlagData(findFlagId(request, path)); - if (path.matches("/flags/v1/defined")) return getDefinedFlagList(request); + if (path.matches("/flags/v1/defined")) return new DefinedFlags(Flags.getAllFlags()); + if (path.matches("/flags/v1/defined/{flagId}")) return new DefinedFlag(Flags.getFlag(findFlagId(request, path))); throw new NotFoundException("Nothing at path '" + path + "'"); } @@ -58,10 +59,6 @@ public class FlagsHandler extends HttpHandler { throw new NotFoundException("Nothing at path '" + path + "'"); } - private HttpResponse getDefinedFlagList(HttpRequest request) { - return new DefinedFlags(Flags.getAllFlags()); - } - private String flagsV1Uri(HttpRequest request) { URI uri = request.getUri(); String port = uri.getPort() < 0 ? "" : ":" + uri.getPort(); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/flags/FlagsHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/flags/FlagsHandlerTest.java index 11958454a70..78bc664d050 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/flags/FlagsHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/flags/FlagsHandlerTest.java @@ -58,6 +58,9 @@ public class FlagsHandlerTest { Flags.defineFeatureFlag("id", false, "desc", "mod", FetchVector.Dimension.HOSTNAME); verifySuccessfulRequest(Method.GET, "/defined", "", "{\"id\":{\"description\":\"desc\",\"modification-effect\":\"mod\",\"dimensions\":[\"hostname\"]}}"); + + verifySuccessfulRequest(Method.GET, "/defined/id", "", + "{\"description\":\"desc\",\"modification-effect\":\"mod\",\"dimensions\":[\"hostname\"]}"); } } |