diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 21676812..00000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e43b0f98 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/server/pom.xml b/server/pom.xml index 12f5461a..50bf3e91 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.usatiuk.dhfs.storage server @@ -49,6 +50,16 @@ 1.18.32 provided + + com.github.serceman + jnr-fuse + 0.5.7 + + + com.github.jnr + jnr-ffi + 2.2.16 + @@ -100,7 +111,9 @@ - ${project.build.directory}/${project.build.finalName}-runner + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager ${maven.home} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/api/DhfsFileGrpcService.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/api/DhfsFileGrpcService.java new file mode 100644 index 00000000..368f432f --- /dev/null +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/api/DhfsFileGrpcService.java @@ -0,0 +1,27 @@ +package com.usatiuk.dhfs.storage.files.api; + +import io.quarkus.grpc.GrpcService; +import io.smallrye.mutiny.Uni; + +@GrpcService +public class DhfsFileGrpcService implements DhfsFilesGrpc { + @Override + public Uni findFiles(FindFilesRequest request) { + return null; + } + + @Override + public Uni readFile(ReadFileRequest request) { + return null; + } + + @Override + public Uni writeFile(WriteFileRequest request) { + return null; + } + + @Override + public Uni deleteFile(DeleteFileRequest request) { + return null; + } +} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/DirEntry.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/DirEntry.java new file mode 100644 index 00000000..4f653b9d --- /dev/null +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/DirEntry.java @@ -0,0 +1,6 @@ +package com.usatiuk.dhfs.storage.files.objects; + +import java.io.Serializable; + +public class DirEntry implements Serializable { +} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/Directory.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/Directory.java new file mode 100644 index 00000000..53b6d916 --- /dev/null +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/Directory.java @@ -0,0 +1,13 @@ +package com.usatiuk.dhfs.storage.files.objects; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Accessors(chain = true) +@Getter +@Setter +public class Directory extends DirEntry { +} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/File.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/File.java new file mode 100644 index 00000000..3b9d96e9 --- /dev/null +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/objects/File.java @@ -0,0 +1,11 @@ +package com.usatiuk.dhfs.storage.files.objects; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +@Accessors(chain = true) +@Getter +@Setter +public class File extends DirEntry { +} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java new file mode 100644 index 00000000..efd9526e --- /dev/null +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileService.java @@ -0,0 +1,15 @@ +package com.usatiuk.dhfs.storage.files.service; + +import com.usatiuk.dhfs.storage.files.api.*; +import io.smallrye.mutiny.Uni; + +public interface DhfsFileService { + public Uni findFiles(FindFilesRequest request); + + public Uni readFile(ReadFileRequest request) ; + + public Uni writeFile(WriteFileRequest request) ; + + public Uni deleteFile(DeleteFileRequest request) ; + +} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImp.java b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImp.java new file mode 100644 index 00000000..ad29a14e --- /dev/null +++ b/server/src/main/java/com/usatiuk/dhfs/storage/files/service/DhfsFileServiceImp.java @@ -0,0 +1,14 @@ +package com.usatiuk.dhfs.storage.files.service; + +import com.usatiuk.dhfs.storage.objects.repository.ObjectRepository; +import io.vertx.mutiny.core.Vertx; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +@ApplicationScoped +public class DhfsFileServiceImp { + @Inject + Vertx vertx; + @Inject + ObjectRepository objectRepository; +} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java b/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java new file mode 100644 index 00000000..58377915 --- /dev/null +++ b/server/src/main/java/com/usatiuk/dhfs/storage/fuse/DhfsFuse.java @@ -0,0 +1,61 @@ +package com.usatiuk.dhfs.storage.fuse; + +import io.quarkus.logging.Log; +import io.quarkus.runtime.Shutdown; +import io.quarkus.runtime.StartupEvent; +import jakarta.annotation.Priority; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Observes; +import jnr.ffi.Pointer; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import ru.serce.jnrfuse.FuseFillDir; +import ru.serce.jnrfuse.FuseStubFS; +import ru.serce.jnrfuse.struct.FileStat; +import ru.serce.jnrfuse.struct.FuseFileInfo; + +import java.nio.file.Paths; + +@ApplicationScoped +public class DhfsFuse extends FuseStubFS { + @ConfigProperty(name = "dhfs.fuse.root") + String root; + + void init(@Observes @Priority(100000) StartupEvent event) { + Paths.get(root).toFile().mkdirs(); + Log.info("Mounting with root " + root); + + mount(Paths.get(root)); + } + + @Override + public int getattr(String path, FileStat stat) { + return super.getattr(path, stat); + } + + @Override + public int open(String path, FuseFileInfo fi) { + return super.open(path, fi); + } + + @Override + public int read(String path, Pointer buf, long size, long offset, FuseFileInfo fi) { + return super.read(path, buf, size, offset, fi); + } + + @Override + public int write(String path, Pointer buf, long size, long offset, FuseFileInfo fi) { + return super.write(path, buf, size, offset, fi); + } + + @Override + public int readdir(String path, Pointer buf, FuseFillDir filter, long offset, FuseFileInfo fi) { + return super.readdir(path, buf, filter, offset, fi); + } + + @Shutdown + void shutdown() { + Log.info("Unmounting"); + umount(); + Log.info("Unmounted"); + } +} diff --git a/server/src/main/java/com/usatiuk/dhfs/storage/objects/api/DhfsObjectGrpcService.java b/server/src/main/java/com/usatiuk/dhfs/storage/objects/api/DhfsObjectGrpcService.java index 40535493..43eb51ff 100644 --- a/server/src/main/java/com/usatiuk/dhfs/storage/objects/api/DhfsObjectGrpcService.java +++ b/server/src/main/java/com/usatiuk/dhfs/storage/objects/api/DhfsObjectGrpcService.java @@ -1,7 +1,6 @@ package com.usatiuk.dhfs.storage.objects.api; import com.google.protobuf.ByteString; -import com.usatiuk.dhfs.storage.api.*; import com.usatiuk.dhfs.storage.objects.repository.ObjectRepository; import io.quarkus.grpc.GrpcService; import io.smallrye.mutiny.Uni; diff --git a/server/src/main/proto/dhfs_files.proto b/server/src/main/proto/dhfs_files.proto new file mode 100644 index 00000000..d326c1bb --- /dev/null +++ b/server/src/main/proto/dhfs_files.proto @@ -0,0 +1,52 @@ +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "com.usatiuk.dhfs.storage.files.api"; +option java_outer_classname = "DhfsFilesApi"; + +package hello; + +service DhfsFilesGrpc { + rpc FindFiles (FindFilesRequest) returns (FindFilesReply) {} + rpc ReadFile (ReadFileRequest) returns (ReadFileReply) {} + rpc WriteFile (WriteFileRequest) returns (WriteFileReply) {} + rpc DeleteFile (DeleteFileRequest) returns (DeleteFileReply) {} +} + +message FindFilesRequest { + string namespace = 1; + string prefix = 2; +} + +message FindFilesReply { + message FindFilesEntry { + string name = 1; + } + repeated FindFilesEntry found = 1; +} + +message ReadFileRequest { + string namespace = 1; + string name = 2; +} + +message ReadFileReply { + bytes data = 10; +} + +message WriteFileRequest { + string namespace = 1; + string name = 2; + bytes data = 10; +} + +message WriteFileReply { +} + +message DeleteFileRequest { + string namespace = 1; + string name = 2; +} + +message DeleteFileReply { +} diff --git a/server/src/main/proto/dhfs_objects.proto b/server/src/main/proto/dhfs_objects.proto index b22a3136..a6e422b8 100644 --- a/server/src/main/proto/dhfs_objects.proto +++ b/server/src/main/proto/dhfs_objects.proto @@ -2,7 +2,7 @@ syntax = "proto3"; option java_multiple_files = true; option java_package = "com.usatiuk.dhfs.storage.objects.api"; -option java_outer_classname = "DhfsStorageApi"; +option java_outer_classname = "DhfsObjectsApi"; package hello; diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 5f4d7a6b..8ea71926 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -1,2 +1,3 @@ quarkus.grpc.server.use-separate-server=false -dhfs.filerepo.root=${HOME}/dhfs_root \ No newline at end of file +dhfs.filerepo.root=${HOME}/dhfs_data/dhfs_root +dhfs.fuse.root=${HOME}/dhfs_data/dhfs_fuse_root \ No newline at end of file diff --git a/server/src/test/java/com/usatiuk/dhfs/storage/DhfsObjectGrpcService.java b/server/src/test/java/com/usatiuk/dhfs/storage/DhfsObjectGrpcService.java index f1e719c2..beb6e06a 100644 --- a/server/src/test/java/com/usatiuk/dhfs/storage/DhfsObjectGrpcService.java +++ b/server/src/test/java/com/usatiuk/dhfs/storage/DhfsObjectGrpcService.java @@ -1,7 +1,7 @@ package com.usatiuk.dhfs.storage; import com.google.protobuf.ByteString; -import com.usatiuk.dhfs.storage.api.*; +import com.usatiuk.dhfs.storage.objects.api.*; import io.quarkus.grpc.GrpcClient; import io.quarkus.test.junit.QuarkusTest; import org.eclipse.microprofile.config.inject.ConfigProperty; diff --git a/server/src/test/resources/application.properties b/server/src/test/resources/application.properties index a0a22e30..14faacfe 100644 --- a/server/src/test/resources/application.properties +++ b/server/src/test/resources/application.properties @@ -1 +1,2 @@ -dhfs.filerepo.root=${HOME}/dhfs_root_test \ No newline at end of file +dhfs.filerepo.root=${HOME}/dhfs_data/dhfs_root_test +dhfs.fuse.root=${HOME}/dhfs_data/dhfs_fuse_root_test