Terratest Helm Charts在Go单元测试中失败。

huangapple go评论126阅读模式
英文:

Terratest Helm Charts Fails with Go Unit tests

问题

我正在尝试使用Terratest对我的Helm charts进行单元测试,但遇到了一个奇怪的错误:

这是我的单元测试代码:

  1. package grafana
  2. import (
  3. "fmt"
  4. "testing"
  5. corev1 "k8s.io/api/core/v1"
  6. "github.com/gruntwork-io/terratest/modules/helm"
  7. )
  8. func TestGrafanaHelmChartTemplate(t *testing.T) {
  9. // Path to the helm chart we will test
  10. helmChartGrafanaPath := "../../../open-electrons-monitoring"
  11. // Setup the args. For this test, we will set the following input values:
  12. // - image=grafana:latest
  13. options := &helm.Options{
  14. SetValues: map[string]string{"image": "grafana:latest"},
  15. }
  16. // Run RenderTemplate to render the template and capture the output.
  17. output := helm.RenderTemplate(t, options, helmChartGrafanaPath, "pod", []string{"templates/grafana/grafana-deployment.yml"})
  18. // Now we use kubernetes/client-go library to render the template output into the Pod struct. This will
  19. // ensure the Pod resource is rendered correctly.
  20. var pod corev1.Pod
  21. helm.UnmarshalK8SYaml(t, output, &pod)
  22. // Finally, we verify the pod spec is set to the expected container image value
  23. expectedContainerImage := "grafana:latest"
  24. podContainers := pod.Spec.Containers
  25. fmt.Print(pod.Spec)
  26. fmt.Print("*********************************************************")
  27. if podContainers[0].Image != expectedContainerImage {
  28. t.Fatalf("Rendered container image (%s) is not expected (%s)", podContainers[0].Image, expectedContainerImage)
  29. }
  30. }

这是部署的输出:

  1. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: apiVersion: apps/v1
  2. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: kind: Deployment
  3. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: metadata:
  4. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-open-electrons-monitoring
  5. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: namespace: open-electrons-monitoring-ns
  6. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: labels:
  7. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/name: open-electrons-grafana
  8. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/component: monitoring
  9. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/part-of: open-electrons-grafana
  10. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/managed-by: helm
  11. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/instance: open-electrons-grafana
  12. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/version: refs/tags/v0.0.11 # TODO: Better use the Grafana version
  13. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: spec:
  14. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: replicas: 1
  15. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: selector:
  16. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: matchLabels:
  17. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app: open-electrons-grafana
  18. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: strategy:
  19. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: rollingUpdate:
  20. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: maxSurge: 1
  21. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: maxUnavailable: 1
  22. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: type: RollingUpdate
  23. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: template:
  24. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: metadata:
  25. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: creationTimestamp: null
  26. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: labels:
  27. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: open-electrons-grafana
  28. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: spec:
  29. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: securityContext:
  30. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: runAsUser: 1000
  31. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: runAsGroup: 3000
  32. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: fsGroup: 2000
  33. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: runAsNonRoot: true
  34. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: containers:
  35. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - image: grafana/grafana:latest
  36. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: imagePullPolicy: IfNotPresent
  37. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: open-electrons-grafana
  38. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: ports:
  39. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - containerPort: 3000
  40. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: protocol: TCP
  41. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: resources:
  42. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: limits:
  43. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: memory: "1Gi"
  44. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: cpu: "1000m"
  45. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: requests:
  46. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: memory: 500M
  47. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: cpu: "500m"
  48. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: volumeMounts:
  49. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - mountPath: /var/lib/grafana
  50. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-storage
  51. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - mountPath: /etc/grafana/provisioning/datasources
  52. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-datasources
  53. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: readOnly: false
  54. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: restartPolicy: Always
  55. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: terminationGracePeriodSeconds: 30
  56. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: volumes:
  57. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - name: grafana-storage
  58. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: emptyDir: {}
  59. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - name: grafana-datasources
  60. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: configMap:
  61. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: defaultMode: 420
  62. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-datasources

这是输出:

  1. panic: runtime error: index out of range [0] with length 0 [recovered]
  2. panic: runtime error: index out of range [0] with length 0
  3. goroutine 5 [running]:
  4. testing.tRunner.func1.2({0x1440620, 0xc0002a85b8})
  5. /usr/local/go/src/testing/testing.go:1526 +0x24e
  6. testing.tRunner.func1()
  7. /usr/local/go/src/testing/testing.go:1529 +0x39f
  8. panic({0x1440620, 0xc0002a85b8})
  9. /usr/local/go/src/runtime/panic.go:884 +0x213

为什么会失败?我在这里漏掉了什么?

英文:

I'm trying to unit test my Helm charts using Terratest, but running into a strange error:

