summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@yahooinc.com>2021-10-20 12:27:24 +0200
committerValerij Fredriksen <valerijf@yahooinc.com>2021-10-20 12:27:24 +0200
commit256b796cec421a1403f913ee18dddcc4add7696d (patch)
tree81da101d341a6097e92a7891729389fba04fc478 /node-admin
parent074a54b2bad8c28de2cef2abda860a5e2064fdb1 (diff)
Create container FS root directory on node agent start
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystem.java20
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java18
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerPath.java8
3 files changed, 29 insertions, 17 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystem.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystem.java
index cda806f533a..0f2ff3147b6 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystem.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystem.java
@@ -7,23 +7,30 @@ import com.yahoo.vespa.hosted.node.admin.nodeagent.VespaUser;
import java.io.IOException;
import java.nio.file.FileStore;
import java.nio.file.FileSystem;
-import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.WatchService;
import java.util.Set;
-import static com.yahoo.yolean.Exceptions.uncheck;
-
/**
* @author valerijf
*/
public class ContainerFileSystem extends FileSystem {
private final ContainerFileSystemProvider containerFsProvider;
+ private final Path containerRootOnHost;
- ContainerFileSystem(ContainerFileSystemProvider containerFsProvider) {
+ ContainerFileSystem(ContainerFileSystemProvider containerFsProvider, Path containerRootOnHost) {
this.containerFsProvider = containerFsProvider;
+ this.containerRootOnHost = containerRootOnHost;
+ }
+
+ public Path containerRootOnHost() {
+ return containerRootOnHost;
+ }
+
+ public void createRoot() {
+ provider().createFileSystemRoot();
}
@Override
@@ -87,7 +94,8 @@ public class ContainerFileSystem extends FileSystem {
}
public static ContainerFileSystem create(Path containerStorageRoot, UserNamespace userNamespace, VespaUser vespaUser) {
- uncheck(() -> Files.createDirectories(containerStorageRoot));
- return new ContainerFileSystemProvider(containerStorageRoot, userNamespace, vespaUser).getFileSystem(null);
+ ContainerFileSystem containerFs = new ContainerFileSystemProvider(containerStorageRoot, userNamespace, vespaUser).getFileSystem(null);
+ containerFs.createRoot();
+ return containerFs;
}
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java
index 4acbd84afaa..00dda1d7cd2 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerFileSystemProvider.java
@@ -44,17 +44,11 @@ import static com.yahoo.yolean.Exceptions.uncheck;
class ContainerFileSystemProvider extends FileSystemProvider {
private final ContainerFileSystem containerFs;
private final ContainerUserPrincipalLookupService userPrincipalLookupService;
- private final Path containerRootOnHost;
ContainerFileSystemProvider(Path containerRootOnHost, UserNamespace userNamespace, VespaUser vespaUser) {
- this.containerFs = new ContainerFileSystem(this);
+ this.containerFs = new ContainerFileSystem(this, containerRootOnHost);
this.userPrincipalLookupService = new ContainerUserPrincipalLookupService(
containerRootOnHost.getFileSystem().getUserPrincipalLookupService(), userNamespace, vespaUser);
- this.containerRootOnHost = containerRootOnHost;
- }
-
- public Path containerRootOnHost() {
- return containerRootOnHost;
}
public ContainerUserPrincipalLookupService userPrincipalLookupService() {
@@ -226,6 +220,16 @@ class ContainerFileSystemProvider extends FileSystemProvider {
return value;
}
+ void createFileSystemRoot() {
+ ContainerPath root = containerFs.getPath("/");
+ if (!Files.exists(root)) {
+ uncheck(() -> {
+ Files.createDirectories(root.pathOnHost());
+ fixOwnerToContainerRoot(root);
+ });
+ }
+ }
+
private void fixOwnerToContainerRoot(ContainerPath path) throws IOException {
setAttribute(path, "unix:uid", 0);
setAttribute(path, "unix:gid", 0);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerPath.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerPath.java
index 15295ffd087..853646d53b5 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerPath.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/fs/ContainerPath.java
@@ -32,7 +32,7 @@ public class ContainerPath implements Path {
if (!pathOnHost.isAbsolute())
throw new IllegalArgumentException("Path host must be absolute: " + pathOnHost);
- Path containerRootOnHost = containerFs.provider().containerRootOnHost();
+ Path containerRootOnHost = containerFs.containerRootOnHost();
if (!pathOnHost.startsWith(containerRootOnHost))
throw new IllegalArgumentException("Path on host (" + pathOnHost + ") must start with container root on host (" + containerRootOnHost + ")");
}
@@ -173,7 +173,7 @@ public class ContainerPath implements Path {
@Override
public String toString() {
- return containerFs.provider().containerRootOnHost().getFileName() + ":" + pathInContainer();
+ return containerFs.containerRootOnHost().getFileName() + ":" + pathInContainer();
}
private static ContainerPath resolve(ContainerFileSystem containerFs, String[] currentParts, Path other) {
@@ -189,7 +189,7 @@ public class ContainerPath implements Path {
}
return new ContainerPath(containerFs,
- containerFs.provider().containerRootOnHost().resolve(String.join("/", parts)),
+ containerFs.containerRootOnHost().resolve(String.join("/", parts)),
parts.toArray(String[]::new));
}
@@ -201,7 +201,7 @@ public class ContainerPath implements Path {
public static ContainerPath fromPathOnHost(ContainerFileSystem containerFs, Path pathOnHost) {
pathOnHost = pathOnHost.normalize();
- Path containerRootOnHost = containerFs.provider().containerRootOnHost();
+ Path containerRootOnHost = containerFs.containerRootOnHost();
Path pathUnderContainerStorage = containerRootOnHost.relativize(pathOnHost);
if (pathUnderContainerStorage.getNameCount() == 0 || pathUnderContainerStorage.getName(0).toString().isEmpty())