aboutsummaryrefslogtreecommitdiffstats
path: root/flags
diff options
context:
space:
mode:
authorMorten Tokle <mortent@yahooinc.com>2023-09-22 10:44:56 +0200
committerMorten Tokle <mortent@yahooinc.com>2023-09-22 10:44:56 +0200
commitddb3ea3b347a17678664e2430d00e232e8f8fb31 (patch)
tree8ef15e4fb4614e54ab946f15e8e9fa1b7bfc1bcb /flags
parent4c62f27ca181c09f42ae15f7ffb4d497ab53395b (diff)
Deserialize "application" and "instance" to INSTANCE_ID
Diffstat (limited to 'flags')
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/json/DimensionHelper.java52
-rw-r--r--flags/src/test/java/com/yahoo/vespa/flags/json/FlagDataTest.java7
2 files changed, 39 insertions, 20 deletions
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/DimensionHelper.java b/flags/src/main/java/com/yahoo/vespa/flags/json/DimensionHelper.java
index 3d63a31d3a2..8fb48c8a82f 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/json/DimensionHelper.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/json/DimensionHelper.java
@@ -4,30 +4,31 @@ package com.yahoo.vespa.flags.json;
import com.yahoo.vespa.flags.FetchVector;
import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
/**
* @author hakonhall
*/
public class DimensionHelper {
- private static final Map<FetchVector.Dimension, String> serializedDimensions = new HashMap<>();
+ private static final Map<FetchVector.Dimension, List<String>> serializedDimensions = new HashMap<>();
static {
- serializedDimensions.put(FetchVector.Dimension.INSTANCE_ID, "application");
- serializedDimensions.put(FetchVector.Dimension.CLOUD, "cloud");
- serializedDimensions.put(FetchVector.Dimension.CLOUD_ACCOUNT, "cloud-account");
- serializedDimensions.put(FetchVector.Dimension.CLUSTER_ID, "cluster-id");
- serializedDimensions.put(FetchVector.Dimension.CLUSTER_TYPE, "cluster-type");
- serializedDimensions.put(FetchVector.Dimension.CONSOLE_USER_EMAIL, "console-user-email");
- serializedDimensions.put(FetchVector.Dimension.ENVIRONMENT, "environment");
- serializedDimensions.put(FetchVector.Dimension.HOSTNAME, "hostname");
- serializedDimensions.put(FetchVector.Dimension.NODE_TYPE, "node-type");
- serializedDimensions.put(FetchVector.Dimension.SYSTEM, "system");
- serializedDimensions.put(FetchVector.Dimension.TENANT_ID, "tenant");
- serializedDimensions.put(FetchVector.Dimension.VESPA_VERSION, "vespa-version");
- serializedDimensions.put(FetchVector.Dimension.ZONE_ID, "zone");
+ serializedDimensions.put(FetchVector.Dimension.CLOUD, List.of("cloud"));
+ serializedDimensions.put(FetchVector.Dimension.CLOUD_ACCOUNT, List.of("cloud-account"));
+ serializedDimensions.put(FetchVector.Dimension.CLUSTER_ID, List.of("cluster-id"));
+ serializedDimensions.put(FetchVector.Dimension.CLUSTER_TYPE, List.of("cluster-type"));
+ serializedDimensions.put(FetchVector.Dimension.CONSOLE_USER_EMAIL, List.of("console-user-email"));
+ serializedDimensions.put(FetchVector.Dimension.ENVIRONMENT, List.of("environment"));
+ serializedDimensions.put(FetchVector.Dimension.HOSTNAME, List.of("hostname"));
+ serializedDimensions.put(FetchVector.Dimension.INSTANCE_ID, List.of("instance", "application"));
+ serializedDimensions.put(FetchVector.Dimension.NODE_TYPE, List.of("node-type"));
+ serializedDimensions.put(FetchVector.Dimension.SYSTEM, List.of("system"));
+ serializedDimensions.put(FetchVector.Dimension.TENANT_ID, List.of("tenant"));
+ serializedDimensions.put(FetchVector.Dimension.VESPA_VERSION, List.of("vespa-version"));
+ serializedDimensions.put(FetchVector.Dimension.ZONE_ID, List.of("zone"));
if (serializedDimensions.size() != FetchVector.Dimension.values().length) {
throw new IllegalStateException(FetchVectorHelper.class.getName() + " is not in sync with " +
@@ -35,16 +36,27 @@ public class DimensionHelper {
}
}
- private static final Map<String, FetchVector.Dimension> deserializedDimensions = serializedDimensions.
- entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
+ private static final Map<String, FetchVector.Dimension> deserializedDimensions = reverseMapping(serializedDimensions);
+
+ private static Map<String, FetchVector.Dimension> reverseMapping(Map<FetchVector.Dimension, List<String>> mapping) {
+ Map<String, FetchVector.Dimension> reverseMapping = new LinkedHashMap<>();
+ mapping.forEach((dimension, serializedDimensions) -> {
+ serializedDimensions.forEach(serializedDimension -> {
+ if (reverseMapping.put(serializedDimension, dimension) != null) {
+ throw new IllegalStateException("Duplicate serialized dimension: '" + serializedDimension + "'");
+ }
+ });
+ });
+ return Map.copyOf(reverseMapping);
+ }
public static String toWire(FetchVector.Dimension dimension) {
- String serializedDimension = serializedDimensions.get(dimension);
- if (serializedDimension == null) {
+ List<String> serializedDimension = serializedDimensions.get(dimension);
+ if (serializedDimension == null || serializedDimension.isEmpty()) {
throw new IllegalArgumentException("Unsupported dimension (please add it): '" + dimension + "'");
}
- return serializedDimension;
+ return serializedDimension.get(0);
}
public static FetchVector.Dimension fromWire(String serializedDimension) {
diff --git a/flags/src/test/java/com/yahoo/vespa/flags/json/FlagDataTest.java b/flags/src/test/java/com/yahoo/vespa/flags/json/FlagDataTest.java
index 64eace97849..ed81afc8054 100644
--- a/flags/src/test/java/com/yahoo/vespa/flags/json/FlagDataTest.java
+++ b/flags/src/test/java/com/yahoo/vespa/flags/json/FlagDataTest.java
@@ -52,6 +52,8 @@ public class FlagDataTest {
}
}""";
+ private final String json_with_instance = json.replace("application", "instance");
+
private final FetchVector vector = new FetchVector();
@Test
@@ -271,6 +273,11 @@ public class FlagDataTest {
}
private void verify(Optional<String> expectedValue, FetchVector vector) {
+ verify(json, expectedValue, vector);
+ verify(json_with_instance, expectedValue, vector);
+ }
+
+ private void verify(String json, Optional<String> expectedValue, FetchVector vector) {
FlagData data = FlagData.deserialize(json);
assertEquals("id1", data.id().toString());
Optional<RawFlag> rawFlag = data.resolve(vector);