Here is my unit test:

  1. package grafana
  2. import (
  3. "fmt"
  4. "testing"
  5. corev1 "k8s.io/api/core/v1"
  6. "github.com/gruntwork-io/terratest/modules/helm"
  7. )
  8. func TestGrafanaHelmChartTemplate(t *testing.T) {
  9. // Path to the helm chart we will test
  10. helmChartGrafanaPath := "../../../open-electrons-monitoring"
  11. // Setup the args. For this test, we will set the following input values:
  12. // - image=grafana:latest
  13. options := &helm.Options{
  14. SetValues: map[string]string{"image": "grafana:latest"},
  15. }
  16. // Run RenderTemplate to render the template and capture the output.
  17. output := helm.RenderTemplate(t, options, helmChartGrafanaPath, "pod", []string{"templates/grafana/grafana-deployment.yml"})
  18. // Now we use kubernetes/client-go library to render the template output into the Pod struct. This will
  19. // ensure the Pod resource is rendered correctly.
  20. var pod corev1.Pod
  21. helm.UnmarshalK8SYaml(t, output, &pod)
  22. // Finally, we verify the pod spec is set to the expected container image value
  23. expectedContainerImage := "grafana:latest"
  24. podContainers := pod.Spec.Containers
  25. fmt.Print(pod.Spec)
  26. fmt.Print("*********************************************************")
  27. if podContainers[0].Image != expectedContainerImage {
  28. t.Fatalf("Rendered container image (%s) is not expected (%s)", podContainers[0].Image, expectedContainerImage)
  29. }
  30. }

Here is what the output of the deployment looks like:

  1. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: apiVersion: apps/v1
  2. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: kind: Deployment
  3. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: metadata:
  4. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-open-electrons-monitoring
  5. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: namespace: open-electrons-monitoring-ns
  6. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: labels:
  7. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/name: open-electrons-grafana
  8. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/component: monitoring
  9. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/part-of: open-electrons-grafana
  10. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/managed-by: helm
  11. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/instance: open-electrons-grafana
  12. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app.kubernetes.io/version: refs/tags/v0.0.11 # TODO: Better use the Grafana version
  13. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: spec:
  14. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: replicas: 1
  15. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: selector:
  16. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: matchLabels:
  17. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: app: open-electrons-grafana
  18. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: strategy:
  19. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: rollingUpdate:
  20. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: maxSurge: 1
  21. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: maxUnavailable: 1
  22. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: type: RollingUpdate
  23. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: template:
  24. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: metadata:
  25. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: creationTimestamp: null
  26. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: labels:
  27. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: open-electrons-grafana
  28. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: spec:
  29. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: securityContext:
  30. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: runAsUser: 1000
  31. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: runAsGroup: 3000
  32. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: fsGroup: 2000
  33. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: runAsNonRoot: true
  34. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: containers:
  35. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - image: grafana/grafana:latest
  36. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: imagePullPolicy: IfNotPresent
  37. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: open-electrons-grafana
  38. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: ports:
  39. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - containerPort: 3000
  40. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: protocol: TCP
  41. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: resources:
  42. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: limits:
  43. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: memory: "1Gi"
  44. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: cpu: "1000m"
  45. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: requests:
  46. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: memory: 500M
  47. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: cpu: "500m"
  48. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: volumeMounts:
  49. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - mountPath: /var/lib/grafana
  50. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-storage
  51. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - mountPath: /etc/grafana/provisioning/datasources
  52. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-datasources
  53. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: readOnly: false
  54. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: restartPolicy: Always
  55. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: terminationGracePeriodSeconds: 30
  56. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: volumes:
  57. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - name: grafana-storage
  58. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: emptyDir: {}
  59. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: - name: grafana-datasources
  60. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: configMap:
  61. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: defaultMode: 420
  62. TestGrafanaHelmChartTemplate 2023-02-12T18:59:01+01:00 logger.go:66: name: grafana-datasources
  63. {[] [] [] [] <nil> <nil> map[] <nil> false false false <nil> nil [] nil [] [] <nil> nil [] <nil> <nil> <nil> map[] [] <nil>}*********************************************************--- FAIL: TestGrafanaHelmChartTemplate (0.06s)

Here is the output:

  1. panic: runtime error: index out of range [0] with length 0 [recovered]
  2. panic: runtime error: index out of range [0] with length 0
  3. goroutine 5 [running]:
  4. testing.tRunner.func1.2({0x1440620, 0xc0002a85b8})
  5. /usr/local/go/src/testing/testing.go:1526 +0x24e
  6. testing.tRunner.func1()
  7. /usr/local/go/src/testing/testing.go:1529 +0x39f
  8. panic({0x1440620, 0xc0002a85b8})
  9. /usr/local/go/src/runtime/panic.go:884 +0x213

Why should this fail? What am I missing here?

答案1

得分: 0

我成功修复了。导入应该像这样:

  1. appsv1 "k8s.io/api/apps/v1"

然后我需要修改Deployment对象的实例化方式:

  1. var deployment appsv1.Deployment

而不是Pod对象。

英文:

I managed to get it fixed. The import should be like this:

  1. appsv1 "k8s.io/api/apps/v1"

I then have to modify the instantiation of the Deployment object:

  1. var deployment appsv1.Deployment

instead of the Pod object.

huangapple
  • 本文由 发表于 2023年2月13日 02:03:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/75429085.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定