aboutsummaryrefslogtreecommitdiffstats
path: root/flags
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@verizonmedia.com>2019-11-13 00:09:57 +0100
committerHåkon Hallingstad <hakon@verizonmedia.com>2019-11-13 00:09:57 +0100
commite4ed153087ce9760437dbdbee3f8a83cab46c912 (patch)
tree1a8edfed52edda55d76dd7eb0ef43579080ba258 /flags
parent1f9f2bac2bdac8bd0ea93cca69c2e7585e73b4c2 (diff)
Allow overriding NodeRepositoryMaintenance durations with flag
Diffstat (limited to 'flags')
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java6
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/custom/NodeMaintainerDurations.java35
-rw-r--r--flags/src/test/java/com/yahoo/vespa/flags/NodeMaintainerDurationsTest.java42
3 files changed, 83 insertions, 0 deletions
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 048e8b82e11..bce487f7eb1 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.flags;
import com.yahoo.component.Vtag;
import com.yahoo.vespa.defaults.Defaults;
+import com.yahoo.vespa.flags.custom.NodeMaintainerDurations;
import com.yahoo.vespa.flags.custom.PreprovisionCapacity;
import java.util.List;
@@ -111,6 +112,11 @@ public class Flags {
"Takes effect at redeployment",
APPLICATION_ID);
+ public static final UnboundJacksonFlag<NodeMaintainerDurations> NODE_MAINTAINER_DURATIONS = defineJacksonFlag(
+ "node-maintainer-durations", new NodeMaintainerDurations(), NodeMaintainerDurations.class,
+ "Provides overrides for durations in NodeRepositoryMaintenance",
+ "Takes effect on start of config server / controller");
+
public static final UnboundBooleanFlag ENABLE_DYNAMIC_PROVISIONING = defineFeatureFlag(
"enable-dynamic-provisioning", false,
"Provision a new docker host when we otherwise can't allocate a docker node",
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/custom/NodeMaintainerDurations.java b/flags/src/main/java/com/yahoo/vespa/flags/custom/NodeMaintainerDurations.java
new file mode 100644
index 00000000000..18a041c33d4
--- /dev/null
+++ b/flags/src/main/java/com/yahoo/vespa/flags/custom/NodeMaintainerDurations.java
@@ -0,0 +1,35 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.flags.custom;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonCreator;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * {@code NodeRepositoryMaintenance} depends on various durations, e.g. the reboot interval. This class
+ * defines a serialization format for specifying such durations as a JSON object with keys matching
+ * the name (reboot_interval) and with the value being the duration in second as an integer.
+ *
+ * @author hakonhall
+ */
+public class NodeMaintainerDurations {
+ @JsonAnySetter
+ private final Map<String, Long> durations = new HashMap<>();
+
+ @JsonCreator
+ public NodeMaintainerDurations() {}
+
+ public NodeMaintainerDurations(Map<String, Long> durations) { this.durations.putAll(durations); }
+
+ @JsonAnyGetter
+ private Map<String, Long> getDurations() { return durations; }
+
+ public Optional<Duration> getDuration(String durationName) {
+ return Optional.ofNullable(durations.get(durationName)).map(Duration::ofSeconds);
+ }
+}
diff --git a/flags/src/test/java/com/yahoo/vespa/flags/NodeMaintainerDurationsTest.java b/flags/src/test/java/com/yahoo/vespa/flags/NodeMaintainerDurationsTest.java
new file mode 100644
index 00000000000..d9a2a6fa017
--- /dev/null
+++ b/flags/src/test/java/com/yahoo/vespa/flags/NodeMaintainerDurationsTest.java
@@ -0,0 +1,42 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.flags;
+
+import com.yahoo.test.json.JsonTestHelper;
+import com.yahoo.vespa.flags.custom.NodeMaintainerDurations;
+import org.junit.Test;
+
+import java.time.Duration;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author hakonhall
+ */
+public class NodeMaintainerDurationsTest {
+ @Test
+ public void testSerialization() {
+ String flagValueJson = "{ \"reboot_interval\": 3, \"fail_grace\": 7}";
+ var rawFlag = JsonNodeRawFlag.fromJson(flagValueJson);
+ var serializer = new JacksonSerializer<>(NodeMaintainerDurations.class);
+ var durations = serializer.deserialize(rawFlag);
+ assertEquals(Optional.of(Duration.ofSeconds(3)), durations.getDuration("reboot_interval"));
+ assertEquals(Optional.of(Duration.ofSeconds(7)), durations.getDuration("fail_grace"));
+ assertEquals(Optional.empty(), durations.getDuration("non-existing"));
+
+ RawFlag serializedRawFlag = serializer.serialize(durations);
+ JsonTestHelper.assertJsonEquals(flagValueJson, serializedRawFlag.asJson());
+ }
+
+ @Test
+ public void testFlag() {
+ InMemoryFlagSource flagSource = new InMemoryFlagSource();
+ var durations = new NodeMaintainerDurations(Map.of("reboot_interval", 3L, "fail_grace", 7L));
+ flagSource.withJacksonFlag(Flags.NODE_MAINTAINER_DURATIONS.id(), durations, NodeMaintainerDurations.class);
+ NodeMaintainerDurations resolvedDurations = Flags.NODE_MAINTAINER_DURATIONS.bindTo(flagSource).value();
+ assertEquals(Optional.of(Duration.ofSeconds(3)), resolvedDurations.getDuration("reboot_interval"));
+ assertEquals(Optional.of(Duration.ofSeconds(7)), resolvedDurations.getDuration("fail_grace"));
+ assertEquals(Optional.empty(), resolvedDurations.getDuration("non-existing"));
+ }
+}