gcp.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. Copyright © 2025 ESO Maintainer Team
  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 gcp
  14. import (
  15. "crypto/rand"
  16. "crypto/x509"
  17. "encoding/pem"
  18. "fmt"
  19. // nolint
  20. . "github.com/onsi/ginkgo/v2"
  21. v1 "k8s.io/api/core/v1"
  22. p12 "software.sslmate.com/src/go-pkcs12"
  23. // nolint
  24. "github.com/external-secrets/external-secrets-e2e/framework"
  25. "github.com/external-secrets/external-secrets-e2e/suites/provider/cases/common"
  26. esv1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
  27. )
  28. const (
  29. withStaticAuth = "with service account"
  30. withReferentStaticAuth = "with service acount from referent namespace"
  31. )
  32. // This test uses the global ESO.
  33. var _ = Describe("[gcp]", Label("gcp", "secretsmanager"), func() {
  34. f := framework.New("eso-gcp")
  35. prov := NewFromEnv(f, "")
  36. DescribeTable("sync secrets", framework.TableFuncWithExternalSecret(f, prov),
  37. framework.Compose(withStaticAuth, f, common.SimpleDataSync, useStaticAuth),
  38. framework.Compose(withStaticAuth, f, common.JSONDataWithProperty, useStaticAuth),
  39. framework.Compose(withStaticAuth, f, common.JSONDataFromSync, useStaticAuth),
  40. framework.Compose(withStaticAuth, f, common.JSONDataFromRewrite, useStaticAuth),
  41. framework.Compose(withStaticAuth, f, common.NestedJSONWithGJSON, useStaticAuth),
  42. framework.Compose(withStaticAuth, f, common.JSONDataWithTemplate, useStaticAuth),
  43. framework.Compose(withStaticAuth, f, common.DockerJSONConfig, useStaticAuth),
  44. framework.Compose(withStaticAuth, f, common.DataPropertyDockerconfigJSON, useStaticAuth),
  45. framework.Compose(withStaticAuth, f, common.SSHKeySync, useStaticAuth),
  46. framework.Compose(withStaticAuth, f, common.SSHKeySyncDataProperty, useStaticAuth),
  47. framework.Compose(withStaticAuth, f, common.SyncWithoutTargetName, useStaticAuth),
  48. framework.Compose(withStaticAuth, f, common.JSONDataWithoutTargetName, useStaticAuth),
  49. framework.Compose(withStaticAuth, f, common.FindByName, useStaticAuth),
  50. framework.Compose(withStaticAuth, f, common.FindByNameAndRewrite, useStaticAuth),
  51. framework.Compose(withStaticAuth, f, common.FindByNameWithPath, useStaticAuth),
  52. framework.Compose(withStaticAuth, f, common.FindByTag, useStaticAuth),
  53. framework.Compose(withStaticAuth, f, common.FindByTagWithPath, useStaticAuth),
  54. framework.Compose(withStaticAuth, f, p12Cert, useStaticAuth),
  55. // referent auth
  56. framework.Compose(withReferentStaticAuth, f, common.SimpleDataSync, useReferentAuth),
  57. )
  58. })
  59. func useStaticAuth(tc *framework.TestCase) {
  60. tc.ExternalSecret.Spec.SecretStoreRef.Name = tc.Framework.Namespace.Name
  61. }
  62. func useReferentAuth(tc *framework.TestCase) {
  63. tc.ExternalSecret.Spec.SecretStoreRef.Name = referentName(tc.Framework)
  64. tc.ExternalSecret.Spec.SecretStoreRef.Kind = esv1.ClusterSecretStoreKind
  65. }
  66. // P12Cert case creates a secret with a p12 cert containing a privkey and cert bundled together.
  67. // It uses templating to generate a k8s secret of type tls with pem values.
  68. func p12Cert(f *framework.Framework) (string, func(*framework.TestCase)) {
  69. return "should sync p12 encoded cert secret", func(tc *framework.TestCase) {
  70. cloudSecretName := fmt.Sprintf("%s-%s", tc.Framework.Namespace.Name, "p12-cert-example")
  71. certPEM := `-----BEGIN CERTIFICATE-----
  72. MIIFQjCCBCqgAwIBAgISBHszg5W2maz/7CIxGrf7mqukMA0GCSqGSIb3DQEBCwUA
  73. MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
  74. EwJSMzAeFw0yMTA3MjQxMjQyMzNaFw0yMTEwMjIxMjQyMzFaMCgxJjAkBgNVBAMT
  75. HXRlbXBvcmFyeS5leHRlcm5hbC1zZWNyZXRzLmlvMIIBIjANBgkqhkiG9w0BAQEF
  76. AAOCAQ8AMIIBCgKCAQEAyRROdZskA8qnGnoMgQ5Ry5MVY/lgo3HzlhKq02u23J2w
  77. 14w+LiEU2hcSJKYv5OXysbfq7M52u2zXYZXs6krkQZlYNpFw7peZ0JtUbVkSpST/
  78. X4b1GJKDSkRs7fTi+v+pb9OT9rTbtd8jfGe/YCe5rjXEm/ih2DgS13737lKCD5n6
  79. 3QUOG7CR+SKFeRXOGkncqJHAyRkpNfAmS8m1C+ucodfjSFoqAwwVGx7eyEktG4s/
  80. JbwLEb03hGrP15vnnOgxQmiAzWskxhMyHX6vmA71Oq4F3RVsuD3CEjKzgJ2+ghk3
  81. BIY3DZSfSReWSMYM573YFglENi+qJK012XnFmZcevwIDAQABo4ICWjCCAlYwDgYD
  82. VR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNV
  83. HRMBAf8EAjAAMB0GA1UdDgQWBBRvn1wGi46XcyhRIIxJkSSUoCyoNzAfBgNVHSME
  84. GDAWgBQULrMXt1hWy65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYB
  85. BQUHMAGGFWh0dHA6Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDov
  86. L3IzLmkubGVuY3Iub3JnLzAoBgNVHREEITAfgh10ZW1wb3JhcnkuZXh0ZXJuYWwt
  87. c2VjcmV0cy5pbzBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAo
  88. MCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQYGCisG
  89. AQQB1nkCBAIEgfcEgfQA8gB3APZclC/RdzAiFFQYCDCUVo7jTRMZM7/fDC8gC8xO
  90. 8WTjAAABetjA0asAAAQDAEgwRgIhAPYbBNim7q3P0qmD9IrAx1E1fEClYpoLrAVs
  91. 4LGBkQobAiEA+IaTPWs9eHmqtCwar96PNxE0Iucak0DYkgfcWJT5gfYAdwBvU3as
  92. MfAxGdiZAKRRFf93FRwR2QLBACkGjbIImjfZEwAAAXrYwNJTAAAEAwBIMEYCIQDY
  93. xWJKFljK1AW2z/uVsU7TwcAAcIqUf5/nhS04JAwpfwIhANDTvwvcRvPebU7fv6dq
  94. lNH1g2Oyv/4Vm7W+Vrc5cFD0MA0GCSqGSIb3DQEBCwUAA4IBAQAR29s3pDGZbNPN
  95. 5K+Zqg9UDT8s+P0fb9r97T7hWEFkiUtG4bz7QvGzSoDXhD/DZkdjLmkX7+bLiE3L
  96. hRSSYe+Am+Bw5soyzefX2FHAUeOLeK0mJhOrdiKqrW4nnvOOJWLkcWS799kW2z7j
  97. 2MgUWTOz/xXGUOWHt1KjyoM31G3shoAIB9lg3lHbuVIyDd3yyUpjt0zevVdYrO9G
  98. CgI2mJfv26EiddBvgudzN+R5Ayis9czaFHu8gpplaf9DahaKs1Uys6lg0HnzRn3l
  99. XMYitHfpGhc+DTTiTWMQ13J0b1j4yv8A7ZaG2366aa28oSTD6eQFhmVCBwa54j++
  100. IOwzHn5R
  101. -----END CERTIFICATE-----
  102. `
  103. privkeyPEM := `-----BEGIN PRIVATE KEY-----
  104. MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDJFE51myQDyqca
  105. egyBDlHLkxVj+WCjcfOWEqrTa7bcnbDXjD4uIRTaFxIkpi/k5fKxt+rszna7bNdh
  106. lezqSuRBmVg2kXDul5nQm1RtWRKlJP9fhvUYkoNKRGzt9OL6/6lv05P2tNu13yN8
  107. Z79gJ7muNcSb+KHYOBLXfvfuUoIPmfrdBQ4bsJH5IoV5Fc4aSdyokcDJGSk18CZL
  108. ybUL65yh1+NIWioDDBUbHt7ISS0biz8lvAsRvTeEas/Xm+ec6DFCaIDNayTGEzId
  109. fq+YDvU6rgXdFWy4PcISMrOAnb6CGTcEhjcNlJ9JF5ZIxgznvdgWCUQ2L6okrTXZ
  110. ecWZlx6/AgMBAAECggEBAI9sDX5zFuAhdsk6zppqtUrn8TTq1dQe3ihnzjKYvMhl
  111. LZLA9EUA0ZexJv6/DqBMp6u9TDJ2HVgYDRQM1PxUSLTFhJb/bDayKUMS18ha5SKn
  112. 3gKsBzvsnPqnDa84oYF4Q8mAdyRb4e66ZtxAP8985kLtFPxO/llzvXS5mmwBq8Ul
  113. wlLOg5xAXubm3vgLyFm2GW9qI6ZvY9mmh1mv5ZLP8/8hikRjwJijnX3dyqqIAYnc
  114. DHjJYy2I1VxGJybqVQRquG++Tl4qLXbOUZ/lhKe62ARx/MBR9lEst5TURc9N7U3D
  115. Mgsu7FcFwqjVkig3P0XiNRWwCu0HrYee5rLXmtDnF9kCgYEA69+OuJM/RIsrLQQd
  116. 1alppgT+SFyaJM3X1MJD3yxW6Vqqvkhqe7+XCWnmVYcpHPcilWmZnnQ3PiWqPJ8A
  117. 3mIMp+Xg0ddFQXb3n7z4D0Mg4IPzvSKnlieTT1rDhhHRv/xArw1UBkF6kqcnZizZ
  118. FcWcOIt/dYodTWZzPJtLtf7QW0sCgYEA2jy0vJ5rg0/CSinkccreegC6gbbd+oE9
  119. uR/aGeu1XmnULoYYMMy7BLqd8/OiXvujbgUSUWnzbEclR88dPDkiRxDL7mYiaCn+
  120. l9jPuVB1W5x6irJdG/7lpSnLuijpkzey177ZKrlfGsOjtVZsc1ytnqTCWsF1r9eY
  121. yXCSvkJQjd0CgYEA5+vl0hh+MfBA4L9WcnpkNehc+luK+LspB7qHr81SG5qZngVo
  122. JgspAAmPf/Mo+qEI8S5m7MVKeCHitD6HRSHVXdUK7GklYIwQSJEuuxr/HaLAquyD
  123. KYH6NyGAdLfarFHka/rH7mq9kasnczCPtveZdoO7LKBD1ZHxptrvY6CLz+cCgYEA
  124. yEq2xfXPTrDA7DgOhbFfBjHs+mfOyr4a2/Czxt5hkskmB5ziTsdXTTvJA8Ay4WGp
  125. 2Kum6DmJQ3L4cDNR7ZeyMe7ke2QZZ+hC1TITU0zYqL+wZ+LTOYJzWWZGqBAsbwTL
  126. it6JiYCgHHw5n5A18Jq6bcNg7NJpJH2GqDo9M4jBTbECgYEAlMuvNExEXGVzWrGF
  127. NXHpAev64RJ2jTq59jtmxWrNvzeWJREOWd/Nt+0t+bE0sHMfgaMrhNFWiR8oesrF
  128. Jdx0ECYawviQoreDAyIXV6HouoeRbDtLZ9AJvxMoIjGcjAR2FQHc3yx4h/lf3Tfx
  129. x6HaRh+EUwU51von6M9lEF9/p5Q=
  130. -----END PRIVATE KEY-----
  131. `
  132. blockCert, _ := pem.Decode([]byte(certPEM))
  133. cert, _ := x509.ParseCertificate(blockCert.Bytes)
  134. blockPrivKey, _ := pem.Decode([]byte(privkeyPEM))
  135. privkey, _ := x509.ParsePKCS8PrivateKey(blockPrivKey.Bytes)
  136. emptyCACerts := []*x509.Certificate{}
  137. p12Cert, _ := p12.Encode(rand.Reader, privkey, cert, emptyCACerts, "")
  138. tc.Secrets = map[string]framework.SecretEntry{
  139. cloudSecretName: {Value: string(p12Cert)},
  140. }
  141. tc.ExpectedSecret = &v1.Secret{
  142. Type: v1.SecretTypeTLS,
  143. Data: map[string][]byte{
  144. "tls.crt": []byte(certPEM),
  145. "tls.key": []byte(privkeyPEM),
  146. },
  147. }
  148. tc.ExternalSecret.Spec.Data = []esv1.ExternalSecretData{
  149. {
  150. SecretKey: "mysecret",
  151. RemoteRef: esv1.ExternalSecretDataRemoteRef{
  152. Key: cloudSecretName,
  153. },
  154. },
  155. }
  156. tc.ExternalSecret.Spec.Target.Template = &esv1.ExternalSecretTemplate{
  157. Type: v1.SecretTypeTLS,
  158. EngineVersion: esv1.TemplateEngineV2,
  159. Data: map[string]string{
  160. "tls.crt": "{{ .mysecret | pkcs12cert }}",
  161. "tls.key": "{{ .mysecret | pkcs12key }}",
  162. },
  163. }
  164. }
  165. }