1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use clockabilly::{
    DateTime,
    Utc,
};
use kube::CustomResource;
use schemars::JsonSchema;
use serde::{
    Deserialize,
    Serialize,
};

use crate::prometheus::PrometheusRemoteWrite;

#[derive(Clone, Debug, Deserialize, Eq, JsonSchema, PartialEq, Serialize)]
pub enum SimulationState {
    Blocked,
    Initializing,
    Finished,
    Failed,
    Retrying,
    Running,
}

#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SimulationDriverConfig {
    pub namespace: String,
    pub image: String,
    pub trace_path: String,
    pub port: i32,
}

#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SimulationMetricsConfig {
    pub namespace: Option<String>,
    pub service_account: Option<String>,
    pub prometheus_shards: Option<i32>,
    pub pod_monitor_names: Option<Vec<String>>,
    pub pod_monitor_namespaces: Option<Vec<String>>,
    pub service_monitor_names: Option<Vec<String>>,
    pub service_monitor_namespaces: Option<Vec<String>>,
    pub remote_write_configs: Vec<PrometheusRemoteWrite>,
}

#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SimulationHook {
    pub cmd: String,
    pub args: Vec<String>,
    pub send_sim: Option<bool>,
    pub ignore_failure: Option<bool>,
}

#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SimulationHooksConfig {
    pub pre_start_hooks: Option<Vec<SimulationHook>>,
    pub pre_run_hooks: Option<Vec<SimulationHook>>,
    pub post_run_hooks: Option<Vec<SimulationHook>>,
    pub post_stop_hooks: Option<Vec<SimulationHook>>,
}

#[derive(Clone, CustomResource, Debug, Default, Deserialize, JsonSchema, Serialize)]
#[kube(group = "simkube.io", version = "v1", kind = "Simulation")]
#[kube(shortname = "sim", shortname = "sims")]
#[kube(status = "SimulationStatus")]
#[kube(
    printcolumn = r#"{"name":"start time", "type":"string", "description":"simulation driver start time", "jsonPath":".status.startTime"}"#,
    printcolumn = r#"{"name":"end time", "type":"string", "description":"simulation driver end time", "jsonPath":".status.endTime"}"#,
    printcolumn = r#"{"name":"state", "type":"string", "description":"simulation state", "jsonPath":".status.state"}"#
)]
#[serde(rename_all = "camelCase")]
pub struct SimulationSpec {
    // Required fields
    pub driver: SimulationDriverConfig,

    // Optional fields
    pub metrics: Option<SimulationMetricsConfig>,
    pub duration: Option<String>,
    pub repetitions: Option<i32>,
    pub hooks: Option<SimulationHooksConfig>,
}

#[derive(Clone, Debug, Default, Deserialize, JsonSchema, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SimulationStatus {
    pub observed_generation: i64,
    pub start_time: Option<DateTime<Utc>>,
    pub end_time: Option<DateTime<Utc>>,
    pub state: Option<SimulationState>,
}