1use serde::{Deserialize, Serialize};
6use std::{
7 collections::{BTreeMap, HashMap},
8 fmt,
9};
10
11pub const CPU_DEFAULT: u32 = 2;
13pub const MEM_DEFAULT: u32 = 1024;
15pub const DISK_DEFAULT: u32 = 40 * 1024;
17
18pub type CliId = String;
20pub type CliIdRef = str;
22pub type EnvId = String;
24pub type EnvIdRef = str;
26
27pub type VmId = i32;
29pub type Pid = u32;
30
31pub const SSH_PORT: u16 = 22;
33pub const TTREXEC_PORT: u16 = 22000;
35
36#[derive(Clone, Default, Debug, Deserialize, Serialize)]
38pub struct Ipv4 {
39 addr: String,
40}
41
42impl Ipv4 {
43 pub fn new(addr: String) -> Ipv4 {
45 Ipv4 { addr }
46 }
47
48 pub fn as_str(&self) -> &str {
50 self.addr.as_str()
51 }
52}
53
54impl fmt::Display for Ipv4 {
55 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56 write!(f, "{}", &self.addr)
57 }
58}
59
60pub type Port = u16;
62pub type VmPort = Port;
64pub type PubPort = Port;
66
67#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
75#[non_exhaustive]
76#[allow(missing_docs)]
77#[serde(untagged)]
78pub enum VmKind {
79 Qemu,
80 Bhyve,
81 FireCracker,
82 Unknown,
83}
84
85impl fmt::Display for VmKind {
86 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87 match self {
88 VmKind::Qemu => write!(f, "Qemu"),
89 VmKind::Bhyve => write!(f, "Bhyve"),
90 VmKind::FireCracker => write!(f, "FireCracker"),
91 _ => write!(f, "Unknown"),
92 }
93 }
94}
95
96#[cfg(target_os = "linux")]
97impl Default for VmKind {
98 fn default() -> VmKind {
99 VmKind::Qemu
100 }
101}
102
103#[cfg(target_os = "freebsd")]
104impl Default for VmKind {
105 fn default() -> VmKind {
106 VmKind::Bhyve
107 }
108}
109
110#[cfg(not(any(target_os = "linux", target_os = "freebsd")))]
111impl Default for VmKind {
112 fn default() -> VmKind {
113 VmKind::Unknown
114 }
115}
116
117#[derive(Clone, Debug, Deserialize, Serialize)]
119pub struct EnvMeta {
120 pub id: EnvId,
122 pub start_timestamp: u64,
124 pub end_timestamp: u64,
126 pub vm_cnt: usize,
128 pub is_stopped: bool,
131}
132
133#[derive(Clone, Debug, Deserialize, Serialize)]
135pub struct EnvInfo {
136 pub id: EnvId,
138 pub start_timestamp: u64,
140 pub end_timestamp: u64,
142 pub vm: BTreeMap<VmId, VmInfo>,
144 pub is_stopped: bool,
147}
148
149#[derive(Clone, Debug, Deserialize, Serialize)]
151pub struct VmInfo {
152 pub os: String,
154 pub cpu_num: u32,
156 pub mem_size: u32,
158 pub disk_size: u32,
160 pub ip: Ipv4,
162 pub port_map: HashMap<VmPort, PubPort>,
164}