diff --git a/src/checks/mod.rs b/src/checks/mod.rs index ae3c5eb..9b1564b 100644 --- a/src/checks/mod.rs +++ b/src/checks/mod.rs @@ -1 +1,2 @@ pub mod cli_version; +pub mod server_version; \ No newline at end of file diff --git a/src/checks/server_version.rs b/src/checks/server_version.rs new file mode 100644 index 0000000..839c1d0 --- /dev/null +++ b/src/checks/server_version.rs @@ -0,0 +1,43 @@ +use anyhow::anyhow; +use serde_derive::{Deserialize, Serialize}; +use std::process::Command; +use which::which; + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Version { + #[serde(rename = "serverVersion")] + pub server_version: ServerVersion, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct ServerVersion { + pub major: String, + pub minor: String, +} + +pub fn check() -> anyhow::Result { + match which("kubectl") { + Err(_) => return Err(anyhow!("Couldn't find kubectl")), + Ok(kubectl) => { + let output = match Command::new(kubectl) + .arg("version") + .arg("--client=false") + .arg("-o") + .arg("json") + .output() + { + Ok(c) => c, + Err(_) => return Err(anyhow!("Failed to execute kubectl")), + }; + + let stdout = String::from_utf8(output.stdout).expect("msg"); + + let version: Version = match serde_json::from_str(stdout.as_str()) { + Err(e) => return Err(anyhow!("kubectl failed to get server version: {}", e)), + Ok(v) => v, + }; + + return Ok(version); + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index dea9bea..92ffdfe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,8 +6,18 @@ fn main() { Err(e) => panic!("❌ Failed to check kubectl client version: {}", e), }; + let server_version = match checks::server_version::check() { + Ok(c) => c, + Err(e) => panic!("❌ Failed to check kubectl server version: {}", e), + }; + println!( "✅ kubectl version {}.{}", cli_version.client_version.major, cli_version.client_version.minor ); + + println!( + "✅ kubectl version {}.{}", + server_version.server_version.major, server_version.server_version.minor + ); }