feat(tvix/store): initial dummy implementation
This replaces the hello world example from tvix-store with an actual gRPC endpoint, implementing all of BlobService, DirectoryService and PathInfoService. All RPC methods currently respond with the unimplemented gRPC status. Co-Authored-By: Márton Boros <martonboros@gmail.com> Change-Id: Ieba333cca44dc1e3f2ffbe676ba7a99e672b9bfb Reviewed-on: https://cl.tvl.fyi/c/depot/+/7664 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
d22a9c8610
commit
58f5ff2c17
7 changed files with 175 additions and 22 deletions
34
tvix/store/src/dummy_blob_service.rs
Normal file
34
tvix/store/src/dummy_blob_service.rs
Normal file
|
@ -0,0 +1,34 @@
|
|||
use tokio_stream::wrappers::ReceiverStream;
|
||||
|
||||
use crate::proto::blob_service_server::BlobService;
|
||||
use crate::proto::BlobChunk;
|
||||
use crate::proto::BlobMeta;
|
||||
use crate::proto::PutBlobResponse;
|
||||
use crate::proto::ReadBlobRequest;
|
||||
use crate::proto::StatBlobRequest;
|
||||
use tonic::{Request, Response, Result, Status, Streaming};
|
||||
|
||||
pub struct DummyBlobService {}
|
||||
|
||||
#[tonic::async_trait]
|
||||
impl BlobService for DummyBlobService {
|
||||
type ReadStream = ReceiverStream<Result<BlobChunk>>;
|
||||
|
||||
async fn stat(&self, _request: Request<StatBlobRequest>) -> Result<Response<BlobMeta>> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
|
||||
async fn read(
|
||||
&self,
|
||||
_request: Request<ReadBlobRequest>,
|
||||
) -> Result<Response<Self::ReadStream>, Status> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
|
||||
async fn put(
|
||||
&self,
|
||||
_request: Request<Streaming<BlobChunk>>,
|
||||
) -> Result<Response<PutBlobResponse>> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
}
|
28
tvix/store/src/dummy_directory_service.rs
Normal file
28
tvix/store/src/dummy_directory_service.rs
Normal file
|
@ -0,0 +1,28 @@
|
|||
use tokio_stream::wrappers::ReceiverStream;
|
||||
|
||||
use crate::proto::directory_service_server::DirectoryService;
|
||||
use crate::proto::Directory;
|
||||
use crate::proto::GetDirectoryRequest;
|
||||
use crate::proto::PutDirectoryResponse;
|
||||
use tonic::{Request, Response, Result, Status, Streaming};
|
||||
|
||||
pub struct DummyDirectoryService {}
|
||||
|
||||
#[tonic::async_trait]
|
||||
impl DirectoryService for DummyDirectoryService {
|
||||
type GetStream = ReceiverStream<Result<Directory>>;
|
||||
|
||||
async fn get(
|
||||
&self,
|
||||
_request: Request<GetDirectoryRequest>,
|
||||
) -> Result<Response<Self::GetStream>, Status> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
|
||||
async fn put(
|
||||
&self,
|
||||
_request: Request<Streaming<Directory>>,
|
||||
) -> Result<Response<PutDirectoryResponse>> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
}
|
26
tvix/store/src/dummy_path_info_service.rs
Normal file
26
tvix/store/src/dummy_path_info_service.rs
Normal file
|
@ -0,0 +1,26 @@
|
|||
use crate::proto::path_info_service_server::PathInfoService;
|
||||
use crate::proto::CalculateNarResponse;
|
||||
use crate::proto::GetPathInfoRequest;
|
||||
use crate::proto::Node;
|
||||
use crate::proto::PathInfo;
|
||||
use tonic::{Request, Response, Result, Status};
|
||||
|
||||
pub struct DummyPathInfoService {}
|
||||
|
||||
#[tonic::async_trait]
|
||||
impl PathInfoService for DummyPathInfoService {
|
||||
async fn get(&self, _request: Request<GetPathInfoRequest>) -> Result<Response<PathInfo>> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
|
||||
async fn put(&self, _request: Request<PathInfo>) -> Result<Response<PathInfo>> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
|
||||
async fn calculate_nar(
|
||||
&self,
|
||||
_request: Request<Node>,
|
||||
) -> Result<Response<CalculateNarResponse>> {
|
||||
Err(Status::unimplemented("not implemented"))
|
||||
}
|
||||
}
|
|
@ -1,3 +1,13 @@
|
|||
use crate::proto::blob_service_server::BlobServiceServer;
|
||||
use crate::proto::directory_service_server::DirectoryServiceServer;
|
||||
use crate::proto::path_info_service_server::PathInfoServiceServer;
|
||||
|
||||
use clap::Parser;
|
||||
use tonic::{transport::Server, Result};
|
||||
|
||||
mod dummy_blob_service;
|
||||
mod dummy_directory_service;
|
||||
mod dummy_path_info_service;
|
||||
mod nixbase32;
|
||||
mod nixpath;
|
||||
mod proto;
|
||||
|
@ -5,6 +15,34 @@ mod proto;
|
|||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
#[derive(Parser)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
struct Cli {
|
||||
#[clap(long, short = 'l')]
|
||||
listen_address: Option<String>,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let cli = Cli::parse();
|
||||
let listen_address = cli
|
||||
.listen_address
|
||||
.unwrap_or("[::]:8000".to_string())
|
||||
.parse()
|
||||
.unwrap();
|
||||
|
||||
let blob_service = dummy_blob_service::DummyBlobService {};
|
||||
let directory_service = dummy_directory_service::DummyDirectoryService {};
|
||||
let path_info_service = dummy_path_info_service::DummyPathInfoService {};
|
||||
|
||||
println!("tvix-store listening on {}", listen_address);
|
||||
|
||||
Server::builder()
|
||||
.add_service(BlobServiceServer::new(blob_service))
|
||||
.add_service(DirectoryServiceServer::new(directory_service))
|
||||
.add_service(PathInfoServiceServer::new(path_info_service))
|
||||
.serve(listen_address)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue