gcp.go 6.6 KB

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