From 0270f2e2b5d75439d8c835969ec8d8d80bb55bcf Mon Sep 17 00:00:00 2001
From: Luis Davim <luis.davim@jet.com>
Date: Wed, 6 Mar 2019 12:45:57 +0000
Subject: [PATCH] Reduce template code duplication. Fixes #5372

Signed-off-by: Luis Davim <luis.davim@jet.com>
---
 .../testdata/testcharts/alpine/Chart.yaml     |  1 +
 .../testdata/testcharts/novals/Chart.yaml     |  1 +
 .../prerelease/templates/alpine-pod.yaml      |  1 -
 docs/chart_template_guide/variables.md        |  3 +-
 .../examples/alpine/templates/alpine-pod.yaml |  2 +-
 docs/examples/nginx/templates/configmap.yaml  |  1 -
 docs/examples/nginx/templates/deployment.yaml |  1 -
 .../nginx/templates/post-install-job.yaml     |  1 -
 .../nginx/templates/pre-install-secret.yaml   |  1 -
 .../nginx/templates/service-test.yaml         |  1 -
 docs/examples/nginx/templates/service.yaml    |  1 -
 pkg/chartutil/create.go                       | 37 +++++++++----------
 .../testdata/albatross/templates/svc.yaml     |  1 -
 13 files changed, 22 insertions(+), 30 deletions(-)

diff --git a/cmd/helm/testdata/testcharts/alpine/Chart.yaml b/cmd/helm/testdata/testcharts/alpine/Chart.yaml
index fea865aa5..feaa1d78f 100644
--- a/cmd/helm/testdata/testcharts/alpine/Chart.yaml
+++ b/cmd/helm/testdata/testcharts/alpine/Chart.yaml
@@ -1,3 +1,4 @@
+appVersion: "3.3"
 description: Deploy a basic Alpine Linux pod
 home: https://k8s.io/helm
 name: alpine
diff --git a/cmd/helm/testdata/testcharts/novals/Chart.yaml b/cmd/helm/testdata/testcharts/novals/Chart.yaml
index 85f7a5d83..a1b1a0d59 100644
--- a/cmd/helm/testdata/testcharts/novals/Chart.yaml
+++ b/cmd/helm/testdata/testcharts/novals/Chart.yaml
@@ -4,3 +4,4 @@ name: novals
 sources:
 - https://github.com/helm/helm
 version: 0.2.0
