diff --git a/e2e/helm-charts/redis-app/templates/preflight.yaml b/e2e/helm-charts/redis-app/templates/preflight.yaml new file mode 100644 index 0000000000..d3fd3b19a3 --- /dev/null +++ b/e2e/helm-charts/redis-app/templates/preflight.yaml @@ -0,0 +1,29 @@ +{{- if .Values.preflight.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "redis-app.fullname" . }}-preflight + labels: + {{- include "redis-app.labels" . | nindent 4 }} +data: + preflight.yaml: | + apiVersion: troubleshoot.sh/v1beta2 + kind: Preflight + metadata: + name: redis-app-preflight + spec: + collectors: + - nodeResources: {} + analyzers: + - nodeResources: + checkName: Node status check + outcomes: + - fail: + when: "nodeCondition(Ready) == False" + message: "Not all nodes are online." + - fail: + when: "nodeCondition(Ready) == Unknown" + message: "Not all nodes are online." + - pass: + message: "All nodes are online." +{{- end }} diff --git a/e2e/helm-charts/redis-app/values.yaml b/e2e/helm-charts/redis-app/values.yaml index efb3cde2c0..dcafbcfed4 100644 --- a/e2e/helm-charts/redis-app/values.yaml +++ b/e2e/helm-charts/redis-app/values.yaml @@ -1,6 +1,11 @@ # Default values for redis-app global: labels: {} + +# Preflight checks configuration +preflight: + enabled: false + # Server (Redis) configuration server: replicaCount: 1 @@ -29,7 +34,7 @@ client: repository: redis pullPolicy: IfNotPresent tag: "7.2" - intervalSeconds: 30 # Make a request every 30 seconds + intervalSeconds: 30 # Make a request every 30 seconds resources: limits: cpu: 100m @@ -66,4 +71,4 @@ nodeSelector: {} tolerations: [] -affinity: {} \ No newline at end of file +affinity: {} diff --git a/tests/dryrun/assets/kotskinds-chart.yaml b/tests/dryrun/assets/kotskinds-chart.yaml index 22a4ab41ae..deaf0adde2 100644 --- a/tests/dryrun/assets/kotskinds-chart.yaml +++ b/tests/dryrun/assets/kotskinds-chart.yaml @@ -18,10 +18,10 @@ spec: port: 80 replicaCount: 1 imagePullSecrets: - - name: '{{repl ImagePullSecretName }}' + - name: "{{repl ImagePullSecretName }}" env: - name: PRIVATE_CA_CONFIGMAP - value: 'repl{{ PrivateCACert }}' + value: "repl{{ PrivateCACert }}" - name: SSL_CERT_DIR value: "/etc/ssl/certs" client: @@ -31,14 +31,14 @@ spec: replicaCount: 1 intervalSeconds: 60 imagePullSecrets: - - name: '{{repl ImagePullSecretName }}' + - name: "{{repl ImagePullSecretName }}" replicated: enabled: true image: registry: repl{{ HasLocalRegistry | ternary LocalRegistryHost "ec-e2e-proxy.testcluster.net" }} repository: repl{{ HasLocalRegistry | ternary LocalRegistryNamespace "anonymous/registry.replicated.com/library" }}/replicated-sdk-image imagePullSecrets: - - name: '{{repl ImagePullSecretName }}' + - name: "{{repl ImagePullSecretName }}" configItemsConfigMapData: text_required: repl{{ ConfigOption "text_required" }} @@ -54,8 +54,25 @@ spec: volumes: - name: ca-certs configMap: - name: 'repl{{ PrivateCACert }}' + name: "repl{{ PrivateCACert }}" builder: replicated: enabled: true +# Do not remove the HelmChart document below. This file is intentionally a multi-document YAML file +# for regression testing of SC-131165 bug fix. +--- +apiVersion: kots.io/v1beta2 +kind: HelmChart +metadata: + name: redis-app +spec: + chart: + name: redis-app + chartVersion: 0.1.0 + namespace: redis-app + values: + preflight: + enabled: true + server: + replicaCount: 1 diff --git a/tests/dryrun/assets/kotskinds-config.yaml b/tests/dryrun/assets/kotskinds-config.yaml index 9e9db4d3c2..4533825c6d 100644 --- a/tests/dryrun/assets/kotskinds-config.yaml +++ b/tests/dryrun/assets/kotskinds-config.yaml @@ -1,3 +1,6 @@ +# Do not remove the leading "---" separator below. It is intentional and required for +# regression testing of SC-131165 bug fix. +--- apiVersion: kots.io/v1beta1 kind: Config spec: diff --git a/tests/dryrun/assets/chart.tgz b/tests/dryrun/assets/nginx-app-0.1.0.tgz similarity index 100% rename from tests/dryrun/assets/chart.tgz rename to tests/dryrun/assets/nginx-app-0.1.0.tgz diff --git a/tests/dryrun/assets/redis-app-0.1.0.tgz b/tests/dryrun/assets/redis-app-0.1.0.tgz new file mode 100644 index 0000000000..7cea98e092 Binary files /dev/null and b/tests/dryrun/assets/redis-app-0.1.0.tgz differ diff --git a/tests/dryrun/assets/rendered-chart-preflight.yaml b/tests/dryrun/assets/rendered-nginx-chart-preflight.yaml similarity index 100% rename from tests/dryrun/assets/rendered-chart-preflight.yaml rename to tests/dryrun/assets/rendered-nginx-chart-preflight.yaml diff --git a/tests/dryrun/assets/rendered-redis-chart-preflight.yaml b/tests/dryrun/assets/rendered-redis-chart-preflight.yaml new file mode 100644 index 0000000000..511dfa1dd5 --- /dev/null +++ b/tests/dryrun/assets/rendered-redis-chart-preflight.yaml @@ -0,0 +1,32 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: redis-app-preflight + labels: + helm.sh/chart: redis-app-0.1.0 + app.kubernetes.io/name: redis-app + app.kubernetes.io/instance: redis-app + app.kubernetes.io/version: "1.0.0" + app.kubernetes.io/managed-by: Helm +data: + preflight.yaml: | + apiVersion: troubleshoot.sh/v1beta2 + kind: Preflight + metadata: + name: redis-app-preflight + spec: + collectors: + - nodeResources: {} + analyzers: + - nodeResources: + checkName: Node status check + outcomes: + - fail: + when: "nodeCondition(Ready) == False" + message: "Not all nodes are online." + - fail: + when: "nodeCondition(Ready) == Unknown" + message: "Not all nodes are online." + - pass: + message: "All nodes are online." diff --git a/tests/dryrun/util.go b/tests/dryrun/util.go index 8e2f676ae7..a44197ed07 100644 --- a/tests/dryrun/util.go +++ b/tests/dryrun/util.go @@ -63,8 +63,11 @@ var ( //go:embed assets/kotskinds-chart.yaml helmChartData string - //go:embed assets/chart.tgz - helmChartArchiveData string + //go:embed assets/nginx-app-0.1.0.tgz + nginxChartArchiveData string + + //go:embed assets/redis-app-0.1.0.tgz + redisChartArchiveData string //go:embed assets/install-license.yaml licenseData string @@ -156,7 +159,8 @@ func embedReleaseData(clusterConfig string) error { "application.yaml": []byte(applicationData), "config.yaml": []byte(configData), "chart.yaml": []byte(helmChartData), - "nginx-app-0.1.0.tgz": []byte(helmChartArchiveData), + "nginx-app-0.1.0.tgz": []byte(nginxChartArchiveData), + "redis-app-0.1.0.tgz": []byte(redisChartArchiveData), }); err != nil { return fmt.Errorf("set release data: %v", err) } diff --git a/tests/dryrun/v3_install_test.go b/tests/dryrun/v3_install_test.go index bbeb4a543b..fda71f6074 100644 --- a/tests/dryrun/v3_install_test.go +++ b/tests/dryrun/v3_install_test.go @@ -1810,8 +1810,11 @@ func validateVeleroPlugin(t *testing.T, hcli *helm.MockClient) { } var ( - //go:embed assets/rendered-chart-preflight.yaml - renderedChartPreflightData string + //go:embed assets/rendered-nginx-chart-preflight.yaml + renderedNginxChartPreflightData string + + //go:embed assets/rendered-redis-chart-preflight.yaml + renderedRedisChartPreflightData string //go:embed assets/kotskinds-config-values.yaml configValuesData string @@ -1847,7 +1850,8 @@ func setupV3Test(t *testing.T, opts setupV3TestOpts) (string, string) { "application.yaml": []byte(applicationData), "config.yaml": []byte(configData), "chart.yaml": []byte(helmChartData), - "nginx-app-0.1.0.tgz": []byte(helmChartArchiveData), + "nginx-app-0.1.0.tgz": []byte(nginxChartArchiveData), + "redis-app-0.1.0.tgz": []byte(redisChartArchiveData), }); err != nil { t.Fatalf("fail to set release data: %v", err) } @@ -1893,7 +1897,13 @@ func setupV3TestHelmClient() *helm.MockClient { On("Render", mock.Anything, mock.MatchedBy(func(opts helm.InstallOptions) bool { return opts.ReleaseName == "nginx-app" })). - Return([][]byte{[]byte(renderedChartPreflightData)}, nil). + Return([][]byte{[]byte(renderedNginxChartPreflightData)}, nil). + Maybe() + hcli. + On("Render", mock.Anything, mock.MatchedBy(func(opts helm.InstallOptions) bool { + return opts.ReleaseName == "redis-app" + })). + Return([][]byte{[]byte(renderedRedisChartPreflightData)}, nil). Maybe() hcli.On("Close").Return(nil).Maybe() diff --git a/tests/dryrun/v3_upgrade_test.go b/tests/dryrun/v3_upgrade_test.go index 3cff7f43af..546f9b3ee2 100644 --- a/tests/dryrun/v3_upgrade_test.go +++ b/tests/dryrun/v3_upgrade_test.go @@ -308,7 +308,8 @@ func setupV3UpgradeTest(t *testing.T, hcli helm.Client, setupArgs *v3UpgradeSetu "application.yaml": []byte(applicationData), "config.yaml": []byte(configData), "chart.yaml": []byte(helmChartData), - "nginx-app-0.1.0.tgz": []byte(helmChartArchiveData), + "nginx-app-0.1.0.tgz": []byte(nginxChartArchiveData), + "redis-app-0.1.0.tgz": []byte(redisChartArchiveData), }); err != nil { t.Fatalf("fail to set release data: %v", err) } @@ -400,7 +401,13 @@ func setupV3UpgradeTestHelmClient() *helm.MockClient { On("Render", mock.Anything, mock.MatchedBy(func(opts helm.InstallOptions) bool { return opts.ReleaseName == "nginx-app" })). - Return([][]byte{[]byte(renderedChartPreflightData)}, nil). + Return([][]byte{[]byte(renderedNginxChartPreflightData)}, nil). + Maybe() + hcli. + On("Render", mock.Anything, mock.MatchedBy(func(opts helm.InstallOptions) bool { + return opts.ReleaseName == "redis-app" + })). + Return([][]byte{[]byte(renderedRedisChartPreflightData)}, nil). Maybe() hcli.On("Close").Return(nil).Maybe() return hcli