diff options
author | HÃ¥kon Hallingstad <hakon@oath.com> | 2019-01-15 15:08:31 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-15 15:08:31 +0100 |
commit | aa9bb080abfa4291071e671ffab84c287f9b0bcf (patch) | |
tree | 35455dd74b93ee3cce88dfb0bd501fe19daf0211 /configserver | |
parent | bb9a8be9b26191ef6887b352ab11f64bd75cda6b (diff) | |
parent | 37685c817eae352d8245cd4e179b0bd96971c3eb (diff) |
Merge pull request #8157 from vespa-engine/hakonhall/get-single-flag-definition
Get single flag definition.
Diffstat (limited to 'configserver')
4 files changed, 59 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..92397fc84a7 --- /dev/null +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlag.java @@ -0,0 +1,47 @@ +// 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; + +/** + * @author hakonhall + */ +public class DefinedFlag extends HttpResponse { + private static ObjectMapper mapper = new ObjectMapper(); + + private final FlagDefinition flagDefinition; + + public DefinedFlag(FlagDefinition flagDefinition) { + super(Response.Status.OK); + this.flagDefinition = flagDefinition; + } + + @Override + public void render(OutputStream outputStream) throws IOException { + ObjectNode rootNode = mapper.createObjectNode(); + renderFlagDefinition(flagDefinition, 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..6b07448ee04 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 getDefinedFlag(findFlagId(request, path)); throw new NotFoundException("Nothing at path '" + path + "'"); } @@ -58,16 +59,18 @@ 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(); return uri.getScheme() + "://" + uri.getHost() + port + "/flags/v1"; } + private HttpResponse getDefinedFlag(FlagId flagId) { + FlagDefinition definition = Flags.getFlag(flagId) + .orElseThrow(() -> new NotFoundException("Flag " + flagId + " not defined")); + return new DefinedFlag(definition); + } + private HttpResponse getFlagDataList(HttpRequest request) { return new FlagDataListResponse(flagsV1Uri(request), flagsDb.getAllFlags(), Objects.equals(request.getProperty("recursive"), "true")); 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\"]}"); } } |