use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "kebab-case")]
pub enum KubeAuth {
Anonymous,
BearerToken(TokenSource),
ClientCert {
cert: BytesOrPath,
key: BytesOrPath,
},
Exec {
command: String,
args: Vec<String>,
env: Vec<ExecEnv>,
api_version: String,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "from", rename_all = "kebab-case")]
pub enum TokenSource {
Inline {
token: String,
},
File {
path: PathBuf,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum BytesOrPath {
Path { path: PathBuf },
Inline { data: String },
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExecEnv {
pub name: String,
pub value: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn anonymous_is_yaml_safe() {
let v = KubeAuth::Anonymous;
let s = serde_yaml::to_string(&v).unwrap();
assert!(s.contains("kind: anonymous"));
let back: KubeAuth = serde_yaml::from_str(&s).unwrap();
assert_eq!(v, back);
}
#[test]
fn bearer_inline_round_trips() {
let v = KubeAuth::BearerToken(TokenSource::Inline { token: "abc".into() });
let s = serde_yaml::to_string(&v).unwrap();
let back: KubeAuth = serde_yaml::from_str(&s).unwrap();
assert_eq!(v, back);
}
#[test]
fn bearer_file_round_trips() {
let v = KubeAuth::BearerToken(TokenSource::File { path: "/var/run/sa-token".into() });
let s = serde_yaml::to_string(&v).unwrap();
let back: KubeAuth = serde_yaml::from_str(&s).unwrap();
assert_eq!(v, back);
}
#[test]
fn client_cert_inline_round_trips() {
let v = KubeAuth::ClientCert {
cert: BytesOrPath::Inline { data: "PEM-BYTES".into() },
key: BytesOrPath::Inline { data: "PEM-KEY".into() },
};
let s = serde_yaml::to_string(&v).unwrap();
let back: KubeAuth = serde_yaml::from_str(&s).unwrap();
assert_eq!(v, back);
}
#[test]
fn exec_round_trips() {
let v = KubeAuth::Exec {
command: "aws-iam-authenticator".into(),
args: vec!["token".into(), "-i".into(), "my-cluster".into()],
env: vec![ExecEnv { name: "AWS_REGION".into(), value: "us-east-1".into() }],
api_version: "client.authentication.k8s.io/v1".into(),
};
let s = serde_yaml::to_string(&v).unwrap();
let back: KubeAuth = serde_yaml::from_str(&s).unwrap();
assert_eq!(v, back);
}
}