xianyun_cluster/kubeconfig/
mod.rs1pub mod file;
5pub mod merge;
6
7use thiserror::Error;
8
9pub struct Config {
11 temp: tempfile::NamedTempFile,
12 cache_dir: String,
13}
14
15#[derive(Debug, Error)]
17pub enum KubeconfigError {
18 #[error("getting home dir: {0}")]
19 HomeDir(String),
20 #[error("creating kubeconfig tempfile: {0}")]
21 CreateTempfile(String),
22 #[error("writing kubeconfig to tempfile: {0}")]
23 WriteTempfile(String),
24}
25
26impl Config {
27 pub fn create(kubeconfig_yaml: &str) -> Result<Self, KubeconfigError> {
31 let home_dir = dirs_home().ok_or_else(|| {
32 KubeconfigError::HomeDir("could not determine home directory".to_string())
33 })?;
34
35 let mut temp = tempfile::Builder::new()
36 .prefix("xianyun-kubeconfig-")
37 .tempfile()
38 .map_err(|e| KubeconfigError::CreateTempfile(e.to_string()))?;
39
40 use std::io::Write;
41 temp.write_all(kubeconfig_yaml.as_bytes())
42 .map_err(|e| KubeconfigError::WriteTempfile(e.to_string()))?;
43 temp.flush()
44 .map_err(|e| KubeconfigError::WriteTempfile(e.to_string()))?;
45
46 Ok(Self {
47 temp,
48 cache_dir: home_dir
49 .join(".kube")
50 .join("cache")
51 .to_string_lossy()
52 .into_owned(),
53 })
54 }
55
56 pub fn close(self) -> Result<(), KubeconfigError> {
58 self.temp
59 .close()
60 .map_err(|e| KubeconfigError::WriteTempfile(e.to_string()))
61 }
62
63 pub fn path(&self) -> &str {
65 self.temp.path().to_str().unwrap_or_default()
66 }
67
68 pub fn environ(&self) -> Vec<String> {
70 vec![
71 format!("KUBECONFIG={}", self.path()),
72 format!("KUBECACHEDIR={}", self.cache_dir),
73 ]
74 }
75}
76
77fn dirs_home() -> Option<std::path::PathBuf> {
81 std::env::var_os("HOME")
82 .or_else(|| std::env::var_os("USERPROFILE"))
83 .map(std::path::PathBuf::from)
84}