summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@verizonmedia.com>2019-10-22 17:13:05 +0200
committerHåkon Hallingstad <hakon@verizonmedia.com>2019-10-22 17:13:05 +0200
commitb65dce02245de0341ce576c97d7f526d745e02f8 (patch)
tree705c3379eb1b8cb0e67fad968937a25fbf14516e
parentba0c98fee5db21f0ac893711a5fafa39acb56be2 (diff)
Document HOSTNAME and make factories
-rw-r--r--configserver-flags/src/test/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImplTest.java2
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/FetchVector.java31
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java3
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/json/BlacklistCondition.java5
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/json/Condition.java4
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/json/ListCondition.java4
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/json/RelationalCondition.java6
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/json/WhitelistCondition.java5
-rw-r--r--flags/src/test/java/com/yahoo/vespa/flags/json/ConditionTest.java4
9 files changed, 38 insertions, 26 deletions
diff --git a/configserver-flags/src/test/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImplTest.java b/configserver-flags/src/test/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImplTest.java
index e366c012a9e..4f2d5ae13d4 100644
--- a/configserver-flags/src/test/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImplTest.java
+++ b/configserver-flags/src/test/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImplTest.java
@@ -33,7 +33,7 @@ public class FlagsDbImplTest {
FlagsDbImpl db = new FlagsDbImpl(curator);
var params = new Condition.CreateParams(FetchVector.Dimension.HOSTNAME, List.of("host1"), Optional.empty());
- Condition condition1 = new WhitelistCondition(params);
+ Condition condition1 = WhitelistCondition.create(params);
Rule rule1 = new Rule(Optional.of(JsonNodeRawFlag.fromJson("13")), condition1);
FlagId flagId = new FlagId("id");
FlagData data = new FlagData(flagId, new FetchVector().with(FetchVector.Dimension.ZONE_ID, "zone-a"), rule1);
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/FetchVector.java b/flags/src/main/java/com/yahoo/vespa/flags/FetchVector.java
index a4fbec4922f..4cce7a9bc2a 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/FetchVector.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/FetchVector.java
@@ -27,9 +27,6 @@ public class FetchVector {
/** Value from ApplicationId::serializedForm of the form tenant:applicationName:instance. */
APPLICATION_ID,
- /** Fully qualified hostname */
- HOSTNAME,
-
/** Node type from com.yahoo.config.provision.NodeType::name, e.g. tenant, host, confighost, controller, etc. */
NODE_TYPE,
@@ -37,24 +34,30 @@ public class FetchVector {
CLUSTER_TYPE,
/**
- * WARNING: DO SET THIS DIMENSION FOR A FLAG
+ * Fully qualified hostname.
*
- * <p>ALL flags can be set differently in different zones: This dimension is ONLY useful for the controller
- * that needs to handle multiple zones.
- *
- * <p>Value from ZoneId::value is of the form environment.region.
+ * <p>NOTE: There is seldom any need to set HOSTNAME, as it is always set implicitly (in {@link Flags})
+ * from {@code Defaults.getDefaults().vespaHostname()}. The hostname may e.g. be overridden when
+ * fetching flag value for a Docker container node.
*/
- ZONE_ID,
+ HOSTNAME,
/**
- * WARNING: DO SET THIS DIMENSION FOR A FLAG
+ * Vespa version from Version::toFullString of the form Major.Minor.Micro.
*
- * <p>The Vespa version is always fetched implicitly from {@link com.yahoo.component.Vtag#currentVersion}.
+ * <p>NOTE: There is seldom any need to set VESPA_VERSION, as it is always set implicitly
+ * (in {@link Flags}) from {@link com.yahoo.component.Vtag#currentVersion}. The version COULD e.g.
+ * be overridden when fetching flag value for a Docker container node.
+ */
+ VESPA_VERSION,
+
+ /**
+ * Zone from ZoneId::value of the form environment.region.
*
- * <p>Value from Version::toFullString is of the form Major.Minor.Micro[.qualifier]. When ordering
- * versions, note that 7.3 == 7.3.0.
+ * <p>NOTE: There is seldom any need to set ZONE_ID, as all flags are set per zone anyways. The controller
+ * could PERHAPS use this where it handles multiple zones.
*/
- VESPA_VERSION
+ ZONE_ID
}
private final Map<Dimension, String> map;
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
index ef5e8451650..f4b223ead82 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -237,7 +237,8 @@ public class Flags {
* from the FlagSource.
* @param <T> The boxed type of the flag value, e.g. Boolean for flags guarding features.
* @param <U> The type of the unbound flag, e.g. UnboundBooleanFlag.
- * @return An unbound flag with {@link FetchVector.Dimension#HOSTNAME HOSTNAME} environment. The ZONE environment
+ * @return An unbound flag with {@link FetchVector.Dimension#HOSTNAME HOSTNAME} and
+ * {@link FetchVector.Dimension#VESPA_VERSION VESPA_VERSION} already set. The ZONE environment
* is typically implicit.
*/
private static <T, U extends UnboundFlag<?, ?, ?>> U define(TypedUnboundFlagFactory<T, U> factory,
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/BlacklistCondition.java b/flags/src/main/java/com/yahoo/vespa/flags/json/BlacklistCondition.java
index 22f907a7e0d..435ddbb3e19 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/json/BlacklistCondition.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/json/BlacklistCondition.java
@@ -5,7 +5,6 @@ package com.yahoo.vespa.flags.json;
* @author hakonhall
*/
public class BlacklistCondition extends ListCondition {
- public BlacklistCondition(CreateParams params) {
- super(Type.BLACKLIST, params);
- }
+ public static BlacklistCondition create(CreateParams params) { return new BlacklistCondition(params); }
+ private BlacklistCondition(CreateParams params) { super(Type.BLACKLIST, params); }
}
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/Condition.java b/flags/src/main/java/com/yahoo/vespa/flags/json/Condition.java
index e107cef8acd..96dbc8197c1 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/json/Condition.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/json/Condition.java
@@ -60,8 +60,8 @@ public interface Condition extends Predicate<FetchVector> {
var params = new CreateParams(dimension, values, predicate);
switch (type) {
- case WHITELIST: return new WhitelistCondition(params);
- case BLACKLIST: return new BlacklistCondition(params);
+ case WHITELIST: return WhitelistCondition.create(params);
+ case BLACKLIST: return BlacklistCondition.create(params);
case RELATIONAL: return RelationalCondition.create(params);
}
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/ListCondition.java b/flags/src/main/java/com/yahoo/vespa/flags/json/ListCondition.java
index 948f1fc6c3e..c2c76529833 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/json/ListCondition.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/json/ListCondition.java
@@ -20,6 +20,10 @@ public abstract class ListCondition implements Condition {
this.dimension = params.dimension();
this.values = List.copyOf(params.values());
this.isWhitelist = type == Type.WHITELIST;
+
+ if (params.predicate().isPresent()) {
+ throw new IllegalArgumentException(getClass().getSimpleName() + " does not support the 'predicate' field");
+ }
}
@Override
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/RelationalCondition.java b/flags/src/main/java/com/yahoo/vespa/flags/json/RelationalCondition.java
index 996f1f925f7..afaf94b26b6 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/json/RelationalCondition.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/json/RelationalCondition.java
@@ -5,6 +5,7 @@ import com.yahoo.component.Version;
import com.yahoo.vespa.flags.FetchVector;
import com.yahoo.vespa.flags.json.wire.WireCondition;
+import java.util.List;
import java.util.function.Predicate;
/**
@@ -16,6 +17,11 @@ public class RelationalCondition implements Condition {
private final FetchVector.Dimension dimension;
public static RelationalCondition create(CreateParams params) {
+ if (!params.values().isEmpty()) {
+ throw new IllegalArgumentException(RelationalCondition.class.getSimpleName() +
+ " does not support the 'values' field");
+ }
+
String predicate = params.predicate().orElseThrow(() ->
new IllegalArgumentException(RelationalCondition.class.getSimpleName() +
" requires the predicate field in the condition"));
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/WhitelistCondition.java b/flags/src/main/java/com/yahoo/vespa/flags/json/WhitelistCondition.java
index 5c3f8bd3ade..ab266fdaf1d 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/json/WhitelistCondition.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/json/WhitelistCondition.java
@@ -5,7 +5,6 @@ package com.yahoo.vespa.flags.json;
* @author hakonhall
*/
public class WhitelistCondition extends ListCondition {
- public WhitelistCondition(CreateParams params) {
- super(Type.WHITELIST, params);
- }
+ public static WhitelistCondition create(CreateParams params) { return new WhitelistCondition(params); }
+ private WhitelistCondition(CreateParams params) { super(Type.WHITELIST, params); }
}
diff --git a/flags/src/test/java/com/yahoo/vespa/flags/json/ConditionTest.java b/flags/src/test/java/com/yahoo/vespa/flags/json/ConditionTest.java
index cf8d06fd312..618bc86baaf 100644
--- a/flags/src/test/java/com/yahoo/vespa/flags/json/ConditionTest.java
+++ b/flags/src/test/java/com/yahoo/vespa/flags/json/ConditionTest.java
@@ -19,7 +19,7 @@ public class ConditionTest {
public void testWhitelist() {
String hostname1 = "host1";
var params = new Condition.CreateParams(FetchVector.Dimension.HOSTNAME, List.of(hostname1), Optional.empty());
- Condition condition = new WhitelistCondition(params);
+ Condition condition = WhitelistCondition.create(params);
assertFalse(condition.test(new FetchVector()));
assertFalse(condition.test(new FetchVector().with(FetchVector.Dimension.APPLICATION_ID, "foo")));
assertFalse(condition.test(new FetchVector().with(FetchVector.Dimension.HOSTNAME, "bar")));
@@ -30,7 +30,7 @@ public class ConditionTest {
public void testBlacklist() {
String hostname1 = "host1";
var params = new Condition.CreateParams(FetchVector.Dimension.HOSTNAME, List.of(hostname1), Optional.empty());
- Condition condition = new BlacklistCondition(params);
+ Condition condition = BlacklistCondition.create(params);
assertTrue(condition.test(new FetchVector()));
assertTrue(condition.test(new FetchVector().with(FetchVector.Dimension.APPLICATION_ID, "foo")));
assertTrue(condition.test(new FetchVector().with(FetchVector.Dimension.HOSTNAME, "bar")));