diff --git a/src/KubernetesClientConfiguration.ConfigFile.cs b/src/KubernetesClientConfiguration.ConfigFile.cs index 862414db6..0a103da9c 100644 --- a/src/KubernetesClientConfiguration.ConfigFile.cs +++ b/src/KubernetesClientConfiguration.ConfigFile.cs @@ -50,6 +50,58 @@ public static KubernetesClientConfiguration BuildConfigFromConfigFile(FileInfo k } var k8SConfig = LoadKubeConfig(kubeconfig); + var k8SConfiguration = GetKubernetesClientConfiguration(currentContext, masterUrl, k8SConfig); + + return k8SConfiguration; + } + + /// + /// + /// Fileinfo of the kubeconfig, cannot be null, whitespaced or empty + /// override the context in config file, set null if do not want to override + /// overrider kube api server endpoint, set null if do not want to override + public static KubernetesClientConfiguration BuildConfigFromConfigFile(string kubeconfig, + string currentContext = null, string masterUrl = null) + { + if (string.IsNullOrWhiteSpace(kubeconfig)) + { + throw new NullReferenceException(nameof(kubeconfig)); + } + + var k8SConfig = LoadKubeConfig(kubeconfig); + var k8SConfiguration = GetKubernetesClientConfiguration(currentContext, masterUrl, k8SConfig); + + return k8SConfiguration; + } + + /// + /// + /// Fileinfo of the kubeconfig, cannot be null, whitespaced or empty + /// override the context in config file, set null if do not want to override + /// overrider kube api server endpoint, set null if do not want to override + public static KubernetesClientConfiguration BuildConfigFromConfigFile(Stream kubeconfig, + string currentContext = null, string masterUrl = null) + { + if (kubeconfig == null) + { + throw new NullReferenceException(nameof(kubeconfig)); + } + + if (!kubeconfig.CanSeek) + { + throw new Exception("Stream don't support seeking!"); + } + + kubeconfig.Position = 0; + + var k8SConfig = LoadKubeConfig(kubeconfig); + var k8SConfiguration = GetKubernetesClientConfiguration(currentContext, masterUrl, k8SConfig); + + return k8SConfiguration; + } + + private static KubernetesClientConfiguration GetKubernetesClientConfiguration(string currentContext, string masterUrl, K8SConfiguration k8SConfig) + { var k8SConfiguration = new KubernetesClientConfiguration(); currentContext = currentContext ?? k8SConfig.CurrentContext; @@ -228,5 +280,32 @@ private static K8SConfiguration LoadKubeConfig(FileInfo kubeconfig) return deserializer.Deserialize(kubeConfigTextStream); } } + + /// + /// Loads Kube Config from string + /// + /// Kube config file contents + /// Instance of the class + private static K8SConfiguration LoadKubeConfig(string kubeconfig) + { + + var deserializeBuilder = new DeserializerBuilder(); + var deserializer = deserializeBuilder.Build(); + return deserializer.Deserialize(kubeconfig); + } + + /// + /// Loads Kube Config from stream. + /// + /// Kube config file contents + /// Instance of the class + private static K8SConfiguration LoadKubeConfig(Stream kubeconfig) + { + using (var sr = new StreamReader(kubeconfig)) + { + var strKubeConfig = sr.ReadToEnd(); + return LoadKubeConfig(strKubeConfig); + } + } } } diff --git a/tests/KubernetesClientConfigurationTests.cs b/tests/KubernetesClientConfigurationTests.cs index da4567770..11701aa0c 100755 --- a/tests/KubernetesClientConfigurationTests.cs +++ b/tests/KubernetesClientConfigurationTests.cs @@ -285,5 +285,31 @@ public void DeletedConfigurationFile() File.Delete(tempFileInfo.FullName); } } + + /// + /// Checks Host is loaded from the default configuration file as string + /// + [Fact] + public void DefaultConfigurationAsStringLoaded() + { + var txt = File.ReadAllText("assets/kubeconfig.yml"); + + var cfg = KubernetesClientConfiguration.BuildConfigFromConfigFile(txt, null, null); + Assert.NotNull(cfg.Host); + } + + + /// + /// Checks Host is loaded from the default configuration file as stream + /// + [Fact] + public void DefaultConfigurationAsStreamLoaded() + { + using (var stream = File.OpenRead("assets/kubeconfig.yml")) + { + var cfg = KubernetesClientConfiguration.BuildConfigFromConfigFile(stream); + Assert.NotNull(cfg.Host); + } + } } }