+appVersion: 3.3
diff --git a/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml
index 564429dea..f569d556c 100644
--- a/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml
+++ b/cmd/helm/testdata/testcharts/prerelease/templates/alpine-pod.yaml
@@ -10,7 +10,6 @@ metadata:
     # The "release" convention makes it easy to tie a release to all of the
     # Kubernetes resources that were created as part of that release.
     app.kubernetes.io/instance: {{.Release.Name | quote }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
     # This makes it easy to audit chart usage.
     helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
   annotations:
diff --git a/docs/chart_template_guide/variables.md b/docs/chart_template_guide/variables.md
index 984b9b4e5..65f754faf 100644
--- a/docs/chart_template_guide/variables.md
+++ b/docs/chart_template_guide/variables.md
@@ -114,7 +114,8 @@ metadata:
     # I cannot reference .Chart.Name, but I can do $.Chart.Name
     helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
     app.kubernetes.io/instance: "{{ $.Release.Name }}"
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
+    # Value from appVersion in Chart.yaml
+    app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
     app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
 type: kubernetes.io/tls
 data:
diff --git a/docs/examples/alpine/templates/alpine-pod.yaml b/docs/examples/alpine/templates/alpine-pod.yaml
index 2b54811fd..0f48e4059 100644
--- a/docs/examples/alpine/templates/alpine-pod.yaml
+++ b/docs/examples/alpine/templates/alpine-pod.yaml
@@ -10,7 +10,7 @@ metadata:
     # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the
     # Kubernetes resources that were created as part of that release.
     app.kubernetes.io/instance: {{ .Release.Name | quote }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
+    app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
     # This makes it easy to audit chart usage.
     helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
     app.kubernetes.io/name: {{ template "alpine.name" . }}
diff --git a/docs/examples/nginx/templates/configmap.yaml b/docs/examples/nginx/templates/configmap.yaml
index d47992024..0141cbc69 100644
--- a/docs/examples/nginx/templates/configmap.yaml
+++ b/docs/examples/nginx/templates/configmap.yaml
@@ -6,7 +6,6 @@ metadata:
   labels:
     app.kubernetes.io/managed-by: {{ .Release.Service }}
     app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
     helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
     app.kubernetes.io/name: {{ template "nginx.name" . }}
 data:
diff --git a/docs/examples/nginx/templates/deployment.yaml b/docs/examples/nginx/templates/deployment.yaml
index cc4d4ea85..5bb30f9af 100644
--- a/docs/examples/nginx/templates/deployment.yaml
+++ b/docs/examples/nginx/templates/deployment.yaml
@@ -14,7 +14,6 @@ metadata:
     # to all of the Kubernetes resources that were created as part of that
     # release.
     app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
     # This makes it easy to audit chart usage.
     helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
     app.kubernetes.io/name: {{ template "nginx.name" . }}
diff --git a/docs/examples/nginx/templates/post-install-job.yaml b/docs/examples/nginx/templates/post-install-job.yaml
index 856782a4d..3562e6cf5 100644
--- a/docs/examples/nginx/templates/post-install-job.yaml
+++ b/docs/examples/nginx/templates/post-install-job.yaml
@@ -10,7 +10,6 @@ metadata:
     # The "app.kubernetes.io/instance" convention makes it easy to tie a release to all of the
     # Kubernetes resources that were created as part of that release.
     app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
     # This makes it easy to audit chart usage.
     helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
     app.kubernetes.io/name: {{ template "nginx.name" . }}
diff --git a/docs/examples/nginx/templates/pre-install-secret.yaml b/docs/examples/nginx/templates/pre-install-secret.yaml
index 40451800d..07a9504b5 100644
--- a/docs/examples/nginx/templates/pre-install-secret.yaml
+++ b/docs/examples/nginx/templates/pre-install-secret.yaml
@@ -7,7 +7,6 @@ metadata:
   labels:
     app.kubernetes.io/managed-by: {{ .Release.Service }}
     app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
     helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
     app.kubernetes.io/name: {{ template "nginx.name" . }}
   # This declares the resource to be a hook. By convention, we also name the
diff --git a/docs/examples/nginx/templates/service-test.yaml b/docs/examples/nginx/templates/service-test.yaml
index 867f077ee..ffb37e9f4 100644
--- a/docs/examples/nginx/templates/service-test.yaml
+++ b/docs/examples/nginx/templates/service-test.yaml
@@ -5,7 +5,6 @@ metadata:
   labels:
     app.kubernetes.io/managed-by: {{ .Release.Service }}
     app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
     helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
     app.kubernetes.io/name: {{ template "nginx.name" . }}
   annotations:
diff --git a/docs/examples/nginx/templates/service.yaml b/docs/examples/nginx/templates/service.yaml
index e8eb8e51e..a12cb0982 100644
--- a/docs/examples/nginx/templates/service.yaml
+++ b/docs/examples/nginx/templates/service.yaml
@@ -10,7 +10,6 @@ metadata:
     helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
     app.kubernetes.io/managed-by: {{ .Release.Service }}
     app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
   name: {{ template "nginx.fullname" . }}
 spec:
 # Provides options for the service so chart users have the full choice
diff --git a/pkg/chartutil/create.go b/pkg/chartutil/create.go
index 415e6f97b..0d260627e 100644
--- a/pkg/chartutil/create.go
+++ b/pkg/chartutil/create.go
@@ -134,11 +134,7 @@ kind: Ingress
 metadata:
   name: {{ $fullName }}
   labels:
-    app.kubernetes.io/name: {{ include "<CHARTNAME>.name" . }}
-    helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
-    app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
-    app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{ include "<CHARTNAME>.labels" . | indent 4 }}
   {{- with .Values.ingress.annotations }}
   annotations:
     {{- toYaml . | nindent 4 }}
@@ -174,11 +170,7 @@ kind: Deployment
 metadata:
   name: {{ include "<CHARTNAME>.fullname" . }}
   labels:
-    app.kubernetes.io/name: {{ include "<CHARTNAME>.name" . }}
-    helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
-    app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
-    app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{ include "<CHARTNAME>.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
   selector:
@@ -228,11 +220,7 @@ kind: Service
 metadata:
   name: {{ include "<CHARTNAME>.fullname" . }}
   labels:
-    app.kubernetes.io/name: {{ include "<CHARTNAME>.name" . }}
-    helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
-    app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
-    app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{ include "<CHARTNAME>.labels" . | indent 4 }}
 spec:
   type: {{ .Values.service.type }}
   ports:
@@ -300,6 +288,19 @@ Create chart name and version as used by the chart label.
 {{- define "<CHARTNAME>.chart" -}}
 {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
 {{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "<CHARTNAME>.labels" -}}
+app.kubernetes.io/name: {{ include "<CHARTNAME>.name" . }}
+helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion -}}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end -}}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
 `
 
 const defaultTestConnection = `apiVersion: v1
@@ -307,11 +308,7 @@ kind: Pod
 metadata:
   name: "{{ include "<CHARTNAME>.fullname" . }}-test-connection"
   labels:
-    app.kubernetes.io/name: {{ include "<CHARTNAME>.name" . }}
-    helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
-    app.kubernetes.io/instance: {{ .Release.Name }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
-    app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{ include "<CHARTNAME>.labels" . | indent 4 }}
   annotations:
     "helm.sh/hook": test-success
 spec:
diff --git a/pkg/lint/rules/testdata/albatross/templates/svc.yaml b/pkg/lint/rules/testdata/albatross/templates/svc.yaml
index a976b4fdd..aea11d833 100644
--- a/pkg/lint/rules/testdata/albatross/templates/svc.yaml
+++ b/pkg/lint/rules/testdata/albatross/templates/svc.yaml
@@ -7,7 +7,6 @@ metadata:
   labels:
     app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
     app.kubernetes.io/instance: {{ .Release.Name | quote }}
-    app.kubernetes.io/version: {{ .Chart.AppVersion }}
     helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
     kubeVersion: {{ .Capabilities.KubeVersion.Major }}
     tillerVersion: {{ .Capabilities.TillerVersion }}
-- 
GitLab