Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/checks/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
pub mod cli_version;
pub mod server_version;
pub mod version_match;
42 changes: 42 additions & 0 deletions src/checks/server_version.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
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<Version> {
match which("kubectl") {
Err(_) => return Err(anyhow!("Couldn't find kubectl")),
Ok(kubectl) => {
let output = match Command::new(kubectl)
.arg("version")
.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);
}
}
}
5 changes: 5 additions & 0 deletions src/checks/version_match.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
use super::{cli_version::ClientVersion, server_version::ServerVersion};

pub fn check(client: ClientVersion, server: ServerVersion) -> bool{
client.major == server.major && client.minor == client.minor
}
14 changes: 14 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,18 @@ fn main() {
"✅ kubectl version {}.{}",
cli_version.client_version.major, cli_version.client_version.minor
);

let server_version = match checks::server_version::check() {
Ok(c) => c,
Err(e) => panic!("❌ Failed to check kubectl server version: {}", e),
};

println!(
"✅ kubectl version {}.{}",
server_version.server_version.major, server_version.server_version.minor
);

let version_match:&str= if checks::version_match::check(cli_version.client_version, server_version.server_version) {"✅"} else {"❌"};

println!("{} client and server versions match", version_match);
}