manifest.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. Copyright © The ESO Authors
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. https://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package generator
  14. import (
  15. "time"
  16. //nolint
  17. . "github.com/onsi/ginkgo/v2"
  18. . "github.com/onsi/gomega"
  19. // nolint
  20. v1 "k8s.io/api/core/v1"
  21. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  22. "k8s.io/apimachinery/pkg/types"
  23. "github.com/external-secrets/external-secrets-e2e/framework"
  24. esv1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
  25. genv1alpha1 "github.com/external-secrets/external-secrets/apis/generators/v1alpha1"
  26. )
  27. var _ = Describe("manifest target with generator", Label("manifest"), func() {
  28. f := framework.New("manifest")
  29. var (
  30. fakeGenData = map[string]string{
  31. "host": "localhost",
  32. "port": "5432",
  33. "database": "mydb",
  34. }
  35. )
  36. It("should template generator output into a ConfigMap", func() {
  37. // Create a Fake generator
  38. generator := &genv1alpha1.Fake{
  39. TypeMeta: metav1.TypeMeta{
  40. APIVersion: genv1alpha1.Group + "/" + genv1alpha1.Version,
  41. Kind: genv1alpha1.FakeKind,
  42. },
  43. ObjectMeta: metav1.ObjectMeta{
  44. Name: "manifest-generator",
  45. Namespace: f.Namespace.Name,
  46. },
  47. Spec: genv1alpha1.FakeSpec{
  48. Data: fakeGenData,
  49. },
  50. }
  51. err := f.CRClient.Create(GinkgoT().Context(), generator)
  52. Expect(err).ToNot(HaveOccurred())
  53. // Create an ExternalSecret that targets a ConfigMap
  54. externalSecret := &esv1.ExternalSecret{
  55. ObjectMeta: metav1.ObjectMeta{
  56. Name: "manifest-es",
  57. Namespace: f.Namespace.Name,
  58. },
  59. Spec: esv1.ExternalSecretSpec{
  60. RefreshInterval: &metav1.Duration{Duration: time.Second * 5},
  61. Target: esv1.ExternalSecretTarget{
  62. Name: "generated-configmap",
  63. Manifest: &esv1.ManifestReference{
  64. APIVersion: "v1",
  65. Kind: "ConfigMap",
  66. },
  67. Template: &esv1.ExternalSecretTemplate{
  68. Data: map[string]string{
  69. "host": "{{ .host }}",
  70. "port": "{{ .port }}",
  71. "database": "{{ .database }}",
  72. },
  73. },
  74. },
  75. DataFrom: []esv1.ExternalSecretDataFromRemoteRef{
  76. {
  77. SourceRef: &esv1.StoreGeneratorSourceRef{
  78. GeneratorRef: &esv1.GeneratorRef{
  79. Kind: "Fake",
  80. Name: "manifest-generator",
  81. },
  82. },
  83. },
  84. },
  85. },
  86. }
  87. err = f.CRClient.Create(GinkgoT().Context(), externalSecret)
  88. Expect(err).ToNot(HaveOccurred())
  89. // Wait for ExternalSecret to be ready
  90. Eventually(func() bool {
  91. var es esv1.ExternalSecret
  92. err := f.CRClient.Get(GinkgoT().Context(), types.NamespacedName{
  93. Namespace: externalSecret.Namespace,
  94. Name: externalSecret.Name,
  95. }, &es)
  96. if err != nil {
  97. return false
  98. }
  99. cond := getESCond(es.Status, esv1.ExternalSecretReady)
  100. if cond == nil || cond.Status != v1.ConditionTrue {
  101. return false
  102. }
  103. return true
  104. }).WithTimeout(time.Second * 30).Should(BeTrue())
  105. // Verify the ConfigMap was created with correct data
  106. var configMap v1.ConfigMap
  107. err = f.CRClient.Get(GinkgoT().Context(), types.NamespacedName{
  108. Namespace: externalSecret.Namespace,
  109. Name: externalSecret.Spec.Target.Name,
  110. }, &configMap)
  111. Expect(err).ToNot(HaveOccurred())
  112. // Verify data is plain text, not base64 encoded
  113. Expect(configMap.Data).To(HaveKeyWithValue("host", "localhost"))
  114. Expect(configMap.Data).To(HaveKeyWithValue("port", "5432"))
  115. Expect(configMap.Data).To(HaveKeyWithValue("database", "mydb"))
  116. })
  117. })