Skip to content

Commit c7b9393

Browse files
committed
Migrate HealthChecks.Kubernetes tests to Testcontainers
1 parent d82593a commit c7b9393

File tree

4 files changed

+61
-7
lines changed

4 files changed

+61
-7
lines changed

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
<PackageVersion Include="System.Threading.Channels" Version="8.0.0" />
105105
<PackageVersion Include="Testcontainers" Version="$(TestcontainersVersion)" />
106106
<PackageVersion Include="Testcontainers.ClickHouse" Version="$(TestcontainersVersion)" />
107+
<PackageVersion Include="Testcontainers.K3s" Version="$(TestcontainersVersion)" />
107108
<PackageVersion Include="Testcontainers.Kafka" Version="$(TestcontainersVersion)" />
108109
<PackageVersion Include="Testcontainers.Milvus" Version="$(TestcontainersVersion)" />
109110
<PackageVersion Include="Testcontainers.PostgreSql" Version="$(TestcontainersVersion)" />

test/HealthChecks.Kubernetes.Tests/Functional/KubernetesHealthCheckTests.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace HealthChecks.Kubernetes.Tests.Functional;
55

6-
public class kubernetes_healthcheck_should
6+
public class kubernetes_healthcheck_should(K3sContainerFixture k3sFixture) : IClassFixture<K3sContainerFixture>
77
{
88
[Fact]
99
public async Task be_unhealthy_if_kubernetes_is_unavailable()
@@ -63,19 +63,23 @@ public async Task be_healthy_if_empty_registrations()
6363
response.StatusCode.ShouldBe(HttpStatusCode.OK);
6464
}
6565

66-
[Fact(Skip = "TODO: Implement")]
66+
[Fact]
6767
public async Task be_healthy_if_kubernetes_is_available()
6868
{
69+
var kubeconfig = await k3sFixture.GetKubeconfigAsync();
70+
6971
var webHostBuilder = new WebHostBuilder()
7072
.ConfigureServices(services =>
7173
{
7274
services
7375
.AddHealthChecks()
74-
.AddKubernetes(setup => setup.WithConfiguration(new KubernetesClientConfiguration
75-
{
76-
Host = "https://localhost:443",
77-
SkipTlsVerify = true
78-
}).CheckService("DummyService", s => s.Spec.Type == "LoadBalancer"), tags: ["k8s"]);
76+
.AddKubernetes(
77+
setup => setup
78+
.WithConfiguration(kubeconfig)
79+
.CheckService(
80+
"kubernetes",
81+
s => s.Spec.Type == "ClusterIP"),
82+
tags: ["k8s"]);
7983
})
8084
.Configure(app =>
8185
{

test/HealthChecks.Kubernetes.Tests/HealthChecks.Kubernetes.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@
44
<ProjectReference Include="..\..\src\HealthChecks.Kubernetes\HealthChecks.Kubernetes.csproj" />
55
</ItemGroup>
66

7+
<ItemGroup>
8+
<PackageReference Include="Testcontainers.K3s" />
9+
</ItemGroup>
10+
711
</Project>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Text;
2+
using k8s;
3+
using Testcontainers.K3s;
4+
5+
namespace HealthChecks.Kubernetes.Tests;
6+
7+
public class K3sContainerFixture : IAsyncLifetime
8+
{
9+
private const string Registry = "docker.io";
10+
11+
private const string Image = "rancher/k3s";
12+
13+
private const string Tag = "v1.26.2-k3s1";
14+
15+
public K3sContainer? Container { get; private set; }
16+
17+
public async Task<KubernetesClientConfiguration> GetKubeconfigAsync()
18+
{
19+
if (Container is null)
20+
{
21+
throw new InvalidOperationException("The test container was not initialized.");
22+
}
23+
24+
string? kubeconfig = await Container.GetKubeconfigAsync();
25+
26+
await using var stream = new MemoryStream(Encoding.UTF8.GetBytes(kubeconfig));
27+
28+
return await KubernetesClientConfiguration.BuildConfigFromConfigFileAsync(stream);
29+
}
30+
31+
public async Task InitializeAsync() => Container = await CreateContainerAsync();
32+
33+
public Task DisposeAsync() => Container?.DisposeAsync().AsTask() ?? Task.CompletedTask;
34+
35+
private static async Task<K3sContainer> CreateContainerAsync()
36+
{
37+
var container = new K3sBuilder()
38+
.WithImage($"{Registry}/{Image}:{Tag}")
39+
.Build();
40+
41+
await container.StartAsync();
42+
43+
return container;
44+
}
45+
}

0 commit comments

Comments
 (0)