diff --git a/dragonfly-client-config/src/dfcache.rs b/dragonfly-client-config/src/dfcache.rs new file mode 100644 index 00000000..17752b71 --- /dev/null +++ b/dragonfly-client-config/src/dfcache.rs @@ -0,0 +1,25 @@ +/* + * Copyright 2024 The Dragonfly Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use std::path::PathBuf; + +// NAME is the name of dfcache. +pub const NAME: &str = "dfcache"; + +// default_dfcache_log_dir is the default log directory for dfcache. +pub fn default_dfcache_log_dir() -> PathBuf { + crate::default_log_dir().join(NAME) +} diff --git a/dragonfly-client-config/src/lib.rs b/dragonfly-client-config/src/lib.rs index 5c976885..c7a5fae6 100644 --- a/dragonfly-client-config/src/lib.rs +++ b/dragonfly-client-config/src/lib.rs @@ -16,6 +16,7 @@ use std::path::PathBuf; +pub mod dfcache; pub mod dfdaemon; pub mod dfget; pub mod dfinit; diff --git a/dragonfly-client/Cargo.toml b/dragonfly-client/Cargo.toml index 1aaf73c9..648e7084 100644 --- a/dragonfly-client/Cargo.toml +++ b/dragonfly-client/Cargo.toml @@ -23,6 +23,10 @@ path = "src/bin/dfget/main.rs" name = "dfstore" path = "src/bin/dfstore/main.rs" +[[bin]] +name = "dfcache" +path = "src/bin/dfcache/main.rs" + [dependencies] dragonfly-client-core.workspace = true dragonfly-client-config.workspace = true diff --git a/dragonfly-client/Dockerfile b/dragonfly-client/Dockerfile index 0d117302..98f15f8e 100644 --- a/dragonfly-client/Dockerfile +++ b/dragonfly-client/Dockerfile @@ -32,7 +32,7 @@ COPY dragonfly-client-util/src ./dragonfly-client-util/src COPY dragonfly-client-init/Cargo.toml ./dragonfly-client-init/Cargo.toml COPY dragonfly-client-init/src ./dragonfly-client-init/src -RUN cargo build --release --verbose --bin dfget --bin dfdaemon --bin dfstore +RUN cargo build --release --verbose --bin dfget --bin dfdaemon --bin dfstore --bin dfcache FROM alpine:3.17 as health @@ -61,6 +61,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends wget curl \ COPY --from=builder /app/client/target/release/dfget /usr/local/bin/dfget COPY --from=builder /app/client/target/release/dfdaemon /usr/local/bin/dfdaemon COPY --from=builder /app/client/target/release/dfstore /usr/local/bin/dfstore +COPY --from=builder /app/client/target/release/dfcache /usr/local/bin/dfcache COPY --from=health /bin/grpc_health_probe /bin/grpc_health_probe COPY --from=pprof /go/bin/pprof /bin/pprof diff --git a/dragonfly-client/src/bin/dfcache/main.rs b/dragonfly-client/src/bin/dfcache/main.rs new file mode 100644 index 00000000..74938b39 --- /dev/null +++ b/dragonfly-client/src/bin/dfcache/main.rs @@ -0,0 +1,144 @@ +/* + * Copyright 2024 The Dragonfly Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use clap::{Parser, Subcommand}; +use dragonfly_client::tracing::init_tracing; +use dragonfly_client_config::{dfcache, dfdaemon}; +use std::path::PathBuf; +use tracing::Level; + +#[derive(Debug, Parser)] +#[command( + name = dfcache::NAME, + author, + version, + about = "dfcache is a cache command line based on P2P technology in Dragonfly.", + long_about = "A cache command line based on P2P technology in Dragonfly that can import file and export file in P2P network, \ + and it can copy multiple replicas during import. P2P cache is effectively used for fast read and write cache." +)] +struct Args { + #[arg( + short = 'e', + long = "endpoint", + default_value_os_t = dfdaemon::default_download_unix_socket_path(), + help = "Endpoint of dfdaemon's GRPC server" + )] + endpoint: PathBuf, + + #[arg( + short = 'l', + long, + default_value = "info", + help = "Specify the logging level [trace, debug, info, warn, error]" + )] + log_level: Level, + + #[arg( + long, + default_value_os_t = dfcache::default_dfcache_log_dir(), + help = "Specify the log directory" + )] + log_dir: PathBuf, + + #[arg( + long, + default_value_t = 6, + help = "Specify the max number of log files" + )] + log_max_files: usize, + + #[arg( + long = "verbose", + default_value_t = false, + help = "Specify whether to print log" + )] + verbose: bool, + + #[command(subcommand)] + command: Command, +} + +#[derive(Debug, Clone, Subcommand)] +#[command()] +pub enum Command { + #[command( + name = "import", + author, + version, + about = "Import a file into Dragonfly P2P network", + long_about = "Import a local file into Dragonfly P2P network and copy multiple replicas during import. If import successfully, it will return a task ID." + )] + Import(ImportCommand), + + #[command( + name = "export", + author, + version, + about = "Export a file from Dragonfly P2P network", + long_about = "Export a file from Dragonfly P2P network by task ID. If export successfully, it will return the local file path." + )] + Export(ExportCommand), + + #[command( + name = "stat", + author, + version, + about = "Stat a file in Dragonfly P2P network", + long_about = "Stat a file in Dragonfly P2P network by task ID. If stat successfully, it will return the file information." + )] + Stat(StatCommand), + + #[command( + name = "rm", + author, + version, + about = "Remove a file from Dragonfly P2P network", + long_about = "Remove the P2P cache in Dragonfly P2P network by task ID." + )] + Remove(RemoveCommand), +} + +// ImportCommand is the subcommand of import. +#[derive(Debug, Clone, Parser)] +pub struct ImportCommand {} + +// ExportCommand is the subcommand of export. +#[derive(Debug, Clone, Parser)] +pub struct ExportCommand {} + +// StatCommand is the subcommand of stat. +#[derive(Debug, Clone, Parser)] +pub struct StatCommand {} + +// RemoveCommand is the subcommand of remove. +#[derive(Debug, Clone, Parser)] +pub struct RemoveCommand {} + +fn main() { + // Parse command line arguments. + let args = Args::parse(); + + // Initialize tracing. + let _guards = init_tracing( + dfcache::NAME, + &args.log_dir, + args.log_level, + args.log_max_files, + None, + false, + args.verbose, + ); +}