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    Retrying,
21    Running,
22}
23
24#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
25#[serde(rename_all = "camelCase")]
26pub struct SimulationDriverConfig {
27    pub namespace: String,
28    pub image: String,
29    pub trace_path: String,
30    pub port: i32,
31    pub speed: f64,
32}
33
34#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
35#[serde(rename_all = "camelCase")]
36pub struct SimulationMetricsConfig {
37    pub namespace: Option<String>,
38    pub service_account: Option<String>,
39    pub prometheus_shards: Option<i32>,
40    pub pod_monitor_names: Option<Vec<String>>,
41    pub pod_monitor_namespaces: Option<Vec<String>>,
42    pub service_monitor_names: Option<Vec<String>>,
43    pub service_monitor_namespaces: Option<Vec<String>>,
44    pub remote_write_configs: Vec<PrometheusRemoteWrite>,
45}
46
47#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
48#[serde(rename_all = "camelCase")]
49pub struct SimulationHook {
50    pub cmd: String,
51    pub args: Vec<String>,
52    pub send_sim: Option<bool>,
53    pub ignore_failure: Option<bool>,
54}
55
56#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
57#[serde(rename_all = "camelCase")]
58pub struct SimulationHooksConfig {
59    pub pre_start_hooks: Option<Vec<SimulationHook>>,
60    pub pre_run_hooks: Option<Vec<SimulationHook>>,
61    pub post_run_hooks: Option<Vec<SimulationHook>>,
62    pub post_stop_hooks: Option<Vec<SimulationHook>>,
63}
64
65#[derive(Clone, CustomResource, Debug, Default, Deserialize, JsonSchema, Serialize)]
66#[kube(group = "simkube.io", version = "v1", kind = "Simulation")]
67#[kube(shortname = "sim", shortname = "sims")]
68#[kube(status = "SimulationStatus")]
69#[kube(
70    printcolumn = r#"{"name":"start time", "type":"string", "description":"simulation driver start time", "jsonPath":".status.startTime"}"#,
71    printcolumn = r#"{"name":"end time", "type":"string", "description":"simulation driver end time", "jsonPath":".status.endTime"}"#,
72    printcolumn = r#"{"name":"state", "type":"string", "description":"simulation state", "jsonPath":".status.state"}"#
73)]
74#[serde(rename_all = "camelCase")]
75pub struct SimulationSpec {
76    // Required fields
77    pub driver: SimulationDriverConfig,
78
79    // Optional fields
80    pub metrics: Option<SimulationMetricsConfig>,
81    pub duration: Option<String>,
82    pub repetitions: Option<i32>,
83    pub hooks: Option<SimulationHooksConfig>,
84}
85
86#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
87#[serde(rename_all = "camelCase")]
88pub struct SimulationStatus {
89    pub observed_generation: i64,
90    pub start_time: Option<DateTime<Utc>>,
91    pub end_time: Option<DateTime<Utc>>,
92    pub state: Option<SimulationState>,
93}