Skip to main content

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
26#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
27#[serde(rename_all = "camelCase")]
28pub struct SimulationDriverConfig {
29    pub args: Option<Vec<String>>,
30    pub image: String,
31    pub namespace: String,
32    pub port: i32,
33    pub secrets: Option<Vec<String>>,
34    pub trace_path: String,
35    #[serde(default = "default_ns_prefix")]
36    pub virtual_ns_prefix: String,
37    #[serde(default = "default_cert_issuer")]
38    pub cert_manager_issuer: String,
39}
40
41#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
42#[serde(rename_all = "camelCase")]
43pub struct SimulationMetricsConfig {
44    pub namespace: Option<String>,
45    pub service_account: Option<String>,
46    pub prometheus_shards: Option<i32>,
47    pub pod_monitor_names: Option<Vec<String>>,
48    pub pod_monitor_namespaces: Option<Vec<String>>,
49    pub service_monitor_names: Option<Vec<String>>,
50    pub service_monitor_namespaces: Option<Vec<String>>,
51    pub remote_write_configs: Vec<PrometheusRemoteWrite>,
52}
53
54#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
55#[serde(rename_all = "camelCase")]
56pub struct SimulationHook {
57    pub cmd: String,
58    pub args: Option<Vec<String>>,
59    pub send_sim: Option<bool>,
60    pub ignore_failure: Option<bool>,
61}
62
63#[derive(Clone, Debug, Default, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
64#[serde(rename_all = "camelCase")]
65pub struct SimulationHooksConfig {
66    pub pre_start_hooks: Option<Vec<SimulationHook>>,
67    pub pre_run_hooks: Option<Vec<SimulationHook>>,
68    pub post_run_hooks: Option<Vec<SimulationHook>>,
69    pub post_stop_hooks: Option<Vec<SimulationHook>>,
70}
71
72#[derive(Clone, CustomResource, Debug, Default, Deserialize, JsonSchema, Serialize)]
73#[kube(group = "simkube.io", version = "v1", kind = "Simulation")]
74#[kube(shortname = "sim", shortname = "sims")]
75#[kube(status = "SimulationStatus")]
76#[kube(
77    printcolumn = r#"{"name":"start time", "type":"string", "description":"simulation driver start time", "jsonPath":".status.startTime"}"#,
78    printcolumn = r#"{"name":"end time", "type":"string", "description":"simulation driver end time", "jsonPath":".status.endTime"}"#,
79    printcolumn = r#"{"name":"speed factor", "type":"number", "description":"multiplicative speed factor for the simulations", "jsonPath":".spec.speed"}"#,
80    printcolumn = r#"{"name":"completed", "type":"integer", "description":"number of completed simulation runs", "jsonPath":".status.completedRuns"}"#,
81    printcolumn = r#"{"name":"total", "type":"integer", "description":"total number of simulation runs", "jsonPath":".spec.repetitions"}"#,
82    printcolumn = r#"{"name":"state", "type":"string", "description":"simulation state", "jsonPath":".status.state"}"#
83)]
84#[serde(rename_all = "camelCase")]
85pub struct SimulationSpec {
86    // Required fields
87    pub driver: SimulationDriverConfig,
88
89    // Optional fields
90    pub metrics: Option<SimulationMetricsConfig>,
91    pub duration: Option<String>,
92    pub repetitions: Option<i32>,
93    pub speed: Option<f64>,
94    pub paused_time: Option<DateTime<Utc>>,
95    pub hooks: Option<SimulationHooksConfig>,
96}
97
98#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
99#[serde(rename_all = "camelCase")]
100pub struct SimulationStatus {
101    pub observed_generation: i64,
102
103    pub state: Option<SimulationState>,
104    pub start_time: Option<DateTime<Utc>>,
105    pub end_time: Option<DateTime<Utc>>,
106    pub completed_runs: Option<u64>,
107}
108
109impl Simulation {
110    pub fn speed(&self) -> f64 {
111        self.spec.speed.unwrap_or(1.0)
112    }
113}
114
115fn default_ns_prefix() -> String {
116    "virtual".into()
117}
118
119fn default_cert_issuer() -> String {
120    "selfsigned".into()
121}