Skip to content

Commit a892797

Browse files
hewe-saxodavidfowl
andauthored
Improved Kubernetes publisher labels (#10208)
* Add labels to all generated resources, updated default labels to align more with Kubernetes recommendations. * Update tests/Aspire.Hosting.Kubernetes.Tests/KubernetesPublisherTests.cs Co-authored-by: David Fowler <davidfowl@gmail.com> * Initializing HelmChartName from IHostingEnvironment.ApplicationName. * Updated unit case snapshots. --------- Co-authored-by: David Fowler <davidfowl@gmail.com>
1 parent 059b8ff commit a892797

File tree

32 files changed

+165
-71
lines changed

32 files changed

+165
-71
lines changed

src/Aspire.Hosting.Kubernetes/Extensions/HelmExtensions.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@ public static string ToHelmValuesSectionName(this string resourceName)
2727
=> $"{resourceName.Replace("-", "_")}";
2828

2929
public static string ToHelmParameterExpression(this string parameterName, string resourceName)
30-
=> $"{{{{ {ValuesSegment}.{ParametersKey}.{resourceName.ToHelmValuesSectionName()}.{parameterName} }}}}";
30+
=> $"{{{{ {ValuesSegment}.{ParametersKey}.{resourceName}.{parameterName} }}}}".ToHelmValuesSectionName();
3131

3232
public static string ToHelmSecretExpression(this string parameterName, string resourceName)
33-
=> $"{{{{ {ValuesSegment}.{SecretsKey}.{resourceName.ToHelmValuesSectionName()}.{parameterName} }}}}";
33+
=> $"{{{{ {ValuesSegment}.{SecretsKey}.{resourceName}.{parameterName} }}}}".ToHelmValuesSectionName();
3434

3535
public static string ToHelmConfigExpression(this string parameterName, string resourceName)
36-
=> $"{{{{ {ValuesSegment}.{ConfigKey}.{resourceName.ToHelmValuesSectionName()}.{parameterName} }}}}";
36+
=> $"{{{{ {ValuesSegment}.{ConfigKey}.{resourceName}.{parameterName} }}}}".ToHelmValuesSectionName();
37+
38+
public static string ToHelmChartName(this string applicationName)
39+
=> applicationName.ToLower().Replace("_", "-").Replace(".", "-");
3740

3841
/// <summary>
3942
/// Converts the specified resource name into a Kubernetes resource name.

src/Aspire.Hosting.Kubernetes/Extensions/ResourceExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ internal static Deployment ToDeployment(this IResource resource, KubernetesResou
1515
Metadata =
1616
{
1717
Name = resource.Name.ToDeploymentName(),
18+
Labels = context.Labels.ToDictionary(),
1819
},
1920
Spec =
2021
{
@@ -43,6 +44,7 @@ internal static StatefulSet ToStatefulSet(this IResource resource, KubernetesRes
4344
Metadata =
4445
{
4546
Name = resource.Name.ToStatefulSetName(),
47+
Labels = context.Labels.ToDictionary(),
4648
},
4749
Spec =
4850
{
@@ -125,6 +127,7 @@ internal static StatefulSet ToStatefulSet(this IResource resource, KubernetesRes
125127
Metadata =
126128
{
127129
Name = resource.Name.ToServiceName(),
130+
Labels = context.Labels.ToDictionary(),
128131
},
129132
Spec =
130133
{

src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using Aspire.Hosting.ApplicationModel;
55
using Aspire.Hosting.Kubernetes;
6+
using Aspire.Hosting.Kubernetes.Extensions;
67
using Aspire.Hosting.Lifecycle;
78

89
namespace Aspire.Hosting;
@@ -34,7 +35,10 @@ public static IResourceBuilder<KubernetesEnvironmentResource> AddKubernetesEnvir
3435

3536
builder.AddKubernetesInfrastructureCore();
3637

37-
var resource = new KubernetesEnvironmentResource(name);
38+
var resource = new KubernetesEnvironmentResource(name)
39+
{
40+
HelmChartName = builder.Environment.ApplicationName.ToHelmChartName()
41+
};
3842
if (builder.ExecutionContext.IsRunMode)
3943
{
4044

src/Aspire.Hosting.Kubernetes/KubernetesResource.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ internal IEnumerable<BaseKubernetesResource> GetTemplatedResources()
8888

8989
foreach (var resource in AdditionalResources)
9090
{
91+
foreach(var label in Labels)
92+
{
93+
resource.Metadata.Labels.TryAdd(label.Key, label.Value);
94+
}
95+
9196
yield return resource;
9297
}
9398
}
@@ -105,8 +110,9 @@ private void SetLabels()
105110
{
106111
Labels = new()
107112
{
108-
["app"] = "aspire",
109-
["component"] = resource.Name,
113+
["app.kubernetes.io/name"] = Parent.HelmChartName,
114+
["app.kubernetes.io/component"] = resource.Name,
115+
["app.kubernetes.io/instance"] = "{{.Release.Name}}",
110116
};
111117
}
112118

tests/Aspire.Hosting.Kubernetes.Tests/KubernetesPublisherTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ public async Task PublishAsync_HandlesSpecialResourceName()
176176
using var tempDir = new TempDirectory();
177177
var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish, "default", outputPath: tempDir.Path);
178178

179-
builder.AddKubernetesEnvironment("env");
179+
builder.AddKubernetesEnvironment("env")
180+
.WithProperties(k => k.HelmChartName = "my-chart");
180181

181182
var param0 = builder.AddParameter("param0");
182183
var param1 = builder.AddParameter("param1", secret: true);

tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/Chart.verified.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
apiVersion: "v2"
2-
name: "aspire"
2+
name: "aspire-hosting-tests"
33
version: "0.1.0"
44
kubeVersion: ">= 1.18.0-0"
55
description: "Aspire Helm Chart"

tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/ServiceA/config.verified.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ kind: "ConfigMap"
44
metadata:
55
name: "servicea-config"
66
labels:
7-
app: "aspire"
8-
component: "ServiceA"
7+
app.kubernetes.io/name: "aspire-hosting-tests"
8+
app.kubernetes.io/component: "ServiceA"
9+
app.kubernetes.io/instance: "{{.Release.Name}}"
910
data:
1011
ASPNETCORE_URLS: "{{ .Values.config.ServiceA.ASPNETCORE_URLS }}"
1112
OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES: "{{ .Values.config.ServiceA.OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES }}"

tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/ServiceA/deployment.verified.yaml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@ apiVersion: "apps/v1"
33
kind: "Deployment"
44
metadata:
55
name: "servicea-deployment"
6+
labels:
7+
app.kubernetes.io/name: "aspire-hosting-tests"
8+
app.kubernetes.io/component: "ServiceA"
9+
app.kubernetes.io/instance: "{{.Release.Name}}"
610
spec:
711
template:
812
metadata:
913
labels:
10-
app: "aspire"
11-
component: "ServiceA"
14+
app.kubernetes.io/name: "aspire-hosting-tests"
15+
app.kubernetes.io/component: "ServiceA"
16+
app.kubernetes.io/instance: "{{.Release.Name}}"
1217
spec:
1318
containers:
1419
- image: "{{ .Values.parameters.ServiceA.ServiceA_image }}"
@@ -26,8 +31,9 @@ spec:
2631
imagePullPolicy: "IfNotPresent"
2732
selector:
2833
matchLabels:
29-
app: "aspire"
30-
component: "ServiceA"
34+
app.kubernetes.io/name: "aspire-hosting-tests"
35+
app.kubernetes.io/component: "ServiceA"
36+
app.kubernetes.io/instance: "{{.Release.Name}}"
3137
replicas: 1
3238
revisionHistoryLimit: 3
3339
strategy:

tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/ServiceA/service.verified.yaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@ apiVersion: "v1"
33
kind: "Service"
44
metadata:
55
name: "servicea-service"
6+
labels:
7+
app.kubernetes.io/name: "aspire-hosting-tests"
8+
app.kubernetes.io/component: "ServiceA"
9+
app.kubernetes.io/instance: "{{.Release.Name}}"
610
spec:
711
type: "ClusterIP"
812
selector:
9-
app: "aspire"
10-
component: "ServiceA"
13+
app.kubernetes.io/name: "aspire-hosting-tests"
14+
app.kubernetes.io/component: "ServiceA"
15+
app.kubernetes.io/instance: "{{.Release.Name}}"
1116
ports:
1217
- name: "http"
1318
protocol: "TCP"

tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/Chart.verified.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
apiVersion: "v2"
2-
name: "aspire"
2+
name: "aspire-hosting-tests"
33
version: "0.1.0"
44
kubeVersion: ">= 1.18.0-0"
55
description: "Aspire Helm Chart"

0 commit comments

Comments
 (0)