From f7e6bc3b4708b764a8aa3ea0f9f255577686cc86 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Mon, 25 Sep 2023 16:16:59 -0400 Subject: [PATCH] feat: allow configuring k8s context with env var (#71) --- src/lib.rs | 53 +++++++++++++++++++++++++++++++++++++++++------- src/main.rs | 2 +- src/tests/mod.rs | 4 ++-- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b710789..35d9791 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,8 @@ use k8s_openapi::{ }; use kube::{ api::{Api, DeleteParams, PostParams}, - Client, + config::KubeConfigOptions, + Client, Config, }; use resources::{ pvc::StacksDevnetPvc, @@ -17,8 +18,8 @@ use resources::{ StacksDevnetResource, }; use serde::{de::DeserializeOwned, Deserialize, Serialize}; -use std::thread::sleep; use std::{collections::BTreeMap, str::FromStr, time::Duration}; +use std::{env, thread::sleep}; use strum::IntoEnumIterator; use tower::BoxError; @@ -99,17 +100,55 @@ pub struct StacksDevnetApiK8sManager { } impl StacksDevnetApiK8sManager { - pub async fn default(ctx: &Context) -> StacksDevnetApiK8sManager { - let client = Client::try_default() - .await - .expect("could not create kube client"); + pub async fn new(ctx: &Context) -> StacksDevnetApiK8sManager { + let context = match env::var("KUBE_CONTEXT") { + Ok(context) => Some(context), + Err(_) => { + if cfg!(test) { + let is_ci = match env::var("GITHUB_ACTIONS") { + Ok(is_ci) => is_ci == format!("true"), + Err(_) => false, + }; + if is_ci { + None + } else { + // ensures that if no context is supplied and we're running + // tests locally, we deploy to the local kind cluster + Some(format!("kind-kind")) + } + } else { + None + } + } + }; + let client = match context { + Some(context) => { + let kube_config = KubeConfigOptions { + context: Some(context.clone()), + cluster: Some(context), + user: None, + }; + let client_config = + Config::from_kubeconfig(&kube_config) + .await + .unwrap_or_else(|e| { + panic!("could not create kube client config: {}", e.to_string()) + }); + Client::try_from(client_config) + .unwrap_or_else(|e| panic!("could not create kube client: {}", e.to_string())) + } + None => Client::try_default() + .await + .expect("could not create kube client"), + }; + StacksDevnetApiK8sManager { client, ctx: ctx.to_owned(), } } - pub async fn new( + pub async fn from_service( service: S, default_namespace: T, ctx: &Context, diff --git a/src/main.rs b/src/main.rs index 3ed9209..5974cc1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,7 @@ async fn main() { logger: Some(logger), tracer: false, }; - let k8s_manager = StacksDevnetApiK8sManager::default(&ctx).await; + let k8s_manager = StacksDevnetApiK8sManager::new(&ctx).await; let config_path = match env::var("CONFIG_PATH") { Ok(path) => path, Err(_) => { diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 595b9b1..e4f8b3f 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -54,7 +54,7 @@ async fn get_k8s_manager() -> (StacksDevnetApiK8sManager, Context) { let logger = hiro_system_kit::log::setup_logger(); let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); let ctx = Context::empty(); - let k8s_manager = StacksDevnetApiK8sManager::default(&ctx).await; + let k8s_manager = StacksDevnetApiK8sManager::new(&ctx).await; (k8s_manager, ctx) } @@ -269,7 +269,7 @@ async fn get_mock_k8s_manager() -> (StacksDevnetApiK8sManager, Context) { let logger = hiro_system_kit::log::setup_logger(); let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); let ctx = Context::empty(); - let k8s_manager = StacksDevnetApiK8sManager::new(mock_service, "default", &ctx).await; + let k8s_manager = StacksDevnetApiK8sManager::from_service(mock_service, "default", &ctx).await; (k8s_manager, ctx) }