Skip to content

Adds support for loading a string config content in KubernetesClientConfiguration #83

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
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
79 changes: 79 additions & 0 deletions src/KubernetesClientConfiguration.ConfigFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,58 @@ public static KubernetesClientConfiguration BuildConfigFromConfigFile(FileInfo k
}

var k8SConfig = LoadKubeConfig(kubeconfig);
var k8SConfiguration = GetKubernetesClientConfiguration(currentContext, masterUrl, k8SConfig);

return k8SConfiguration;
}

/// <summary>
/// </summary>
/// <param name="kubeconfig">Fileinfo of the kubeconfig, cannot be null, whitespaced or empty</param>
/// <param name="currentContext">override the context in config file, set null if do not want to override</param>
/// <param name="masterUrl">overrider kube api server endpoint, set null if do not want to override</param>
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;
}

/// <summary>
/// </summary>
/// <param name="kubeconfig">Fileinfo of the kubeconfig, cannot be null, whitespaced or empty</param>
/// <param name="currentContext">override the context in config file, set null if do not want to override</param>
/// <param name="masterUrl">overrider kube api server endpoint, set null if do not want to override</param>
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;
Expand Down Expand Up @@ -228,5 +280,32 @@ private static K8SConfiguration LoadKubeConfig(FileInfo kubeconfig)
return deserializer.Deserialize<K8SConfiguration>(kubeConfigTextStream);
}
}

/// <summary>
/// Loads Kube Config from string
/// </summary>
/// <param name="kubeconfig">Kube config file contents</param>
/// <returns>Instance of the <see cref="K8SConfiguration"/> class</returns>
private static K8SConfiguration LoadKubeConfig(string kubeconfig)
{

var deserializeBuilder = new DeserializerBuilder();
var deserializer = deserializeBuilder.Build();
return deserializer.Deserialize<K8SConfiguration>(kubeconfig);
}

/// <summary>
/// Loads Kube Config from stream.
/// </summary>
/// <param name="kubeconfig">Kube config file contents</param>
/// <returns>Instance of the <see cref="K8SConfiguration"/> class</returns>
private static K8SConfiguration LoadKubeConfig(Stream kubeconfig)
{
using (var sr = new StreamReader(kubeconfig))
{
var strKubeConfig = sr.ReadToEnd();
return LoadKubeConfig(strKubeConfig);
}
}
}
}
26 changes: 26 additions & 0 deletions tests/KubernetesClientConfigurationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -285,5 +285,31 @@ public void DeletedConfigurationFile()
File.Delete(tempFileInfo.FullName);
}
}

/// <summary>
/// Checks Host is loaded from the default configuration file as string
/// </summary>
[Fact]
public void DefaultConfigurationAsStringLoaded()
{
var txt = File.ReadAllText("assets/kubeconfig.yml");

var cfg = KubernetesClientConfiguration.BuildConfigFromConfigFile(txt, null, null);
Assert.NotNull(cfg.Host);
}


/// <summary>
/// Checks Host is loaded from the default configuration file as stream
/// </summary>
[Fact]
public void DefaultConfigurationAsStreamLoaded()
{
using (var stream = File.OpenRead("assets/kubeconfig.yml"))
{
var cfg = KubernetesClientConfiguration.BuildConfigFromConfigFile(stream);
Assert.NotNull(cfg.Host);
}
}
}
}