gcp.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. limitations under the License.
  10. */
  11. package gcp
  12. import (
  13. "context"
  14. "fmt"
  15. "os"
  16. // nolint
  17. . "github.com/onsi/ginkgo"
  18. // nolint
  19. . "github.com/onsi/gomega"
  20. v1 "k8s.io/api/core/v1"
  21. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  22. esv1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
  23. esmeta "github.com/external-secrets/external-secrets/apis/meta/v1"
  24. "github.com/external-secrets/external-secrets/e2e/framework"
  25. )
  26. const (
  27. targetSecret = "target-secret"
  28. )
  29. var _ = Describe("[gcp] ", func() {
  30. f := framework.New("eso-gcp")
  31. var secretStore *esv1alpha1.SecretStore
  32. projectID := "external-secrets-operator"
  33. credentials := os.Getenv("GCP_SM_SA_JSON")
  34. BeforeEach(func() {
  35. By("creating a secret in GCP SM")
  36. gcpCred := &v1.Secret{
  37. ObjectMeta: metav1.ObjectMeta{
  38. Name: f.Namespace.Name,
  39. Namespace: f.Namespace.Name,
  40. },
  41. StringData: map[string]string{
  42. "secret-access-credentials": credentials,
  43. },
  44. }
  45. err := f.CRClient.Create(context.Background(), gcpCred)
  46. Expect(err).ToNot(HaveOccurred())
  47. secretStore = &esv1alpha1.SecretStore{
  48. ObjectMeta: metav1.ObjectMeta{
  49. Name: f.Namespace.Name,
  50. Namespace: f.Namespace.Name,
  51. },
  52. Spec: esv1alpha1.SecretStoreSpec{
  53. Provider: &esv1alpha1.SecretStoreProvider{
  54. GCPSM: &esv1alpha1.GCPSMProvider{
  55. ProjectID: projectID,
  56. Auth: esv1alpha1.GCPSMAuth{
  57. SecretRef: esv1alpha1.GCPSMAuthSecretRef{
  58. SecretAccessKey: esmeta.SecretKeySelector{
  59. Name: f.Namespace.Name,
  60. Key: "secret-access-credentials",
  61. },
  62. },
  63. },
  64. },
  65. },
  66. },
  67. }
  68. err = f.CRClient.Create(context.Background(), secretStore)
  69. Expect(err).ToNot(HaveOccurred())
  70. })
  71. It("should sync secrets", func() {
  72. By("creating a GCP SM Secret")
  73. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  74. secretValue := "great-value-test"
  75. secret, err := createGCPSecretsManagerSecret(
  76. projectID,
  77. secretKey1, secretValue, []byte(credentials))
  78. Expect(err).ToNot(HaveOccurred())
  79. err = f.CRClient.Create(context.Background(), &esv1alpha1.ExternalSecret{
  80. ObjectMeta: metav1.ObjectMeta{
  81. Name: "simple-sync",
  82. Namespace: f.Namespace.Name,
  83. },
  84. Spec: esv1alpha1.ExternalSecretSpec{
  85. SecretStoreRef: esv1alpha1.SecretStoreRef{
  86. Name: f.Namespace.Name,
  87. },
  88. Target: esv1alpha1.ExternalSecretTarget{
  89. Name: targetSecret,
  90. },
  91. Data: []esv1alpha1.ExternalSecretData{
  92. {
  93. SecretKey: secretKey1,
  94. RemoteRef: esv1alpha1.ExternalSecretDataRemoteRef{
  95. Key: secretKey1,
  96. },
  97. },
  98. },
  99. },
  100. })
  101. Expect(err).ToNot(HaveOccurred())
  102. _, err = f.WaitForSecretValue(f.Namespace.Name, targetSecret, map[string][]byte{
  103. secretKey1: []byte(secretValue),
  104. })
  105. Expect(err).ToNot(HaveOccurred())
  106. err = deleteGCPSecretsManagerSecret(secret.Name, []byte(credentials))
  107. Expect(err).ToNot(HaveOccurred())
  108. })
  109. It("should sync secrets with dataFrom", func() {
  110. By("creating a GCP SM Secret with JSON string")
  111. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  112. targetSecretKey1 := "name"
  113. targetSecretValue1 := "great-name"
  114. targetSecretKey2 := "surname"
  115. targetSecretValue2 := "great-surname"
  116. secretValue := fmt.Sprintf("{ \"%s\": \"%s\", \"%s\": \"%s\" }", targetSecretKey1, targetSecretValue1, targetSecretKey2, targetSecretValue2)
  117. secret, err := createGCPSecretsManagerSecret(
  118. projectID,
  119. secretKey1, secretValue, []byte(credentials))
  120. Expect(err).ToNot(HaveOccurred())
  121. err = f.CRClient.Create(context.Background(), &esv1alpha1.ExternalSecret{
  122. ObjectMeta: metav1.ObjectMeta{
  123. Name: "datafrom-sync",
  124. Namespace: f.Namespace.Name,
  125. },
  126. Spec: esv1alpha1.ExternalSecretSpec{
  127. SecretStoreRef: esv1alpha1.SecretStoreRef{
  128. Name: f.Namespace.Name,
  129. },
  130. Target: esv1alpha1.ExternalSecretTarget{
  131. Name: targetSecret,
  132. },
  133. DataFrom: []esv1alpha1.ExternalSecretDataRemoteRef{
  134. {
  135. Key: secretKey1,
  136. },
  137. },
  138. },
  139. })
  140. Expect(err).ToNot(HaveOccurred())
  141. _, err = f.WaitForSecretValue(f.Namespace.Name, targetSecret, map[string][]byte{
  142. targetSecretKey1: []byte(targetSecretValue1),
  143. targetSecretKey2: []byte(targetSecretValue2),
  144. })
  145. Expect(err).ToNot(HaveOccurred())
  146. err = deleteGCPSecretsManagerSecret(secret.Name, []byte(credentials))
  147. Expect(err).ToNot(HaveOccurred())
  148. })
  149. It("should sync secrets and get inner keys", func() {
  150. By("creating a GCP SM Secret")
  151. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  152. targetSecretKey1 := "firstname"
  153. targetSecretValue1 := "Tom"
  154. targetSecretKey2 := "first_friend"
  155. targetSecretValue2 := "Roger"
  156. secretValue := fmt.Sprintf(
  157. `{
  158. "name": {"first": "%s", "last": "Anderson"},
  159. "friends":
  160. [
  161. {"first": "Dale", "last": "Murphy"},
  162. {"first": "%s", "last": "Craig"},
  163. {"first": "Jane", "last": "Murphy"}
  164. ]
  165. }`, targetSecretValue1, targetSecretValue2)
  166. secret, err := createGCPSecretsManagerSecret(
  167. projectID,
  168. secretKey1, secretValue, []byte(credentials))
  169. Expect(err).ToNot(HaveOccurred())
  170. err = f.CRClient.Create(context.Background(), &esv1alpha1.ExternalSecret{
  171. ObjectMeta: metav1.ObjectMeta{
  172. Name: "datafrom-sync",
  173. Namespace: f.Namespace.Name,
  174. },
  175. Spec: esv1alpha1.ExternalSecretSpec{
  176. SecretStoreRef: esv1alpha1.SecretStoreRef{
  177. Name: f.Namespace.Name,
  178. },
  179. Target: esv1alpha1.ExternalSecretTarget{
  180. Name: targetSecret,
  181. },
  182. Data: []esv1alpha1.ExternalSecretData{
  183. {
  184. SecretKey: targetSecretKey1,
  185. RemoteRef: esv1alpha1.ExternalSecretDataRemoteRef{
  186. Key: secretKey1,
  187. Property: "name.first",
  188. },
  189. },
  190. {
  191. SecretKey: targetSecretKey2,
  192. RemoteRef: esv1alpha1.ExternalSecretDataRemoteRef{
  193. Key: secretKey1,
  194. Property: "friends.1.first",
  195. },
  196. },
  197. },
  198. },
  199. })
  200. Expect(err).ToNot(HaveOccurred())
  201. _, err = f.WaitForSecretValue(f.Namespace.Name, targetSecret, map[string][]byte{
  202. targetSecretKey1: []byte(targetSecretValue1),
  203. targetSecretKey2: []byte(targetSecretValue2),
  204. })
  205. Expect(err).ToNot(HaveOccurred())
  206. err = deleteGCPSecretsManagerSecret(secret.Name, []byte(credentials))
  207. Expect(err).ToNot(HaveOccurred())
  208. })
  209. })