Skip to content

Commit

Permalink
fix: removed strict template errors from v2 linter
Browse files Browse the repository at this point in the history
Signed-off-by: Jeff Knurek <knurek.stuff@gmail.com>
  • Loading branch information
jeff-knurek committed Jul 26, 2020
1 parent 73d88af commit a979ba8
Show file tree
Hide file tree
Showing 16 changed files with 423 additions and 19 deletions.
6 changes: 3 additions & 3 deletions cmd/helm/lint.go
Expand Up @@ -97,7 +97,7 @@ func (l *lintCmd) run() error {
var total int
var failures int
for _, path := range l.paths {
linter, err := lintChart(path, rvals, l.namespace, l.strict)
linter, err := lintChart(path, rvals, l.namespace)
if err != nil {
failures = failures + 1
fmt.Println("==> Skipping", path)
Expand Down Expand Up @@ -132,7 +132,7 @@ func (l *lintCmd) run() error {
return nil
}

func lintChart(path string, vals []byte, namespace string, strict bool) (support.Linter, error) {
func lintChart(path string, vals []byte, namespace string) (support.Linter, error) {
var chartPath string
linter := support.Linter{}

Expand Down Expand Up @@ -171,7 +171,7 @@ func lintChart(path string, vals []byte, namespace string, strict bool) (support
return linter, fmt.Errorf("unable to check Chart.yaml file in chart: %s", err.Error())
}

return lint.All(chartPath, vals, namespace, strict), nil
return lint.All(chartPath, vals, namespace), nil
}

// vals merges values from files specified via -f/--values and
Expand Down
45 changes: 43 additions & 2 deletions cmd/helm/lint_test.go
Expand Up @@ -58,11 +58,10 @@ func TestLintChart(t *testing.T) {

values := []byte{}
namespace := "testNamespace"
strict := false

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
_, err := lintChart(tt.chartPath, values, namespace, strict)
_, err := lintChart(tt.chartPath, values, namespace)
switch {
case err != nil && !tt.err:
t.Errorf("%s", err)
Expand Down Expand Up @@ -107,3 +106,45 @@ func TestLinRunForNonExistentChart(t *testing.T) {
}
})
}

func TestLintRunForStrictErrors(t *testing.T) {
out := bytes.NewBufferString("")
tests := []struct {
name string
chartPath string
strict bool
errStr string
wantErr bool
}{
{
name: "non-strict should not error",
chartPath: "testdata/testcharts/bad.name",
strict: false,
wantErr: false,
},
{
name: "strict should error",
chartPath: "testdata/testcharts/bad.name",
strict: true,
errStr: "1 chart(s) linted, 1 chart(s) failed",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
testLint := &lintCmd{
paths: []string{tt.chartPath},
strict: tt.strict,
out: out,
}
expectedErr := fmt.Errorf(tt.errStr)
err := testLint.run()
if tt.wantErr && err == nil {
t.Errorf("expected error but got no error")
}
if err != nil && (err.Error() != expectedErr.Error()) {
t.Errorf("expected: \"%v\" , but got: \"%v\"", expectedErr, err)
}
})
}
}
22 changes: 22 additions & 0 deletions cmd/helm/testdata/testcharts/bad.name/.helmignore
@@ -0,0 +1,22 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
5 changes: 5 additions & 0 deletions cmd/helm/testdata/testcharts/bad.name/Chart.yaml
@@ -0,0 +1,5 @@
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: bad.name
version: 0.1.0
21 changes: 21 additions & 0 deletions cmd/helm/testdata/testcharts/bad.name/templates/NOTES.txt
@@ -0,0 +1,21 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "bad.name.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "bad.name.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "bad.name.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "bad.name.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
{{- end }}
56 changes: 56 additions & 0 deletions cmd/helm/testdata/testcharts/bad.name/templates/_helpers.tpl
@@ -0,0 +1,56 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "bad.name.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "bad.name.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- if contains $name .Release.Name -}}
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{- end -}}

{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "bad.name.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{/*
Common labels
*/}}
{{- define "bad.name.labels" -}}
app.kubernetes.io/name: {{ include "bad.name.name" . }}
helm.sh/chart: {{ include "bad.name.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 -}}

{{/*
Create the name of the service account to use
*/}}
{{- define "bad.name.serviceAccountName" -}}
{{- if .Values.serviceAccount.create -}}
{{ default (include "bad.name.fullname" .) .Values.serviceAccount.name }}
{{- else -}}
{{ default "default" .Values.serviceAccount.name }}
{{- end -}}
{{- end -}}
57 changes: 57 additions & 0 deletions cmd/helm/testdata/testcharts/bad.name/templates/deployment.yaml
@@ -0,0 +1,57 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "bad.name.fullname" . }}
labels:
{{ include "bad.name.labels" . | indent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "bad.name.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "bad.name.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ template "bad.name.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
41 changes: 41 additions & 0 deletions cmd/helm/testdata/testcharts/bad.name/templates/ingress.yaml
@@ -0,0 +1,41 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "bad.name.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{ include "bad.name.labels" . | indent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ . }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
16 changes: 16 additions & 0 deletions cmd/helm/testdata/testcharts/bad.name/templates/service.yaml
@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "bad.name.fullname" . }}
labels:
{{ include "bad.name.labels" . | indent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: {{ include "bad.name.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
@@ -0,0 +1,8 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ template "bad.name.serviceAccountName" . }}
labels:
{{ include "bad.name.labels" . | indent 4 }}
{{- end -}}
@@ -0,0 +1,15 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "bad.name.fullname" . }}-test-connection"
labels:
{{ include "bad.name.labels" . | indent 4 }}
annotations:
"helm.sh/hook": test-success
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "bad.name.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

0 comments on commit a979ba8

Please sign in to comment.