sk_api/v1/
simulations.rs

1use clockabilly::{
2    DateTime,
3    Utc,
4};
5use kube::CustomResource;
6use schemars::JsonSchema;
7use serde::{
8    Deserialize,
9    Serialize,
10};
11
12use crate::prometheus::PrometheusRemoteWrite;
13
14#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
15pub enum SimulationState {
16    Blocked,
17    Initializing,
18    Finished,
19    Failed,
20    Paused,
21    Retrying,
22    Running,
23}
24
25#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
26#[serde(rename_all = "camelCase")]
27pub struct SimulationDriverConfig {
28    pub namespace: String,
29    pub image: String,
30    pub trace_path: String,
31    pub port: i32,
32    pub args: Option<Vec<String>>,
33}
34
35#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
36#[serde(rename_all = "camelCase")]
37pub struct SimulationMetricsConfig {
38    pub namespace: Option<String>,
39    pub service_account: Option<String>,
40    pub prometheus_shards: Option<i32>,
41    pub pod_monitor_names: Option<Vec<String>>,
42    pub pod_monitor_namespaces: Option<Vec<String>>,
43    pub service_monitor_names: Option<Vec<String>>,
44    pub service_monitor_namespaces: Option<Vec<String>>,
45    pub remote_write_configs: Vec<PrometheusRemoteWrite>,
46}
47
48#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
49#[serde(rename_all = "camelCase")]
50pub struct SimulationHook {
51    pub cmd: String,
52    pub args: Option<Vec<String>>,
53    pub send_sim: Option<bool>,
54    pub ignore_failure: Option<bool>,
55}
56
57#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
58#[serde(rename_all = "camelCase")]
59pub struct SimulationHooksConfig {
60    pub pre_start_hooks: Option<Vec<SimulationHook>>,
61    pub pre_run_hooks: Option<Vec<SimulationHook>>,
62    pub post_run_hooks: Option<Vec<SimulationHook>>,
63    pub post_stop_hooks: Option<Vec<SimulationHook>>,
64}
65
66#[derive(Clone, CustomResource, Debug, Default, Deserialize, JsonSchema, Serialize)]
67#[kube(group = "simkube.io", version = "v1", kind = "Simulation")]
68#[kube(shortname = "sim", shortname = "sims")]
69#[kube(status = "SimulationStatus")]
70#[kube(
71    printcolumn = r#"{"name":"start time", "type":"string", "description":"simulation driver start time", "jsonPath":".status.startTime"}"#,
72    printcolumn = r#"{"name":"end time", "type":"string", "description":"simulation driver end time", "jsonPath":".status.endTime"}"#,
73    printcolumn = r#"{"name":"speed factor", "type":"number", "description":"multiplicative speed factor for the simulations", "jsonPath":".spec.speed"}"#,
74    printcolumn = r#"{"name":"completed", "type":"integer", "description":"number of completed simulation runs", "jsonPath":".status.completedRuns"}"#,
75    printcolumn = r#"{"name":"total", "type":"integer", "description":"total number of simulation runs", "jsonPath":".spec.repetitions"}"#,
76    printcolumn = r#"{"name":"state", "type":"string", "description":"simulation state", "jsonPath":".status.state"}"#
77)]
78#[serde(rename_all = "camelCase")]
79pub struct SimulationSpec {
80    // Required fields
81    pub driver: SimulationDriverConfig,
82
83    // Optional fields
84    pub metrics: Option<SimulationMetricsConfig>,
85    pub duration: Option<String>,
86    pub repetitions: Option<i32>,
87    pub speed: Option<f64>,
88    pub paused_time: Option<DateTime<Utc>>,
89    pub hooks: Option<SimulationHooksConfig>,
90}
91
92#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
93#[serde(rename_all = "camelCase")]
94pub struct SimulationStatus {
95    pub observed_generation: i64,
96
97    pub state: Option<SimulationState>,
98    pub start_time: Option<DateTime<Utc>>,
99    pub end_time: Option<DateTime<Utc>>,
100    pub completed_runs: Option<u64>,
101}
102
103impl Simulation {
104    pub fn speed(&self) -> f64 {
105        self.spec.speed.unwrap_or(1.0)
106    }
107}