summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@oath.com>2019-01-09 12:08:53 +0100
committerHåkon Hallingstad <hakon@oath.com>2019-01-09 12:08:53 +0100
commit68cbb82330cb610ff3e3462a7ec704f78e49a31c (patch)
tree6c3a996789700f24037a2c6a4d4d37f7f643ea60 /configserver
parent8bec9bc0719af7ee27cda0f0d6d6b3627d155180 (diff)
Flag repository cfg client and flag directory
- Makes new FlagRepository config server client to retrieve all flag data. - Makes WireFlagDataList to be used for creating the HTTP response in the config server, and parse the HTTP response in host admin. - Fixes problem with URL generation for controller: when port is not present in the request, remove ":-1" port specification in the url. - Makes a new FlagDirectory class, responsible for reading flags from /opt/vespa/var/vespa/flags (in FlagData JSON format), and reversely, sync that directory to exactly match a set of FlagData. - No longer have 'State state()' as a default method in interface.
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagDataListResponse.java26
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagsHandler.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/flags/FlagsHandlerTest.java10
3 files changed, 25 insertions, 14 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagDataListResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagDataListResponse.java
index ae72660ce9f..b33fc7c2b04 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagDataListResponse.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/flags/FlagDataListResponse.java
@@ -9,6 +9,7 @@ import com.yahoo.jdisc.Response;
import com.yahoo.vespa.config.server.http.HttpConfigResponse;
import com.yahoo.vespa.flags.FlagId;
import com.yahoo.vespa.flags.json.FlagData;
+import com.yahoo.vespa.flags.json.wire.WireFlagDataList;
import java.io.OutputStream;
import java.util.Map;
@@ -23,31 +24,32 @@ public class FlagDataListResponse extends HttpResponse {
private static ObjectMapper mapper = new ObjectMapper();
private final String flagsV1Uri;
- private final Map<FlagId, FlagData> flags;
+ private final TreeMap<FlagId, FlagData> flags;
private final boolean recursive;
public FlagDataListResponse(String flagsV1Uri, Map<FlagId, FlagData> flags, boolean recursive) {
super(Response.Status.OK);
this.flagsV1Uri = flagsV1Uri;
- this.flags = flags;
+ this.flags = new TreeMap<>(flags);
this.recursive = recursive;
}
@Override
public void render(OutputStream outputStream) {
- ObjectNode rootNode = mapper.createObjectNode();
- ArrayNode flagsArray = rootNode.putArray("flags");
- // Order flags by ID
- new TreeMap<>(this.flags).forEach((flagId, flagData) -> {
- if (recursive) {
- flagsArray.add(flagData.toJsonNode());
- } else {
+ if (recursive) {
+ WireFlagDataList list = new WireFlagDataList();
+ flags.values().forEach(flagData -> list.flags.add(flagData.toWire()));
+ list.serializeToOutputStream(outputStream);
+ } else {
+ ObjectNode rootNode = mapper.createObjectNode();
+ ArrayNode flagsArray = rootNode.putArray("flags");
+ flags.forEach((flagId, flagData) -> {
ObjectNode object = flagsArray.addObject();
object.put("id", flagId.toString());
object.put("url", flagsV1Uri + "/data/" + flagId.toString());
- }
- });
- uncheck(() -> mapper.writeValue(outputStream, rootNode));
+ });
+ uncheck(() -> mapper.writeValue(outputStream, rootNode));
+ }
}
@Override
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 e5efc74fb75..1b1595eb897 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
@@ -64,7 +64,8 @@ public class FlagsHandler extends HttpHandler {
private String flagsV1Uri(HttpRequest request) {
URI uri = request.getUri();
- return uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort() + "/flags/v1";
+ String port = uri.getPort() < 0 ? "" : ":" + uri.getPort();
+ return uri.getScheme() + "://" + uri.getHost() + port + "/flags/v1";
}
private HttpResponse getFlagDataList(HttpRequest request) {
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 71caed77dbe..11958454a70 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
@@ -89,6 +89,10 @@ public class FlagsHandlerTest {
verifySuccessfulRequest(Method.GET, "/data/",
"", "{\"flags\":[{\"id\":\"id1\",\"url\":\"https://foo.com:4443/flags/v1/data/id1\"}]}");
+ // Verify absent port => absent in response
+ assertThat(handleWithPort(Method.GET, -1, "/data", "", 200),
+ is("{\"flags\":[{\"id\":\"id1\",\"url\":\"https://foo.com/flags/v1/data/id1\"}]}"));
+
// PUT id2
verifySuccessfulRequest(Method.PUT, "/data/" + FLAG2.id(),
"{\n" +
@@ -175,7 +179,11 @@ public class FlagsHandlerTest {
}
private String handle(Method method, String pathSuffix, String requestBody, int expectedStatus) {
- String uri = FLAGS_V1_URL + pathSuffix;
+ return handleWithPort(method, 4443, pathSuffix, requestBody, expectedStatus);
+ }
+
+ private String handleWithPort(Method method, int port, String pathSuffix, String requestBody, int expectedStatus) {
+ String uri = "https://foo.com" + (port < 0 ? "" : ":" + port) + "/flags/v1" + pathSuffix;
HttpRequest request = HttpRequest.createTestRequest(uri, method, makeInputStream(requestBody));
HttpResponse response = handler.handle(request);
assertEquals(expectedStatus, response.getStatus());