aboutsummaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHÃ¥kon Hallingstad <hakon@oath.com>2019-01-15 15:08:31 +0100
committerGitHub <noreply@github.com>2019-01-15 15:08:31 +0100
commitaa9bb080abfa4291071e671ffab84c287f9b0bcf (patch)
tree35455dd74b93ee3cce88dfb0bd501fe19daf0211 /configserver
parentbb9a8be9b26191ef6887b352ab11f64bd75cda6b (diff)
parent37685c817eae352d8245cd4e179b0bd96971c3eb (diff)
Merge pull request #8157 from vespa-engine/hakonhall/get-single-flag-definition
Get single flag definition.
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlag.java47
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/DefinedFlags.java7
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagsHandler.java13
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/flags/FlagsHandlerTest.java3
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\"]}");
}
}