Skip to content

Commit

Permalink
Merge pull request #95 from tintoy/feature/data-protection
Browse files Browse the repository at this point in the history
Initial port of KubeClient.Extensions.DataProtection
  • Loading branch information
tintoy authored May 19, 2024
2 parents b71106d + 6b64fb8 commit ca2d8ed
Show file tree
Hide file tree
Showing 24 changed files with 3,563 additions and 57 deletions.
5 changes: 5 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,8 @@ csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true

# Spacing
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
75 changes: 54 additions & 21 deletions KubeClient.sln
Original file line number Diff line number Diff line change
@@ -1,45 +1,49 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
# Visual Studio Version 17
VisualStudioVersion = 17.8.34309.116
MinimumVisualStudioVersion = 15.0.26124.0
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{A63FB1EF-91AF-4DFA-A93E-FDD7BB34A8ED}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConfigFromConfigMap", "samples\ConfigFromConfigMap\ConfigFromConfigMap.csproj", "{99CE5F17-44BC-4B84-A80D-1C1DCE863D10}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfigFromConfigMap", "samples\ConfigFromConfigMap\ConfigFromConfigMap.csproj", "{99CE5F17-44BC-4B84-A80D-1C1DCE863D10}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeploymentWithRollback", "samples\DeploymentWithRollback\DeploymentWithRollback.csproj", "{94CAB2AF-B5A1-4B2D-A6A0-BA55D062E437}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DeploymentWithRollback", "samples\DeploymentWithRollback\DeploymentWithRollback.csproj", "{94CAB2AF-B5A1-4B2D-A6A0-BA55D062E437}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtensionsSample", "samples\ExtensionsSample\ExtensionsSample.csproj", "{FBFD0479-DF38-42EC-B85E-7E389442F6A3}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExtensionsSample", "samples\ExtensionsSample\ExtensionsSample.csproj", "{FBFD0479-DF38-42EC-B85E-7E389442F6A3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NoobExec", "samples\noob-exec\NoobExec.csproj", "{EF958989-E9D5-4F79-88BE-8932D9C03C26}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NoobExec", "samples\noob-exec\NoobExec.csproj", "{EF958989-E9D5-4F79-88BE-8932D9C03C26}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WatchEvents", "samples\WatchEvents\WatchEvents.csproj", "{BB71C7E4-4039-4134-8F1E-B20AD703D25D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WatchEvents", "samples\WatchEvents\WatchEvents.csproj", "{BB71C7E4-4039-4134-8F1E-B20AD703D25D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A3D60BFF-155C-404C-B6FC-B9B120B7D102}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient", "src\KubeClient\KubeClient.csproj", "{6547822A-99E8-48E0-A15A-7679BB4559DA}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient", "src\KubeClient\KubeClient.csproj", "{6547822A-99E8-48E0-A15A-7679BB4559DA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.Configuration", "src\KubeClient.Extensions.Configuration\KubeClient.Extensions.Configuration.csproj", "{897CE942-382A-4FAF-8B71-0C667D899F66}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.Configuration", "src\KubeClient.Extensions.Configuration\KubeClient.Extensions.Configuration.csproj", "{897CE942-382A-4FAF-8B71-0C667D899F66}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.CustomResources", "src\KubeClient.Extensions.CustomResources\KubeClient.Extensions.CustomResources.csproj", "{BEF993D4-2631-4C44-9BAD-B8A39DE4EAF8}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.CustomResources", "src\KubeClient.Extensions.CustomResources\KubeClient.Extensions.CustomResources.csproj", "{BEF993D4-2631-4C44-9BAD-B8A39DE4EAF8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.DependencyInjection", "src\KubeClient.Extensions.DependencyInjection\KubeClient.Extensions.DependencyInjection.csproj", "{17922755-3251-4111-89FE-64859D559409}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.DependencyInjection", "src\KubeClient.Extensions.DependencyInjection\KubeClient.Extensions.DependencyInjection.csproj", "{17922755-3251-4111-89FE-64859D559409}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.KubeConfig", "src\KubeClient.Extensions.KubeConfig\KubeClient.Extensions.KubeConfig.csproj", "{3C3B6126-78CB-4C6B-B472-17C7AE391E0D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.KubeConfig", "src\KubeClient.Extensions.KubeConfig\KubeClient.Extensions.KubeConfig.csproj", "{3C3B6126-78CB-4C6B-B472-17C7AE391E0D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.WebSockets", "src\KubeClient.Extensions.WebSockets\KubeClient.Extensions.WebSockets.csproj", "{C98D0F17-A91C-413B-82D3-4C32D1B04425}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.WebSockets", "src\KubeClient.Extensions.WebSockets\KubeClient.Extensions.WebSockets.csproj", "{C98D0F17-A91C-413B-82D3-4C32D1B04425}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1286A675-A314-4874-95B6-A1C31A579F38}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.Configuration.Tests", "test\KubeClient.Extensions.Configuration.Tests\KubeClient.Extensions.Configuration.Tests.csproj", "{95CCAFD5-069A-4CB2-BA17-55F7F085A316}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.Configuration.Tests", "test\KubeClient.Extensions.Configuration.Tests\KubeClient.Extensions.Configuration.Tests.csproj", "{95CCAFD5-069A-4CB2-BA17-55F7F085A316}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.KubeConfig.Tests", "test\KubeClient.Extensions.KubeConfig.Tests\KubeClient.Extensions.KubeConfig.Tests.csproj", "{ECC15A63-5C5A-4E35-A6E9-9A3854784DE3}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.KubeConfig.Tests", "test\KubeClient.Extensions.KubeConfig.Tests\KubeClient.Extensions.KubeConfig.Tests.csproj", "{ECC15A63-5C5A-4E35-A6E9-9A3854784DE3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.WebSockets.Tests", "test\KubeClient.Extensions.WebSockets.Tests\KubeClient.Extensions.WebSockets.Tests.csproj", "{2004D34D-3A09-405E-861C-3FF3488947F4}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.WebSockets.Tests", "test\KubeClient.Extensions.WebSockets.Tests\KubeClient.Extensions.WebSockets.Tests.csproj", "{2004D34D-3A09-405E-861C-3FF3488947F4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.TestCommon", "test\KubeClient.TestCommon\KubeClient.TestCommon.csproj", "{2151F49D-004F-4967-8D4B-C8F0113683F1}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.TestCommon", "test\KubeClient.TestCommon\KubeClient.TestCommon.csproj", "{2151F49D-004F-4967-8D4B-C8F0113683F1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Tests", "test\KubeClient.Tests\KubeClient.Tests.csproj", "{B1386E24-076A-4A7C-A085-E850B49C6BE5}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Extensions.DataProtection", "src\KubeClient.Extensions.DataProtection\KubeClient.Extensions.DataProtection.csproj", "{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KubeClient.Tests", "test\KubeClient.Tests\KubeClient.Tests.csproj", "{B1386E24-076A-4A7C-A085-E850B49C6BE5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KubeClient.Extensions.DataProtection.Tests", "test\KubeClient.Extensions.DataProtection.Tests\KubeClient.Extensions.DataProtection.Tests.csproj", "{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -50,9 +54,6 @@ Global
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{99CE5F17-44BC-4B84-A80D-1C1DCE863D10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{99CE5F17-44BC-4B84-A80D-1C1DCE863D10}.Debug|Any CPU.Build.0 = Debug|Any CPU
Expand Down Expand Up @@ -234,6 +235,18 @@ Global
{2151F49D-004F-4967-8D4B-C8F0113683F1}.Release|x64.Build.0 = Release|Any CPU
{2151F49D-004F-4967-8D4B-C8F0113683F1}.Release|x86.ActiveCfg = Release|Any CPU
{2151F49D-004F-4967-8D4B-C8F0113683F1}.Release|x86.Build.0 = Release|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Debug|x64.ActiveCfg = Debug|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Debug|x64.Build.0 = Debug|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Debug|x86.ActiveCfg = Debug|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Debug|x86.Build.0 = Debug|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Release|Any CPU.Build.0 = Release|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Release|x64.ActiveCfg = Release|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Release|x64.Build.0 = Release|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Release|x86.ActiveCfg = Release|Any CPU
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E}.Release|x86.Build.0 = Release|Any CPU
{B1386E24-076A-4A7C-A085-E850B49C6BE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B1386E24-076A-4A7C-A085-E850B49C6BE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B1386E24-076A-4A7C-A085-E850B49C6BE5}.Debug|x64.ActiveCfg = Debug|Any CPU
Expand All @@ -246,6 +259,21 @@ Global
{B1386E24-076A-4A7C-A085-E850B49C6BE5}.Release|x64.Build.0 = Release|Any CPU
{B1386E24-076A-4A7C-A085-E850B49C6BE5}.Release|x86.ActiveCfg = Release|Any CPU
{B1386E24-076A-4A7C-A085-E850B49C6BE5}.Release|x86.Build.0 = Release|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Debug|x64.ActiveCfg = Debug|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Debug|x64.Build.0 = Debug|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Debug|x86.ActiveCfg = Debug|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Debug|x86.Build.0 = Debug|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Release|Any CPU.Build.0 = Release|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Release|x64.ActiveCfg = Release|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Release|x64.Build.0 = Release|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Release|x86.ActiveCfg = Release|Any CPU
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{99CE5F17-44BC-4B84-A80D-1C1DCE863D10} = {A63FB1EF-91AF-4DFA-A93E-FDD7BB34A8ED}
Expand All @@ -263,6 +291,11 @@ Global
{ECC15A63-5C5A-4E35-A6E9-9A3854784DE3} = {1286A675-A314-4874-95B6-A1C31A579F38}
{2004D34D-3A09-405E-861C-3FF3488947F4} = {1286A675-A314-4874-95B6-A1C31A579F38}
{2151F49D-004F-4967-8D4B-C8F0113683F1} = {1286A675-A314-4874-95B6-A1C31A579F38}
{4B6C7D05-0B7D-42A8-97CD-B6D2E3219F8E} = {A3D60BFF-155C-404C-B6FC-B9B120B7D102}
{B1386E24-076A-4A7C-A085-E850B49C6BE5} = {1286A675-A314-4874-95B6-A1C31A579F38}
{9D22E74C-8676-4E8D-9F53-AFFB7DB4B7B0} = {1286A675-A314-4874-95B6-A1C31A579F38}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {1573E771-2F69-48B2-A68A-6380B17F619C}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace KubeClient
{
using Extensions.DataProtection;

/// <summary>
/// <see cref="IDataProtectionBuilder"/> extension methods to persist Keys in a Kubernetes Secret.
/// </summary>
public static class DataProtectionExtensions
{
/// <summary>
/// Add or Create a Kubernetes Secret as a Repository.
/// </summary>
/// <param name="builder">
/// The <see cref="IDataProtectionBuilder"/> to Configure.
/// </param>
/// <param name="clientOptions">
/// <see cref="KubeClientOptions"/> for the <see cref="KubeApiClient"/> used to communicate with the Kubernetes API.
/// </param>
/// <param name="secretName">
/// The name of the target Secret.
/// </param>
/// <param name="kubeNamespace">
/// The namespace of the target Secret.
/// </param>
/// <returns>
/// The configured <see cref="IDataProtectionBuilder"/>.
/// </returns>
public static IDataProtectionBuilder PersistKeysToKubeSecret(this IDataProtectionBuilder builder, KubeClientOptions clientOptions, string secretName, string kubeNamespace = null)
{
if (builder == null)
throw new ArgumentNullException(nameof(builder));

if (clientOptions == null)
throw new ArgumentNullException(nameof(clientOptions));

if (String.IsNullOrWhiteSpace(secretName))
throw new ArgumentException($"Argument cannot be null, empty, or entirely composed of whitespace: {nameof(secretName)}.", nameof(secretName));

builder.Services.Configure<KeyManagementOptions>(options =>
{
KubeApiClient client = KubeApiClient.Create(clientOptions);

// Persist secret data in the target K8s secret.
options.XmlRepository = new KubeSecretXmlRepository(client, secretName, kubeNamespace ?? client.DefaultNamespace);
});

return builder;
}

/// <summary>
/// Add or Create a Kubernetes Secret as a Repository.
/// </summary>
/// <param name="builder">
/// The <see cref="IDataProtectionBuilder"/> to Configure.
/// </param>
/// <param name="client">
/// The <see cref="IKubeApiClient"/> used to communicate with the Kubernetes API.
/// </param>
/// <param name="secretName">
/// The name of the target Secret.
/// </param>
/// <param name="kubeNamespace">
/// The namespace of the target Secret.
/// </param>
/// <returns>
/// The configured <see cref="IDataProtectionBuilder"/>.
/// </returns>
public static IDataProtectionBuilder PersistKeysToKubeSecret(this IDataProtectionBuilder builder, IKubeApiClient client, string secretName, string kubeNamespace = null)
{
if (builder == null)
throw new ArgumentNullException(nameof(builder));

if (client == null)
throw new ArgumentNullException(nameof(client));

if (String.IsNullOrWhiteSpace(secretName))
throw new ArgumentException($"Argument cannot be null, empty, or entirely composed of whitespace: {nameof(secretName)}.", nameof(secretName));

builder.Services.Configure<KeyManagementOptions>(options =>
{
// Persist secret data in the target K8s secret.
options.XmlRepository = new KubeSecretXmlRepository(client, secretName, kubeNamespace ?? client.DefaultNamespace);
});

return builder;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>

<Description>KubeClient extensions for ASP.NET Core data-protection</Description>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\KubeClient\KubeClient.csproj" />
<ProjectReference Include="..\KubeClient.Extensions.Configuration\KubeClient.Extensions.Configuration.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="2.2.0" />
<PackageReference Include="Nito.AsyncEx.Coordination" Version="5.0.0" />
</ItemGroup>

<Import Project="..\Common.props" />
</Project>
Loading

0 comments on commit ca2d8ed

Please sign in to comment.