summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@verizonmedia.com>2019-06-14 20:04:36 +0200
committerHåkon Hallingstad <hakon@verizonmedia.com>2019-06-14 20:04:36 +0200
commitbb109275b0c35f88eed0808f2cbe26daaedc37d3 (patch)
tree1a474f720ee53936ef63d9e4bb0eb4982ca29e1f /node-admin
parentf7137cf256adcebf6a54d6e3f49a18c2b9c4e436 (diff)
Introduce StoredBoolean
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBoolean.java45
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/UnixPath.java16
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBooleanTest.java52
3 files changed, 113 insertions, 0 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBoolean.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBoolean.java
new file mode 100644
index 00000000000..8edf5f7dcbd
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBoolean.java
@@ -0,0 +1,45 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.node.admin.task.util.file;
+
+import com.yahoo.vespa.hosted.node.admin.component.TaskContext;
+
+import java.nio.file.Path;
+import java.util.logging.Logger;
+
+/**
+ * Class wrapping a boolean stored on disk.
+ *
+ * <p>The implementation is compatible with {@link StoredInteger} when absence or 0 means false.
+ *
+ * @author hakonhall
+ */
+public class StoredBoolean {
+ private static Logger logger = Logger.getLogger(StoredBoolean.class.getName());
+
+ private final UnixPath path;
+
+ /** The parent directory must exist. Value is false by default. */
+ public StoredBoolean(Path path) {
+ this.path = new UnixPath(path);
+ }
+
+ public boolean value() {
+ return path.readUtf8FileIfExists().map(String::trim).map(s -> !"0".equals(s)).orElse(false);
+ }
+
+ /** Sets value to true. */
+ public void set(TaskContext context) {
+ if (!value()) {
+ context.log(logger, "Writes " + path);
+ path.writeUtf8File("1");
+ }
+ }
+
+ /** Sets value to false. */
+ public void clear(TaskContext context) {
+ if (value()) {
+ context.log(logger, "Deletes " + path);
+ path.deleteIfExists();
+ }
+ }
+}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/UnixPath.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/UnixPath.java
index 1d0299ae272..cd008c5bdfc 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/UnixPath.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/file/UnixPath.java
@@ -1,6 +1,8 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.node.admin.task.util.file;
+import org.eclipse.jetty.io.RuntimeIOException;
+
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
@@ -50,10 +52,24 @@ public class UnixPath {
return path;
}
+ public boolean exists() {
+ return Files.exists(path);
+ }
+
public String readUtf8File() {
return new String(readBytes(), StandardCharsets.UTF_8);
}
+ public Optional<String> readUtf8FileIfExists() {
+ try {
+ return Optional.of(new String(Files.readAllBytes(path), StandardCharsets.UTF_8));
+ } catch (NoSuchFileException ignored) {
+ return Optional.empty();
+ } catch (IOException e) {
+ throw new RuntimeIOException(e);
+ }
+ }
+
public byte[] readBytes() {
return uncheck(() -> Files.readAllBytes(path));
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBooleanTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBooleanTest.java
new file mode 100644
index 00000000000..bc5487f740c
--- /dev/null
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/file/StoredBooleanTest.java
@@ -0,0 +1,52 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.node.admin.task.util.file;
+
+import com.yahoo.vespa.hosted.node.admin.component.TaskContext;
+import com.yahoo.vespa.test.file.TestFileSystem;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.file.FileSystem;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+/**
+ * @author hakonhall
+ */
+public class StoredBooleanTest {
+ private final TaskContext context = mock(TaskContext.class);
+ private final FileSystem fileSystem = TestFileSystem.create();
+ private final Path path = fileSystem.getPath("/foo");
+ private final StoredBoolean storedBoolean = new StoredBoolean(path);
+
+ @Test
+ public void storedBoolean() {
+ assertFalse(storedBoolean.value());
+ storedBoolean.set(context);
+ assertTrue(storedBoolean.value());
+ storedBoolean.clear(context);
+ assertFalse(storedBoolean.value());
+ }
+
+ @Test
+ public void testCompatibility() throws IOException {
+ StoredInteger storedInteger = new StoredInteger(path);
+ assertFalse(storedBoolean.value());
+
+ storedInteger.write(context, 1);
+ assertTrue(storedBoolean.value());
+
+ storedInteger.write(context, 2);
+ assertTrue(storedBoolean.value());
+
+ storedInteger.write(context, 0);
+ assertFalse(storedBoolean.value());
+
+ Files.delete(path);
+ assertFalse(storedBoolean.value());
+ }
+} \ No newline at end of file