From e3b5dff3524608328de6ee3cbb390f8c640b0ce0 Mon Sep 17 00:00:00 2001 From: Thomas O'Donnell Date: Sat, 6 Apr 2024 15:30:19 +0200 Subject: [PATCH] feat(k8s): Add detect env vars option (#4488) * feat(k8s): Add detect env vars option Have added the option to trigger the k8s module based on what env vars are set, this has been done in a backwards compatible way so if nothing is changed from the defaults the module will still behave the same way as before. This is similar to what I did in #4486 for the python module and if goes well I'd like to rollout to other modules. * Update src/modules/kubernetes.rs Co-authored-by: David Knaack * Update src/modules/kubernetes.rs --------- Co-authored-by: David Knaack --- .github/config-schema.json | 8 ++++++++ docs/config/README.md | 6 ++++-- src/configs/kubernetes.rs | 2 ++ src/modules/kubernetes.rs | 23 ++++++++++++++++++++--- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/.github/config-schema.json b/.github/config-schema.json index 9f30f307..bee19d81 100644 --- a/.github/config-schema.json +++ b/.github/config-schema.json @@ -952,6 +952,7 @@ "default": { "context_aliases": {}, "contexts": [], + "detect_env_vars": [], "detect_extensions": [], "detect_files": [], "detect_folders": [], @@ -4256,6 +4257,13 @@ "type": "string" } }, + "detect_env_vars": { + "default": [], + "type": "array", + "items": { + "type": "string" + } + }, "contexts": { "default": [], "type": "array", diff --git a/docs/config/README.md b/docs/config/README.md index dcec8381..9756484d 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -2601,8 +2601,9 @@ This module is disabled by default. To enable it, set `disabled` to `false` in your configuration file. When the module is enabled it will always be active, unless any of -`detect_extensions`, `detect_files` or `detect_folders` have been set in which -case the module will only be active in directories that match those conditions. +`detect_env_vars`, `detect_extensions`, `detect_files` or `detect_folders` have +been set in which case the module will only be active in directories that match +those conditions or one of the environmatal variable has been set. ::: @@ -2625,6 +2626,7 @@ and `user_alias` options instead. | `detect_extensions` | `[]` | Which extensions should trigger this module. | | `detect_files` | `[]` | Which filenames should trigger this module. | | `detect_folders` | `[]` | Which folders should trigger this modules. | +| `detect_env_vars` | `[]` | Which environmental variables should trigger this module | | `contexts` | `[]` | Customized styles and symbols for specific contexts. | | `disabled` | `true` | Disables the `kubernetes` module. | diff --git a/src/configs/kubernetes.rs b/src/configs/kubernetes.rs index 00523783..312c73bd 100644 --- a/src/configs/kubernetes.rs +++ b/src/configs/kubernetes.rs @@ -18,6 +18,7 @@ pub struct KubernetesConfig<'a> { pub detect_extensions: Vec<&'a str>, pub detect_files: Vec<&'a str>, pub detect_folders: Vec<&'a str>, + pub detect_env_vars: Vec<&'a str>, pub contexts: Vec>, } @@ -33,6 +34,7 @@ impl<'a> Default for KubernetesConfig<'a> { detect_extensions: vec![], detect_files: vec![], detect_folders: vec![], + detect_env_vars: vec![], contexts: vec![], } } diff --git a/src/modules/kubernetes.rs b/src/modules/kubernetes.rs index ef6a4a1f..09a4cef4 100644 --- a/src/modules/kubernetes.rs +++ b/src/modules/kubernetes.rs @@ -107,6 +107,8 @@ pub fn module<'a>(context: &'a Context) -> Option> { return None; }; + let have_env_vars = context.detect_env_vars(&config.detect_env_vars); + // If we have some config for doing the directory scan then we use it but if we don't then we // assume we should treat it like the module is enabled to preserve backward compatibility. let have_scan_config = [ @@ -127,7 +129,7 @@ pub fn module<'a>(context: &'a Context) -> Option> { }) }); - if !is_kube_project.unwrap_or(true) { + if !is_kube_project.unwrap_or(true) && !have_env_vars { return None; } @@ -320,7 +322,7 @@ users: [] } #[test] - fn test_none_when_no_detected_files_or_folders() -> io::Result<()> { + fn test_none_when_no_detected_files_folders_or_env_vars() -> io::Result<()> { let dir = tempfile::tempdir()?; let filename = dir.path().join("config"); @@ -352,6 +354,7 @@ users: [] detect_files = ["k8s.ext"] detect_extensions = ["k8s"] detect_folders = ["k8s_folder"] + detect_env_vars = ["k8s_env_var"] }) .collect(); @@ -361,7 +364,7 @@ users: [] } #[test] - fn test_with_detected_files_and_folder() -> io::Result<()> { + fn test_with_detected_files_folder_and_env_vars() -> io::Result<()> { let dir = tempfile::tempdir()?; let filename = dir.path().join("config"); @@ -429,6 +432,19 @@ users: [] }) .collect(); + let empty_dir = tempfile::tempdir()?; + + let actual_env_var = ModuleRenderer::new("kubernetes") + .path(empty_dir.path()) + .env("KUBECONFIG", filename.to_string_lossy().as_ref()) + .env("TEST_K8S_ENV", "foo") + .config(toml::toml! { + [kubernetes] + disabled = false + detect_env_vars = ["TEST_K8S_ENV"] + }) + .collect(); + let expected = Some(format!( "{} in ", Color::Cyan.bold().paint("☸ test_context") @@ -437,6 +453,7 @@ users: [] assert_eq!(expected, actual_file); assert_eq!(expected, actual_ext); assert_eq!(expected, actual_dir); + assert_eq!(expected, actual_env_var); dir.close() }