Skip to main content

execgo_runtime/
cli.rs

1use std::{path::PathBuf, time::Duration};
2
3use clap::{ArgGroup, Args, Parser, Subcommand};
4
5use crate::types::CapabilityMode;
6
7#[derive(Debug, Parser)]
8#[command(name = "execgo-runtime", version, about = "ExecGo runtime data plane")]
9pub struct Cli {
10    #[command(subcommand)]
11    pub command: Command,
12}
13
14#[derive(Debug, Subcommand)]
15pub enum Command {
16    Serve(ServeArgs),
17    Submit(RemoteTaskArgs),
18    Status(StatusArgs),
19    Wait(WaitArgs),
20    Kill(StatusArgs),
21    Run(RemoteTaskArgs),
22    #[command(hide = true, name = "internal-shim")]
23    InternalShim(InternalShimArgs),
24}
25
26#[derive(Debug, Clone, Args)]
27pub struct ServeArgs {
28    #[arg(long, default_value = "127.0.0.1:8080")]
29    pub listen_addr: String,
30    #[arg(long, default_value = "data")]
31    pub data_dir: PathBuf,
32    #[arg(long, default_value = "4")]
33    pub max_running_tasks: usize,
34    #[arg(long, default_value = "128")]
35    pub max_queued_tasks: usize,
36    #[arg(long, default_value = "5000")]
37    pub termination_grace_ms: u64,
38    #[arg(long, default_value = "604800")]
39    pub result_retention_secs: u64,
40    #[arg(long, default_value = "1000")]
41    pub gc_interval_ms: u64,
42    #[arg(long, default_value = "250")]
43    pub dispatch_poll_interval_ms: u64,
44    #[arg(long, default_value = "/sys/fs/cgroup/execgo-runtime")]
45    pub cgroup_root: PathBuf,
46    #[arg(long, env = "EXECGO_RUNTIME_ID")]
47    pub runtime_id: Option<String>,
48    #[arg(
49        long,
50        env = "EXECGO_RUNTIME_DEFAULT_CAPABILITY_MODE",
51        default_value = "adaptive"
52    )]
53    pub default_capability_mode: CapabilityMode,
54    #[arg(
55        long,
56        env = "EXECGO_RUNTIME_DISABLE_LINUX_SANDBOX",
57        default_value_t = false
58    )]
59    pub disable_linux_sandbox: bool,
60    #[arg(long, env = "EXECGO_RUNTIME_DISABLE_CGROUP", default_value_t = false)]
61    pub disable_cgroup: bool,
62    #[arg(long, env = "EXECGO_RUNTIME_CAPACITY_MEMORY_BYTES")]
63    pub capacity_memory_bytes: Option<u64>,
64    #[arg(long, env = "EXECGO_RUNTIME_CAPACITY_PIDS")]
65    pub capacity_pids: Option<u64>,
66}
67
68#[derive(Debug, Clone, Args)]
69#[command(group(
70    ArgGroup::new("input")
71        .required(true)
72        .args(["file", "json"])
73))]
74pub struct RemoteTaskArgs {
75    #[arg(long, default_value = "http://127.0.0.1:8080")]
76    pub server: String,
77    #[arg(long)]
78    pub file: Option<PathBuf>,
79    #[arg(long)]
80    pub json: Option<String>,
81    #[arg(long, default_value = "500")]
82    pub poll_interval_ms: u64,
83    #[arg(long)]
84    pub timeout_ms: Option<u64>,
85}
86
87#[derive(Debug, Clone, Args)]
88pub struct StatusArgs {
89    #[arg(long, default_value = "http://127.0.0.1:8080")]
90    pub server: String,
91    pub task_id: String,
92}
93
94#[derive(Debug, Clone, Args)]
95pub struct WaitArgs {
96    #[arg(long, default_value = "http://127.0.0.1:8080")]
97    pub server: String,
98    pub task_id: String,
99    #[arg(long)]
100    pub timeout_ms: Option<u64>,
101    #[arg(long, default_value = "500")]
102    pub poll_interval_ms: u64,
103}
104
105#[derive(Debug, Clone, Args)]
106pub struct InternalShimArgs {
107    #[arg(long)]
108    pub database: PathBuf,
109    #[arg(long)]
110    pub data_dir: PathBuf,
111    #[arg(long)]
112    pub task_id: String,
113    #[arg(long)]
114    pub termination_grace_ms: u64,
115    #[arg(long)]
116    pub cgroup_root: PathBuf,
117}
118
119impl WaitArgs {
120    pub fn timeout(&self) -> Option<Duration> {
121        self.timeout_ms.map(Duration::from_millis)
122    }
123}