diff options
author | Håkon Hallingstad <hakon@verizonmedia.com> | 2019-11-13 00:09:57 +0100 |
---|---|---|
committer | Håkon Hallingstad <hakon@verizonmedia.com> | 2019-11-13 00:09:57 +0100 |
commit | e4ed153087ce9760437dbdbee3f8a83cab46c912 (patch) | |
tree | 1a8edfed52edda55d76dd7eb0ef43579080ba258 /flags | |
parent | 1f9f2bac2bdac8bd0ea93cca69c2e7585e73b4c2 (diff) |
Allow overriding NodeRepositoryMaintenance durations with flag
Diffstat (limited to 'flags')
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")); + } +} |