diff --git a/assets/auto-deploy-app/Chart.yaml b/assets/auto-deploy-app/Chart.yaml index 794444d462680f00f77b59025f456d8fed092745..4a63c22768ed8f01d7c35818991884c8b45b5791 100644 --- a/assets/auto-deploy-app/Chart.yaml +++ b/assets/auto-deploy-app/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v1 description: GitLab's Auto-deploy Helm Chart name: auto-deploy-app -version: 2.2.0 +version: 2.3.0 icon: https://gitlab.com/gitlab-com/gitlab-artwork/raw/master/logo/logo-square.png diff --git a/assets/auto-deploy-app/README.md b/assets/auto-deploy-app/README.md index 409c99fa7500a5c54da9a6281cec69bcd31f0f2a..017f6da74c99215992acb1d3fea35b98e939ba6f 100644 --- a/assets/auto-deploy-app/README.md +++ b/assets/auto-deploy-app/README.md @@ -15,6 +15,7 @@ | image.tag | | `stable` | | image.pullPolicy | | `Always` | | image.secrets | | `[name: gitlab-registry]` | +| extraLabels | Allow labelling resources with custom key/value pairs | `{}` | | podAnnotations | Pod annotations | `{}` | | application.track | | `stable` | | application.tier | | `web` | diff --git a/assets/auto-deploy-app/templates/_helpers.tpl b/assets/auto-deploy-app/templates/_helpers.tpl index 20789d254ed0fe7f528fc373a354bcfe75c64540..8a55ef84929fd773d7c169c94dd101b74d7fe56f 100644 --- a/assets/auto-deploy-app/templates/_helpers.tpl +++ b/assets/auto-deploy-app/templates/_helpers.tpl @@ -48,3 +48,17 @@ Get SecRule's arguments with unescaped single&double quotes {{- $action := .action | quote | replace "\"" "\\\"" | replace "'" "\\'" -}} {{- printf "SecRule %s %s %s" .variable $operator $action -}} {{- end -}} + +{{- define "sharedlabels" -}} +app: {{ template "appname" . }} +chart: "{{ .Chart.Name }}-{{ .Chart.Version| replace "+" "_" }}" +release: {{ .Release.Name }} +heritage: {{ .Release.Service }} +app.kubernetes.io/name: {{ template "appname" . }} +helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version| replace "+" "_" }}" +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- if .Values.extraLabels }} +{{ toYaml $.Values.extraLabels }} +{{- end }} +{{- end -}} \ No newline at end of file diff --git a/assets/auto-deploy-app/templates/db-initialize-job.yaml b/assets/auto-deploy-app/templates/db-initialize-job.yaml index 535731a51a2093396cb212f1b865234dd93ec395..73b66eec0e2d7311ee5a2feee2597d04f174e4ab 100644 --- a/assets/auto-deploy-app/templates/db-initialize-job.yaml +++ b/assets/auto-deploy-app/templates/db-initialize-job.yaml @@ -4,10 +4,7 @@ kind: Job metadata: name: {{ template "trackableappname" . }}-db-initialize labels: - app: {{ template "appname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version| replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4 }} annotations: "helm.sh/hook": post-install "helm.sh/hook-delete-policy": before-hook-creation diff --git a/assets/auto-deploy-app/templates/db-migrate-hook.yaml b/assets/auto-deploy-app/templates/db-migrate-hook.yaml index 78b871fea1421f5051acd415954d204c0316d1cf..5921c4f0ec6d83e0ba0fe64857daf69f06b2ac14 100644 --- a/assets/auto-deploy-app/templates/db-migrate-hook.yaml +++ b/assets/auto-deploy-app/templates/db-migrate-hook.yaml @@ -4,10 +4,7 @@ kind: Job metadata: name: {{ template "trackableappname" . }}-db-migrate labels: - app: {{ template "appname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version| replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4 }} annotations: "helm.sh/hook": pre-upgrade "helm.sh/hook-delete-policy": before-hook-creation diff --git a/assets/auto-deploy-app/templates/deployment.yaml b/assets/auto-deploy-app/templates/deployment.yaml index e6c179509a28326cc089f88bb9977ef3b927a0ba..584b23d915a5d57090f7b30714bfbb9f7ad07826 100644 --- a/assets/auto-deploy-app/templates/deployment.yaml +++ b/assets/auto-deploy-app/templates/deployment.yaml @@ -7,12 +7,9 @@ metadata: {{ if .Values.gitlab.app }}app.gitlab.com/app: {{ .Values.gitlab.app | quote }}{{ end }} {{ if .Values.gitlab.env }}app.gitlab.com/env: {{ .Values.gitlab.env | quote }}{{ end }} labels: - app: {{ template "appname" . }} track: "{{ .Values.application.track }}" tier: "{{ .Values.application.tier }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4 }} spec: selector: matchLabels: @@ -35,10 +32,9 @@ spec: {{ toYaml .Values.podAnnotations | indent 8 }} {{- end }} labels: - app: {{ template "appname" . }} track: "{{ .Values.application.track }}" tier: "{{ .Values.application.tier }}" - release: {{ .Release.Name }} +{{ include "sharedlabels" . | indent 8 }} spec: {{- if .Values.serviceAccountName }} serviceAccountName: {{ .Values.serviceAccountName | quote }} diff --git a/assets/auto-deploy-app/templates/hpa.yaml b/assets/auto-deploy-app/templates/hpa.yaml index 4084c447afc929a720d86f7191dd20aa36844010..af4a374e1e59ccd8603ef2ccaf9f49adeedd11e9 100644 --- a/assets/auto-deploy-app/templates/hpa.yaml +++ b/assets/auto-deploy-app/templates/hpa.yaml @@ -4,10 +4,7 @@ kind: HorizontalPodAutoscaler metadata: name: {{ template "fullname" . }} labels: - app: {{ template "appname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4 }} spec: scaleTargetRef: kind: Deployment diff --git a/assets/auto-deploy-app/templates/ingress.yaml b/assets/auto-deploy-app/templates/ingress.yaml index c9af1eb13a3cf4815dbe08013309ffeb54254ae2..a4953d22f15d0ebd5acb7775c39082659f4ac9ac 100644 --- a/assets/auto-deploy-app/templates/ingress.yaml +++ b/assets/auto-deploy-app/templates/ingress.yaml @@ -4,10 +4,7 @@ kind: Ingress metadata: name: {{ template "fullname" . }} labels: - app: {{ template "appname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version| replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4 }} annotations: {{- if .Values.ingress.annotations }} {{ toYaml .Values.ingress.annotations | indent 4 }} diff --git a/assets/auto-deploy-app/templates/network-policy.yaml b/assets/auto-deploy-app/templates/network-policy.yaml index 79c0ed662514d8deb99bb19382105f8f445ce288..a3119ed5d7c02f123e99b73a4256e8419bef2809 100644 --- a/assets/auto-deploy-app/templates/network-policy.yaml +++ b/assets/auto-deploy-app/templates/network-policy.yaml @@ -4,10 +4,7 @@ kind: NetworkPolicy metadata: name: {{ template "fullname" . }} labels: - app: {{ template "appname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4}} spec: {{ toYaml .Values.networkPolicy.spec | indent 2 }} {{- end -}} diff --git a/assets/auto-deploy-app/templates/pdb.yaml b/assets/auto-deploy-app/templates/pdb.yaml index 69bb2ed738e404493b6a450eb4244872409113a1..aa75d6c1fb476a4b1f1f569204aa509fc133fad9 100644 --- a/assets/auto-deploy-app/templates/pdb.yaml +++ b/assets/auto-deploy-app/templates/pdb.yaml @@ -4,10 +4,7 @@ kind: PodDisruptionBudget metadata: name: {{ template "fullname" . }} labels: - app: {{ template "appname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4 }} spec: {{- if .Values.podDisruptionBudget.minAvailable }} minAvailable: {{ .Values.podDisruptionBudget.minAvailable }} diff --git a/assets/auto-deploy-app/templates/service.yaml b/assets/auto-deploy-app/templates/service.yaml index 1a67ce11f82aa47347d2d28b7699162288d61d11..272078b40b33a861bf1b97dd5f69a4100b36f604 100644 --- a/assets/auto-deploy-app/templates/service.yaml +++ b/assets/auto-deploy-app/templates/service.yaml @@ -12,11 +12,8 @@ metadata: prometheus.io/port: "{{ .Values.service.internalPort }}" {{- end }} labels: - app: {{ template "appname" . }} track: "{{ .Values.application.track }}" - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} +{{ include "sharedlabels" . | indent 4 }} spec: type: {{ .Values.service.type }} ports: diff --git a/assets/auto-deploy-app/test/deploymenttemplate_test.go b/assets/auto-deploy-app/test/deploymenttemplate_test.go index b7b300ce729312be11388f049051b2e064b39507..c8da29138e19c04c7fcf9627e782ecf58d866c00 100644 --- a/assets/auto-deploy-app/test/deploymenttemplate_test.go +++ b/assets/auto-deploy-app/test/deploymenttemplate_test.go @@ -90,12 +90,16 @@ func TestDeploymentTemplate(t *testing.T) { "app.gitlab.com/env": "prod", }, deployment.Annotations) require.Equal(t, map[string]string{ - "app": tc.ExpectedName, - "chart": chartName, - "heritage": "Helm", - "release": tc.ExpectedRelease, - "tier": "web", - "track": "stable", + "app": tc.ExpectedName, + "chart": chartName, + "heritage": "Helm", + "release": tc.ExpectedRelease, + "tier": "web", + "track": "stable", + "app.kubernetes.io/name": tc.ExpectedName, + "helm.sh/chart": chartName, + "app.kubernetes.io/managed-by": "Helm", + "app.kubernetes.io/instance": tc.ExpectedRelease, }, deployment.Labels) require.Equal(t, map[string]string{ @@ -104,10 +108,16 @@ func TestDeploymentTemplate(t *testing.T) { "checksum/application-secrets": "", }, deployment.Spec.Template.Annotations) require.Equal(t, map[string]string{ - "app": tc.ExpectedName, - "release": tc.ExpectedRelease, - "tier": "web", - "track": "stable", + "app": tc.ExpectedName, + "chart": chartName, + "heritage": "Helm", + "release": tc.ExpectedRelease, + "tier": "web", + "track": "stable", + "app.kubernetes.io/name": tc.ExpectedName, + "helm.sh/chart": chartName, + "app.kubernetes.io/managed-by": "Helm", + "app.kubernetes.io/instance": tc.ExpectedRelease, }, deployment.Spec.Template.Labels) }) } @@ -301,21 +311,31 @@ func TestDeploymentTemplate(t *testing.T) { require.Equal(t, tc.ExpectedName, deployment.Name) require.Equal(t, map[string]string{ - "app": tc.ExpectedName, - "chart": chartName, - "heritage": "Helm", - "release": tc.ExpectedRelease, - "tier": "web", - "track": "stable", + "app": tc.ExpectedName, + "chart": chartName, + "heritage": "Helm", + "release": tc.ExpectedRelease, + "tier": "web", + "track": "stable", + "app.kubernetes.io/name": tc.ExpectedName, + "helm.sh/chart": chartName, + "app.kubernetes.io/managed-by": "Helm", + "app.kubernetes.io/instance": tc.ExpectedRelease, }, deployment.Labels) require.Equal(t, tc.ExpectedSelector, deployment.Spec.Selector) require.Equal(t, map[string]string{ - "app": tc.ExpectedName, - "release": tc.ExpectedRelease, - "tier": "web", - "track": "stable", + "app": tc.ExpectedName, + "chart": chartName, + "heritage": "Helm", + "release": tc.ExpectedRelease, + "tier": "web", + "track": "stable", + "app.kubernetes.io/name": tc.ExpectedName, + "helm.sh/chart": chartName, + "app.kubernetes.io/managed-by": "Helm", + "app.kubernetes.io/instance": tc.ExpectedRelease, }, deployment.Spec.Template.Labels) }) } diff --git a/assets/auto-deploy-app/test/networkpolicytemplate_test.go b/assets/auto-deploy-app/test/networkpolicytemplate_test.go index 06378638af1209177cb5cb42fda4fe0c263a0187..18cf8b23c77d0dd638f7a436ae2d174fac470a9e 100644 --- a/assets/auto-deploy-app/test/networkpolicytemplate_test.go +++ b/assets/auto-deploy-app/test/networkpolicytemplate_test.go @@ -14,10 +14,14 @@ func TestNetworkPolicy(t *testing.T) { releaseName := "network-policy-test" templates := []string{"templates/network-policy.yaml"} expectedLabels := map[string]string{ - "app": releaseName, - "chart": chartName, - "release": releaseName, - "heritage": "Helm", + "app": releaseName, + "chart": chartName, + "release": releaseName, + "heritage": "Helm", + "app.kubernetes.io/name": releaseName, + "helm.sh/chart": chartName, + "app.kubernetes.io/managed-by": "Helm", + "app.kubernetes.io/instance": releaseName, } tcs := []struct { diff --git a/assets/auto-deploy-app/test/template_test.go b/assets/auto-deploy-app/test/template_test.go index 339a65a01b8efd7fda387a94973daa5982723f15..f1227eddf7739100f14c9f6a68cc6b3992b7d7c0 100644 --- a/assets/auto-deploy-app/test/template_test.go +++ b/assets/auto-deploy-app/test/template_test.go @@ -14,7 +14,7 @@ import ( ) const ( - chartName = "auto-deploy-app-2.2.0" + chartName = "auto-deploy-app-2.3.0" helmChartPath = ".." ) @@ -262,6 +262,120 @@ func TestIngressTemplate_Disable(t *testing.T) { } } +func TestTemplateLabels(t *testing.T) { + templates := []string{ + "templates/deployment.yaml", "templates/hpa.yaml", + "templates/ingress.yaml", "templates/network-policy.yaml", + "templates/pdb.yaml", "templates/network-policy.yaml", + "templates/service.yaml"} + databaseTemplates := []string{ + "templates/db-initialize-job.yaml", "templates/db-migrate-hook.yaml"} + tcs := []struct { + name string + releaseName string + values map[string]string + + expectedName string + expectedLabels map[string]string + expectedErrorRegexp *regexp.Regexp + }{ + { + name: "defaults", + releaseName: "production", + values: map[string]string{ + "hpa.enabled": "true", + "podDisruptionBudget.enabled": "true", + "networkPolicy.enabled": "true", + "resources.requests.cpu": "100m", + "resources.requests.memory": "128Mi"}, + expectedLabels: map[string]string{ + "app": "production", + "chart": chartName, + "release": "production", + "heritage": "Helm", + "app.kubernetes.io/name": "production", + "helm.sh/chart": chartName, + "app.kubernetes.io/managed-by": "Helm", + "app.kubernetes.io/instance": "production", + }, + }, + { + name: "extraLabels", + releaseName: "production", + values: map[string]string{ + "hpa.enabled": "true", + "podDisruptionBudget.enabled": "true", + "networkPolicy.enabled": "true", + "resources.requests.cpu": "100m", + "resources.requests.memory": "128Mi", + "labels.useRecommended": "false", + "extraLabels.team": "myteam", + "extraLabels.organization": "myorg", + }, + expectedLabels: map[string]string{ + "app": "production", + "chart": chartName, + "release": "production", + "heritage": "Helm", + "app.kubernetes.io/name": "production", + "helm.sh/chart": chartName, + "app.kubernetes.io/managed-by": "Helm", + "app.kubernetes.io/instance": "production", + "team": "myteam", + "organization": "myorg", + }, + }, + } + dbtcs := []struct { + name string + releaseName string + values map[string]string + + expectedName string + expectedLabels map[string]string + expectedErrorRegexp *regexp.Regexp + }{ + { + name: "database", + releaseName: "production", + values: map[string]string{"application.initializeCommand": "true", "application.migrateCommand": "true"}, + expectedLabels: map[string]string{"app": "production", "release": "production", "heritage": "Helm", "chart": chartName}, + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(t *testing.T) { + output, ret := renderTemplate(t, tc.values, tc.releaseName, templates, tc.expectedErrorRegexp) + + if ret == false { + return + } + + metaObj := metav1.PartialObjectMetadata{} + helm.UnmarshalK8SYaml(t, output, &metaObj) + for key, value := range tc.expectedLabels { + require.Equal(t, metaObj.ObjectMeta.Labels[key], value) + } + }) + } + + for _, tc := range dbtcs { + t.Run(tc.name, func(t *testing.T) { + output, ret := renderTemplate(t, tc.values, tc.releaseName, databaseTemplates, tc.expectedErrorRegexp) + + if ret == false { + return + } + + metaObj := metav1.PartialObjectMetadata{} + helm.UnmarshalK8SYaml(t, output, &metaObj) + for key, value := range tc.expectedLabels { + require.Equal(t, metaObj.ObjectMeta.Labels[key], value) + } + }) + } +} + func TestServiceTemplate_DifferentTracks(t *testing.T) { templates := []string{"templates/service.yaml"} tcs := []struct { diff --git a/assets/auto-deploy-app/values.yaml b/assets/auto-deploy-app/values.yaml index 3066a06601837ad849471a44e547bbb63dd1ddf6..665d18de92db1968ff59ab83918482e4116c9b86 100644 --- a/assets/auto-deploy-app/values.yaml +++ b/assets/auto-deploy-app/values.yaml @@ -10,6 +10,7 @@ image: pullPolicy: IfNotPresent secrets: - name: gitlab-registry +extraLabels: {} podAnnotations: {} application: track: stable @@ -81,7 +82,7 @@ resources: # limits: # cpu: 100m # memory: 128Mi - requests: + requests: {} # cpu: 100m # memory: 128Mi