use kube::CustomResource;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum ClusterMode {
#[default]
Cluster,
Stateless,
}
#[derive(CustomResource, Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[kube(
group = "boatramp.dev",
version = "v1alpha1",
kind = "BoatRampCluster",
plural = "boatrampclusters",
shortname = "brc",
namespaced,
status = "BoatRampClusterStatus",
printcolumn = r#"{"name":"Mode","type":"string","jsonPath":".spec.mode"}"#,
printcolumn = r#"{"name":"Desired","type":"integer","jsonPath":".spec.replicas"}"#,
printcolumn = r#"{"name":"Phase","type":"string","jsonPath":".status.phase"}"#,
printcolumn = r#"{"name":"Quorum","type":"boolean","jsonPath":".status.quorum"}"#
)]
#[serde(rename_all = "camelCase")]
pub struct BoatRampClusterSpec {
#[serde(default)]
pub mode: ClusterMode,
#[serde(default = "default_replicas")]
pub replicas: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub storage: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub posture: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub admin_token_secret: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub root_pubkey: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auth_secret: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct BoatRampClusterStatus {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<String>,
#[serde(default)]
pub members: Vec<MemberStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quorum: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observed_generation: Option<i64>,
}
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
pub struct MemberStatus {
pub node: String,
pub role: String,
pub ready: bool,
}
#[derive(CustomResource, Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[kube(
group = "boatramp.dev",
version = "v1alpha1",
kind = "Site",
plural = "sites",
namespaced,
status = "SiteStatus",
printcolumn = r#"{"name":"Cluster","type":"string","jsonPath":".spec.cluster"}"#,
printcolumn = r#"{"name":"Project","type":"string","jsonPath":".spec.project"}"#,
printcolumn = r#"{"name":"Ready","type":"string","jsonPath":".status.phase"}"#
)]
pub struct SiteSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cluster: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub project: Option<String>,
#[serde(default)]
pub domains: Vec<String>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct SiteStatus {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<String>,
}
#[derive(CustomResource, Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[kube(
group = "boatramp.dev",
version = "v1alpha1",
kind = "Function",
plural = "functions",
shortname = "fn",
namespaced,
status = "FunctionStatus",
printcolumn = r#"{"name":"Cluster","type":"string","jsonPath":".spec.cluster"}"#,
printcolumn = r#"{"name":"Project","type":"string","jsonPath":".spec.project"}"#,
printcolumn = r#"{"name":"Ready","type":"string","jsonPath":".status.phase"}"#
)]
pub struct FunctionSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cluster: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub project: Option<String>,
pub component: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub route: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct FunctionStatus {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<String>,
}
fn default_replicas() -> u32 {
3
}