aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerOperations.java2
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java16
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java4
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/identity/AthenzCredentialsMaintainer.java6
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/AbstractProducer.java2
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImpl.java6
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java13
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java58
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/PathScope.java57
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java12
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java4
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java20
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImplTest.java20
13 files changed, 123 insertions, 97 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerOperations.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerOperations.java
index af12a6201d3..3017773700a 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerOperations.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/container/ContainerOperations.java
@@ -141,7 +141,7 @@ public class ContainerOperations {
}
private String executeNodeCtlInContainer(NodeAgentContext context, String program) {
- String[] command = new String[] {context.containerPathUnderVespaHome("bin/vespa-nodectl").pathInContainer(), program};
+ String[] command = new String[] {context.paths().underVespaHome("bin/vespa-nodectl").pathInContainer(), program};
return executeCommandInContainerAsRoot(context, command).getOutput();
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
index 9328eb232a6..dd0b8a2acdc 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java
@@ -86,7 +86,7 @@ public class StorageMaintainer {
if (archiveUri.isEmpty()) return false;
ApplicationId owner = context.node().owner().orElseThrow();
- List<SyncFileInfo> syncFileInfos = FileFinder.files(context.containerPathUnderVespaHome("logs/vespa"))
+ List<SyncFileInfo> syncFileInfos = FileFinder.files(context.paths().underVespaHome("logs/vespa"))
.maxDepth(2)
.stream()
.sorted(Comparator.comparing(FileFinder.FileAttributes::lastModifiedTime))
@@ -101,7 +101,7 @@ public class StorageMaintainer {
DiskSize cachedDiskUsage = diskUsage.getIfPresent(context.containerName());
if (cachedDiskUsage != null) return Optional.of(cachedDiskUsage);
- DiskSize diskUsageBytes = getDiskUsed(context, context.containerPath("/").pathOnHost());
+ DiskSize diskUsageBytes = getDiskUsed(context, context.paths().of("/").pathOnHost());
diskUsage.put(context.containerName(), diskUsageBytes);
return Optional.of(diskUsageBytes);
} catch (Exception e) {
@@ -150,18 +150,18 @@ public class StorageMaintainer {
Function<Instant, Double> monthNormalizer = instant -> Duration.between(instant, start).getSeconds() / oneMonthSeconds;
List<DiskCleanupRule> rules = new ArrayList<>();
- rules.add(CoredumpCleanupRule.forContainer(context.containerPathUnderVespaHome("var/crash")));
+ rules.add(CoredumpCleanupRule.forContainer(context.paths().underVespaHome("var/crash")));
if (context.node().membership().map(m -> m.type().hasContainer()).orElse(false))
- rules.add(new LinearCleanupRule(() -> FileFinder.files(context.containerPathUnderVespaHome("logs/vespa/qrs")).list(),
+ rules.add(new LinearCleanupRule(() -> FileFinder.files(context.paths().underVespaHome("logs/vespa/qrs")).list(),
fa -> monthNormalizer.apply(fa.lastModifiedTime()), Priority.LOWEST, Priority.HIGHEST));
if (context.nodeType() == NodeType.tenant && context.node().membership().map(m -> m.type().isAdmin()).orElse(false))
- rules.add(new LinearCleanupRule(() -> FileFinder.files(context.containerPathUnderVespaHome("logs/vespa/logarchive")).list(),
+ rules.add(new LinearCleanupRule(() -> FileFinder.files(context.paths().underVespaHome("logs/vespa/logarchive")).list(),
fa -> monthNormalizer.apply(fa.lastModifiedTime()), Priority.LOWEST, Priority.HIGHEST));
if (context.nodeType() == NodeType.proxy)
- rules.add(new LinearCleanupRule(() -> FileFinder.files(context.containerPathUnderVespaHome("logs/nginx")).list(),
+ rules.add(new LinearCleanupRule(() -> FileFinder.files(context.paths().underVespaHome("logs/nginx")).list(),
fa -> monthNormalizer.apply(fa.lastModifiedTime()), Priority.LOWEST, Priority.MEDIUM));
return rules;
@@ -203,7 +203,7 @@ public class StorageMaintainer {
* Removes old files, reports coredumps and archives container data, runs when container enters state "dirty"
*/
public void archiveNodeStorage(NodeAgentContext context) {
- ContainerPath logsDirInContainer = context.containerPathUnderVespaHome("logs");
+ ContainerPath logsDirInContainer = context.paths().underVespaHome("logs");
Path containerLogsInArchiveDir = archiveContainerStoragePath
.resolve(context.containerName().asString() + "_" + DATE_TIME_FORMATTER.format(clock.instant()) + logsDirInContainer.pathInContainer());
@@ -213,7 +213,7 @@ public class StorageMaintainer {
new UnixPath(containerLogsInArchiveDir).createParents();
containerLogsOnHost.moveIfExists(containerLogsInArchiveDir);
}
- new UnixPath(context.containerPath("/")).deleteRecursively();
+ new UnixPath(context.paths().of("/")).deleteRecursively();
}
private String getMicrocodeVersion() {
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java
index 0594c5ee016..8d4e487ed6c 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandler.java
@@ -2,9 +2,9 @@
package com.yahoo.vespa.hosted.node.admin.maintenance.coredump;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec;
import com.yahoo.vespa.hosted.node.admin.container.metrics.Dimensions;
import com.yahoo.vespa.hosted.node.admin.container.metrics.Metrics;
-import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec;
import com.yahoo.vespa.hosted.node.admin.nodeadmin.ConvergenceException;
import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContext;
import com.yahoo.vespa.hosted.node.admin.task.util.file.FileFinder;
@@ -87,7 +87,7 @@ public class CoredumpHandler {
public void converge(NodeAgentContext context, Supplier<Map<String, Object>> nodeAttributesSupplier, boolean throwIfCoreBeingWritten) {
- ContainerPath containerCrashPath = context.containerPath(crashPatchInContainer);
+ ContainerPath containerCrashPath = context.paths().of(crashPatchInContainer);
ContainerPath containerProcessingPath = containerCrashPath.resolve(PROCESSING_DIRECTORY_NAME);
updateMetrics(context, containerCrashPath);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/identity/AthenzCredentialsMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/identity/AthenzCredentialsMaintainer.java
index 3de4be0d8b9..5c1401ade52 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/identity/AthenzCredentialsMaintainer.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/identity/AthenzCredentialsMaintainer.java
@@ -109,7 +109,7 @@ public class AthenzCredentialsMaintainer implements CredentialsMaintainer {
try {
context.log(logger, Level.FINE, "Checking certificate");
- ContainerPath containerSiaDirectory = context.containerPath(CONTAINER_SIA_DIRECTORY);
+ ContainerPath containerSiaDirectory = context.paths().of(CONTAINER_SIA_DIRECTORY);
ContainerPath privateKeyFile = (ContainerPath) SiaUtils.getPrivateKeyFile(containerSiaDirectory, context.identity());
ContainerPath certificateFile = (ContainerPath) SiaUtils.getCertificateFile(containerSiaDirectory, context.identity());
ContainerPath identityDocumentFile = containerSiaDirectory.resolve("vespa-node-identity-document.json");
@@ -153,14 +153,14 @@ public class AthenzCredentialsMaintainer implements CredentialsMaintainer {
}
public void clearCredentials(NodeAgentContext context) {
- FileFinder.files(context.containerPath(CONTAINER_SIA_DIRECTORY))
+ FileFinder.files(context.paths().of(CONTAINER_SIA_DIRECTORY))
.deleteRecursively(context);
lastRefreshAttempt.remove(context.containerName());
}
@Override
public Duration certificateLifetime(NodeAgentContext context) {
- ContainerPath containerSiaDirectory = context.containerPath(CONTAINER_SIA_DIRECTORY);
+ ContainerPath containerSiaDirectory = context.paths().of(CONTAINER_SIA_DIRECTORY);
ContainerPath certificateFile = (ContainerPath) SiaUtils.getCertificateFile(containerSiaDirectory, context.identity());
try {
X509Certificate certificate = readCertificateFromFile(certificateFile);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/AbstractProducer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/AbstractProducer.java
index 1756b81f795..a1416d3274c 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/AbstractProducer.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/AbstractProducer.java
@@ -48,7 +48,7 @@ abstract class AbstractProducer implements ArtifactProducer {
}
protected int findVespaServicePid(NodeAgentContext ctx, String configId) throws IOException {
- ContainerPath findPidBinary = ctx.containerPathUnderVespaHome("libexec/vespa/find-pid");
+ ContainerPath findPidBinary = ctx.paths().underVespaHome("libexec/vespa/find-pid");
CommandResult findPidResult = executeCommand(ctx, List.of(findPidBinary.pathInContainer(), configId), true);
return Integer.parseInt(findPidResult.getOutput());
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImpl.java
index ab782d25717..86dc1ed983d 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/servicedump/VespaServiceDumperImpl.java
@@ -88,7 +88,7 @@ public class VespaServiceDumperImpl implements VespaServiceDumper {
handleFailure(context, request, startedAt, "No artifacts requested");
return;
}
- ContainerPath directory = context.containerPathUnderVespaHome("tmp/vespa-service-dump");
+ ContainerPath directory = context.paths().underVespaHome("tmp/vespa-service-dump");
UnixPath unixPathDirectory = new UnixPath(directory);
try {
context.log(log, Level.INFO,
@@ -192,7 +192,7 @@ public class VespaServiceDumperImpl implements VespaServiceDumper {
@Override
public int servicePid() {
if (pid == -1) {
- ContainerPath findPidBinary = nodeAgentCtx.containerPathUnderVespaHome("libexec/vespa/find-pid");
+ ContainerPath findPidBinary = nodeAgentCtx.paths().underVespaHome("libexec/vespa/find-pid");
CommandResult findPidResult = executeCommandInNode(List.of(findPidBinary.pathInContainer(), serviceId()), true);
this.pid = Integer.parseInt(findPidResult.getOutput());
}
@@ -226,7 +226,7 @@ public class VespaServiceDumperImpl implements VespaServiceDumper {
@Override
public ContainerPath containerPathUnderVespaHome(String relativePath) {
- return nodeAgentCtx.containerPathUnderVespaHome(relativePath);
+ return nodeAgentCtx.paths().underVespaHome(relativePath);
}
@Override public Options options() { return this; }
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java
index f90e1944948..2713ff45ae8 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContext.java
@@ -11,9 +11,7 @@ import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.Acl;
import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec;
import com.yahoo.vespa.hosted.node.admin.container.ContainerName;
import com.yahoo.vespa.hosted.node.admin.container.ContainerNetworkMode;
-import com.yahoo.vespa.hosted.node.admin.task.util.fs.ContainerPath;
-import java.nio.file.Path;
import java.util.Optional;
public interface NodeAgentContext extends TaskContext {
@@ -45,9 +43,12 @@ public interface NodeAgentContext extends TaskContext {
/** @return information about users/user namespace of the linux container this context applies to */
UserScope users();
+ /** @return methods to resolve paths within container's file system */
+ PathScope paths();
+
default boolean isDisabled(NodeAgentTask task) {
return false;
- };
+ }
/**
* The vcpu value in NodeSpec is the number of vcpus required by the node on a fixed historical
@@ -59,11 +60,5 @@ public interface NodeAgentContext extends TaskContext {
*/
double vcpuOnThisHost();
- ContainerPath containerPath(String pathInNode);
-
- ContainerPath containerPathUnderVespaHome(String relativePath);
-
- ContainerPath containerPathFromPathOnHost(Path pathOnHost);
-
Optional<ApplicationId> hostExclusiveTo();
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java
index 9ffb12ac1f7..47c96103ab5 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImpl.java
@@ -18,7 +18,6 @@ import com.yahoo.vespa.hosted.node.admin.container.ContainerName;
import com.yahoo.vespa.hosted.node.admin.container.ContainerNetworkMode;
import com.yahoo.vespa.hosted.node.admin.task.util.file.UnixUser;
import com.yahoo.vespa.hosted.node.admin.task.util.fs.ContainerFileSystem;
-import com.yahoo.vespa.hosted.node.admin.task.util.fs.ContainerPath;
import java.nio.file.FileSystem;
import java.nio.file.Path;
@@ -41,15 +40,15 @@ public class NodeAgentContextImpl implements NodeAgentContext {
private final AthenzIdentity identity;
private final ContainerNetworkMode containerNetworkMode;
private final ZoneApi zone;
- private final ContainerFileSystem containerFs;
- private final ContainerPath pathToVespaHome;
+ private final UserScope userScope;
+ private final PathScope pathScope;
private final double cpuSpeedup;
private final Set<NodeAgentTask> disabledNodeAgentTasks;
private final Optional<ApplicationId> hostExclusiveTo;
public NodeAgentContextImpl(NodeSpec node, Acl acl, AthenzIdentity identity,
ContainerNetworkMode containerNetworkMode, ZoneApi zone,
- FlagSource flagSource, ContainerFileSystem containerFs, String pathToVespaHome,
+ FlagSource flagSource, UserScope userScope, PathScope pathScope,
double cpuSpeedup, Optional<ApplicationId> hostExclusiveTo) {
if (cpuSpeedup <= 0)
throw new IllegalArgumentException("cpuSpeedUp must be positive, was: " + cpuSpeedup);
@@ -60,12 +59,14 @@ public class NodeAgentContextImpl implements NodeAgentContext {
this.identity = Objects.requireNonNull(identity);
this.containerNetworkMode = Objects.requireNonNull(containerNetworkMode);
this.zone = Objects.requireNonNull(zone);
- this.containerFs = Objects.requireNonNull(containerFs);
- this.pathToVespaHome = containerFs.getPath(pathToVespaHome).withUser(users().vespa());
+ this.userScope = Objects.requireNonNull(userScope);
+ this.pathScope = Objects.requireNonNull(pathScope);
this.logPrefix = containerName.asString() + ": ";
this.cpuSpeedup = cpuSpeedup;
this.disabledNodeAgentTasks = NodeAgentTask.fromString(
- PermanentFlags.DISABLED_HOST_ADMIN_TASKS.bindTo(flagSource).with(FetchVector.Dimension.HOSTNAME, node.hostname()).value());
+ PermanentFlags.DISABLED_HOST_ADMIN_TASKS.bindTo(flagSource)
+ .with(FetchVector.Dimension.HOSTNAME, node.hostname())
+ .with(FetchVector.Dimension.NODE_TYPE, node.type().name()).value());
this.hostExclusiveTo = hostExclusiveTo;
}
@@ -101,7 +102,12 @@ public class NodeAgentContextImpl implements NodeAgentContext {
@Override
public UserScope users() {
- return containerFs.getUserPrincipalLookupService().userScope();
+ return userScope;
+ }
+
+ @Override
+ public PathScope paths() {
+ return pathScope;
}
@Override
@@ -115,24 +121,6 @@ public class NodeAgentContextImpl implements NodeAgentContext {
}
@Override
- public ContainerPath containerPath(String pathInNode) {
- return containerFs.getPath(pathInNode);
- }
-
- @Override
- public ContainerPath containerPathUnderVespaHome(String relativePath) {
- if (relativePath.startsWith("/"))
- throw new IllegalArgumentException("Expected a relative path to the Vespa home, got: " + relativePath);
-
- return pathToVespaHome.resolve(relativePath);
- }
-
- @Override
- public ContainerPath containerPathFromPathOnHost(Path pathOnHost) {
- return ContainerPath.fromPathOnHost(containerFs, pathOnHost, users().root());
- }
-
- @Override
public Optional<ApplicationId> hostExclusiveTo() {
return hostExclusiveTo;
}
@@ -152,20 +140,6 @@ public class NodeAgentContextImpl implements NodeAgentContext {
logger.log(level, logPrefix + message, throwable);
}
- @Override
- public String toString() {
- return "NodeAgentContextImpl{" +
- "node=" + node +
- ", acl=" + acl +
- ", containerName=" + containerName +
- ", identity=" + identity +
- ", dockerNetworking=" + containerNetworkMode +
- ", zone=" + zone +
- ", pathToVespaHome=" + pathToVespaHome +
- ", hostExclusiveTo='" + hostExclusiveTo + '\'' +
- '}';
- }
-
public static NodeAgentContextImpl.Builder builder(NodeSpec node) {
return new Builder(new NodeSpec.Builder(node));
}
@@ -297,8 +271,8 @@ public class NodeAgentContextImpl implements NodeAgentContext {
}
}),
Optional.ofNullable(flagSource).orElseGet(InMemoryFlagSource::new),
- containerFs,
- "/opt/vespa",
+ userScope,
+ new PathScope(containerFs, "/opt/vespa"),
cpuSpeedUp, hostExclusiveTo);
}
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/PathScope.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/PathScope.java
new file mode 100644
index 00000000000..1ba71c4c2ed
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeagent/PathScope.java
@@ -0,0 +1,57 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.node.admin.nodeagent;
+
+import com.yahoo.vespa.hosted.node.admin.task.util.file.UnixUser;
+import com.yahoo.vespa.hosted.node.admin.task.util.fs.ContainerFileSystem;
+import com.yahoo.vespa.hosted.node.admin.task.util.fs.ContainerPath;
+
+import java.nio.file.Path;
+import java.util.Objects;
+
+/**
+ * @author freva
+ */
+public class PathScope {
+
+ private final ContainerFileSystem containerFs;
+ private final String pathToVespaHome;
+ private final UserScope users;
+
+ public PathScope(ContainerFileSystem containerFs, String pathToVespaHome) {
+ this.containerFs = Objects.requireNonNull(containerFs);
+ this.pathToVespaHome = Objects.requireNonNull(pathToVespaHome);
+ this.users = containerFs.getUserPrincipalLookupService().userScope();
+ }
+
+ public ContainerPath of(String pathInNode) {
+ return of(pathInNode, users.root());
+ }
+
+ public ContainerPath of(String pathInNode, UnixUser user) {
+ return ContainerPath.fromPathInContainer(containerFs, Path.of(pathInNode), user);
+ }
+
+ public ContainerPath underVespaHome(String relativePath) {
+ if (relativePath.startsWith("/"))
+ throw new IllegalArgumentException("Expected a relative path to the Vespa home, got: " + relativePath);
+
+ return ContainerPath.fromPathInContainer(containerFs, Path.of(pathToVespaHome, relativePath), users.vespa());
+ }
+
+ public ContainerPath fromPathOnHost(Path pathOnHost) {
+ return ContainerPath.fromPathOnHost(containerFs, pathOnHost, users.root());
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ PathScope pathScope = (PathScope) o;
+ return containerFs.equals(pathScope.containerFs) && pathToVespaHome.equals(pathScope.pathToVespaHome) && users.equals(pathScope.users);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(containerFs, pathToVespaHome, users);
+ }
+}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
index cd020d81450..42661bdfdd0 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainerTest.java
@@ -9,8 +9,8 @@ import com.yahoo.vespa.hosted.node.admin.maintenance.disk.DiskCleanup;
import com.yahoo.vespa.hosted.node.admin.maintenance.sync.SyncClient;
import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContext;
import com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentContextImpl;
-import com.yahoo.vespa.hosted.node.admin.task.util.file.FileFinder;
import com.yahoo.vespa.hosted.node.admin.task.util.file.DiskSize;
+import com.yahoo.vespa.hosted.node.admin.task.util.file.FileFinder;
import com.yahoo.vespa.hosted.node.admin.task.util.fs.ContainerPath;
import com.yahoo.vespa.hosted.node.admin.task.util.process.TestTerminal;
import com.yahoo.vespa.test.file.TestFileSystem;
@@ -76,7 +76,7 @@ public class StorageMaintainerTest {
Path pathToArchiveDir = fileSystem.getPath("/data/vespa/storage/container-archive");
Files.createDirectories(pathToArchiveDir);
- Path containerStorageRoot = context1.containerPath("/").pathOnHost().getParent();
+ Path containerStorageRoot = context1.paths().of("/").pathOnHost().getParent();
Set<String> containerStorageRootContentsBeforeArchive = FileFinder.from(containerStorageRoot)
.maxDepth(1)
.stream()
@@ -115,9 +115,9 @@ public class StorageMaintainerTest {
NodeAgentContext context = NodeAgentContextImpl.builder(containerName + ".domain.tld")
.fileSystem(fileSystem).build();
- ContainerPath containerVespaHome = context.containerPathUnderVespaHome("");
- Files.createDirectories(context.containerPath("/etc/something"));
- Files.createFile(context.containerPath("/etc/something/conf"));
+ ContainerPath containerVespaHome = context.paths().underVespaHome("");
+ Files.createDirectories(context.paths().of("/etc/something"));
+ Files.createFile(context.paths().of("/etc/something/conf"));
Files.createDirectories(containerVespaHome.resolve("logs/vespa"));
Files.createFile(containerVespaHome.resolve("logs/vespa/vespa.log"));
@@ -126,7 +126,7 @@ public class StorageMaintainerTest {
Files.createDirectories(containerVespaHome.resolve("var/db"));
Files.createFile(containerVespaHome.resolve("var/db/some-file"));
- ContainerPath containerRoot = context.containerPath("/");
+ ContainerPath containerRoot = context.paths().of("/");
Set<String> actualContents = FileFinder.files(containerRoot)
.stream()
.map(fileAttributes -> containerRoot.relativize(fileAttributes.path()).toString())
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java
index ded99cf3778..ed45768aec8 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoreCollectorTest.java
@@ -31,7 +31,7 @@ public class CoreCollectorTest {
private final NodeAgentContext context = NodeAgentContextImpl.builder("container-123.domain.tld")
.fileSystem(TestFileSystem.create()).build();
- private final ContainerPath TEST_CORE_PATH = context.containerPath("/tmp/core.1234");
+ private final ContainerPath TEST_CORE_PATH = context.paths().of("/tmp/core.1234");
private final String TEST_BIN_PATH = "/usr/bin/program";
private final List<String> GDB_BACKTRACE = List.of("[New Thread 2703]",
"Core was generated by `/usr/bin/program\'.", "Program terminated with signal 11, Segmentation fault.",
@@ -182,7 +182,7 @@ public class CoreCollectorTest {
@Test
public void metadata_for_java_heap_dump() {
- assertEquals(JAVA_HEAP_DUMP_METADATA, coreCollector.collect(context, context.containerPath("/dump_java_pid123.hprof")));
+ assertEquals(JAVA_HEAP_DUMP_METADATA, coreCollector.collect(context, context.paths().of("/dump_java_pid123.hprof")));
}
private void mockExec(String[] cmd, String output) {
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java
index 9f507f451b9..5371d69ecda 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/maintenance/coredump/CoredumpHandlerTest.java
@@ -48,7 +48,7 @@ public class CoredumpHandlerTest {
private final FileSystem fileSystem = TestFileSystem.create();
private final NodeAgentContext context = NodeAgentContextImpl.builder("container-123.domain.tld")
.fileSystem(fileSystem).build();
- private final ContainerPath containerCrashPath = context.containerPath("/var/crash");
+ private final ContainerPath containerCrashPath = context.paths().of("/var/crash");
private final Path doneCoredumpsPath = fileSystem.getPath("/home/docker/dumps");
private final TestTerminal terminal = new TestTerminal();
@@ -64,8 +64,8 @@ public class CoredumpHandlerTest {
@Test
public void coredump_enqueue_test() throws IOException {
- ContainerPath crashPath = context.containerPath("/some/crash/path");
- ContainerPath processingDir = context.containerPath("/some/other/processing");
+ ContainerPath crashPath = context.paths().of("/some/crash/path");
+ ContainerPath processingDir = context.paths().of("/some/other/processing");
Files.createDirectories(crashPath);
createFileAged(crashPath.resolve("bash.core.431"), Duration.ZERO);
@@ -98,8 +98,8 @@ public class CoredumpHandlerTest {
@Test
public void enqueue_with_hs_err_files() throws IOException {
- ContainerPath crashPath = context.containerPath("/some/crash/path");
- ContainerPath processingDir = context.containerPath("/some/other/processing");
+ ContainerPath crashPath = context.paths().of("/some/crash/path");
+ ContainerPath processingDir = context.paths().of("/some/other/processing");
Files.createDirectories(crashPath);
createFileAged(crashPath.resolve("java.core.69"), Duration.ofSeconds(515));
@@ -119,7 +119,7 @@ public class CoredumpHandlerTest {
@Test
public void coredump_to_process_test() throws IOException {
- ContainerPath processingDir = context.containerPath("/some/other/processing");
+ ContainerPath processingDir = context.paths().of("/some/other/processing");
// Initially there are no core dumps
Optional<ContainerPath> enqueuedPath = coredumpHandler.enqueueCoredump(containerCrashPath, processingDir);
@@ -164,7 +164,7 @@ public class CoredumpHandlerTest {
"}}";
- ContainerPath coredumpDirectory = context.containerPath("/var/crash/id-123");
+ ContainerPath coredumpDirectory = context.paths().of("/var/crash/id-123");
Files.createDirectories(coredumpDirectory.pathOnHost());
Files.createFile(coredumpDirectory.resolve("dump_core.456"));
when(coreCollector.collect(eq(context), eq(coredumpDirectory.resolve("dump_core.456"))))
@@ -180,12 +180,12 @@ public class CoredumpHandlerTest {
@Test(expected = IllegalStateException.class)
public void cant_get_metadata_if_no_core_file() throws IOException {
- coredumpHandler.getMetadata(context, context.containerPath("/fake/path"), Map::of);
+ coredumpHandler.getMetadata(context, context.paths().of("/fake/path"), Map::of);
}
@Test(expected = IllegalStateException.class)
public void fails_to_get_core_file_if_only_compressed() throws IOException {
- ContainerPath coredumpDirectory = context.containerPath("/path/to/coredump/proccessing/id-123");
+ ContainerPath coredumpDirectory = context.paths().of("/path/to/coredump/proccessing/id-123");
Files.createDirectories(coredumpDirectory);
Files.createFile(coredumpDirectory.resolve("dump_bash.core.431.lz4"));
coredumpHandler.findCoredumpFileInProcessingDirectory(coredumpDirectory);
@@ -193,7 +193,7 @@ public class CoredumpHandlerTest {
@Test
public void process_single_coredump_test() throws IOException {
- ContainerPath coredumpDirectory = context.containerPath("/path/to/coredump/proccessing/id-123");
+ ContainerPath coredumpDirectory = context.paths().of("/path/to/coredump/proccessing/id-123");
Files.createDirectories(coredumpDirectory);
Files.write(coredumpDirectory.resolve("metadata.json"), "metadata".getBytes());
Files.createFile(coredumpDirectory.resolve("dump_bash.core.431"));
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImplTest.java
index f632a5c2bd2..9a6a358d9f0 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImplTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeagent/NodeAgentContextImplTest.java
@@ -26,54 +26,54 @@ public class NodeAgentContextImplTest {
public void path_on_host_from_path_in_node_test() {
assertEquals(
"/data/vespa/storage/container-1",
- context.containerPath("/").pathOnHost().toString());
+ context.paths().of("/").pathOnHost().toString());
assertEquals(
"/data/vespa/storage/container-1/dev/null",
- context.containerPath("/dev/null").pathOnHost().toString());
+ context.paths().of("/dev/null").pathOnHost().toString());
}
@Test(expected=IllegalArgumentException.class)
public void path_in_container_must_be_absolute() {
- context.containerPath("some/relative/path");
+ context.paths().of("some/relative/path");
}
@Test
public void path_in_node_from_path_on_host_test() {
assertEquals(
"/dev/null",
- context.containerPathFromPathOnHost(fileSystem.getPath("/data/vespa/storage/container-1/dev/null")).pathInContainer());
+ context.paths().fromPathOnHost(fileSystem.getPath("/data/vespa/storage/container-1/dev/null")).pathInContainer());
}
@Test(expected=IllegalArgumentException.class)
public void path_on_host_must_be_absolute() {
- context.containerPathFromPathOnHost(Path.of("some/relative/path"));
+ context.paths().fromPathOnHost(Path.of("some/relative/path"));
}
@Test(expected=IllegalArgumentException.class)
public void path_on_host_must_be_inside_container_storage_of_context() {
- context.containerPathFromPathOnHost(fileSystem.getPath("/data/vespa/storage/container-2/dev/null"));
+ context.paths().fromPathOnHost(fileSystem.getPath("/data/vespa/storage/container-2/dev/null"));
}
@Test(expected=IllegalArgumentException.class)
public void path_on_host_must_be_inside_container_storage() {
- context.containerPathFromPathOnHost(fileSystem.getPath("/home"));
+ context.paths().fromPathOnHost(fileSystem.getPath("/home"));
}
@Test
public void path_under_vespa_host_in_container_test() {
assertEquals(
"/opt/vespa",
- context.containerPathUnderVespaHome("").pathInContainer());
+ context.paths().underVespaHome("").pathInContainer());
assertEquals(
"/opt/vespa/logs/vespa/vespa.log",
- context.containerPathUnderVespaHome("logs/vespa/vespa.log").pathInContainer());
+ context.paths().underVespaHome("logs/vespa/vespa.log").pathInContainer());
}
@Test(expected=IllegalArgumentException.class)
public void path_under_vespa_home_must_be_relative() {
- context.containerPathUnderVespaHome("/home");
+ context.paths().underVespaHome("/home");
}
@Test