diff options
author | Valerij Fredriksen <valerijf@yahooinc.com> | 2021-10-20 12:27:24 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@yahooinc.com> | 2021-10-20 12:27:24 +0200 |
commit | 256b796cec421a1403f913ee18dddcc4add7696d (patch) | |
tree | 81da101d341a6097e92a7891729389fba04fc478 | |
parent | 074a54b2bad8c28de2cef2abda860a5e2064fdb1 (diff) |
Create container FS root directory on node agent start
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()) |