use std::collections::BTreeMap;
use k8s_openapi::api::core::v1::ResourceRequirements;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
pub const COMPONENT_NAME: &str = "appService";
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct AppService {
pub name: String,
pub image: String,
pub args: Option<Vec<String>>,
pub command: Option<Vec<String>>,
pub env: Option<Vec<EnvVar>>,
pub resources: Option<ResourceRequirements>,
pub probes: Option<Probes>,
pub middlewares: Option<Vec<Middleware>>,
pub routing: Option<Vec<Routing>>,
}
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct EnvVar {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(rename = "valueFromPlatform", skip_serializing_if = "Option::is_none")]
pub value_from_platform: Option<EnvVarRef>,
}
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema)]
pub enum EnvVarRef {
ReadOnlyConnection,
ReadWriteConnection,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, ToSchema, JsonSchema)]
pub struct Routing {
pub port: u16,
#[serde(rename = "ingressPath")]
pub ingress_path: Option<String>,
pub middlewares: Option<Vec<String>>,
}
#[allow(non_snake_case)]
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema, PartialEq)]
pub struct Probes {
pub readiness: Probe,
pub liveness: Probe,
}
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema, PartialEq)]
pub struct Probe {
pub path: String,
pub port: String,
#[serde(rename = "initialDelaySeconds")]
pub initial_delay_seconds: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema, PartialEq)]
pub struct Ingress {
pub enabled: bool,
pub path: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema, PartialEq)]
pub enum Middleware {
#[serde(rename = "customRequestHeaders")]
CustomRequestHeaders(HeaderConfig),
}
#[derive(Clone, Debug, Serialize, Deserialize, ToSchema, JsonSchema, PartialEq)]
pub struct HeaderConfig {
pub name: String,
#[schemars(schema_with = "preserve_arbitrary")]
pub config: BTreeMap<String, String>,
}
fn preserve_arbitrary(_gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
let mut obj = schemars::schema::SchemaObject::default();
obj.extensions
.insert("x-kubernetes-preserve-unknown-fields".into(), true.into());
schemars::schema::Schema::Object(obj)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_middleware_config() {
let middleware = serde_json::json!({
"customRequestHeaders": {
"name": "my-custom-headers",
"config":
{
"Authorization": "",
"My-New-Header": "yolo"
}
},
});
let mw = serde_json::from_value::<Middleware>(middleware).unwrap();
match mw {
Middleware::CustomRequestHeaders(mw) => {
assert_eq!(mw.name, "my-custom-headers");
assert_eq!(mw.config["My-New-Header"], "yolo");
assert_eq!(mw.config["Authorization"], "");
}
}
}
}