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}