secret_for_tls_test.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /*
  2. Copyright 2015 The Kubernetes 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. http://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 versioned
  14. import (
  15. "fmt"
  16. "os"
  17. "path"
  18. "reflect"
  19. "testing"
  20. "k8s.io/api/core/v1"
  21. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  22. utiltesting "k8s.io/client-go/util/testing"
  23. )
  24. var rsaCertPEM = `-----BEGIN CERTIFICATE-----
  25. MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
  26. BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
  27. aWRnaXRzIFB0eSBMdGQwHhcNMTIwOTEyMjE1MjAyWhcNMTUwOTEyMjE1MjAyWjBF
  28. MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
  29. ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANLJ
  30. hPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wok/4xIA+ui35/MmNa
  31. rtNuC+BdZ1tMuVCPFZcCAwEAAaNQME4wHQYDVR0OBBYEFJvKs8RfJaXTH08W+SGv
  32. zQyKn0H8MB8GA1UdIwQYMBaAFJvKs8RfJaXTH08W+SGvzQyKn0H8MAwGA1UdEwQF
  33. MAMBAf8wDQYJKoZIhvcNAQEFBQADQQBJlffJHybjDGxRMqaRmDhX0+6v02TUKZsW
  34. r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
  35. -----END CERTIFICATE-----
  36. `
  37. var rsaKeyPEM = `-----BEGIN RSA PRIVATE KEY-----
  38. MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
  39. k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
  40. 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
  41. MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
  42. SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
  43. xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
  44. D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
  45. -----END RSA PRIVATE KEY-----
  46. `
  47. const mismatchRSAKeyPEM = `-----BEGIN PRIVATE KEY-----
  48. MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/665h55hWD4V2
  49. kiQ+B/G9NNfBw69eBibEhI9vWkPUyn36GO2r3HPtRE63wBfFpV486ns9DoZnnAYE
  50. JaGjVNCCqS5tQyMBWp843o66KBrEgBpuddChigvyul33FhD1ImFnN+Vy0ajOJ+1/
  51. Zai28zBXWbxCWEbqz7s8e2UsPlBd0Caj4gcd32yD2BwiHqzB8odToWRUT7l+pS8R
  52. qA1BruQvtjEIrcoWVlE170ZYe7+Apm96A+WvtVRkozPynxHF8SuEiw4hAh0lXR6b
  53. 4zZz4tZVV8ev2HpffveV/68GiCyeFDbglqd4sZ/Iga/rwu7bVY/BzFApHwu2hmmV
  54. XLnaa3uVAgMBAAECggEAG+kvnCdtPR7Wvw6z3J2VJ3oW4qQNzfPBEZVhssUC1mB4
  55. f7W+Yt8VsOzdMdXq3yCUmvFS6OdC3rCPI21Bm5pLFKV8DgHUhm7idwfO4/3PHsKu
  56. lV/m7odAA5Xc8oEwCCZu2e8EHHWnQgwGex+SsMCfSCTRvyhNb/qz9TDQ3uVVFL9e
  57. 9a4OKqZl/GlRspJSuXhy+RSVulw9NjeX1VRjIbhqpdXAmQNXgShA+gZSQh8T/tgv
  58. XQYsMtg+FUDvcunJQf4OW5BY7IenYBV/GvsnJU8L7oD0wjNSAwe/iLKqV/NpYhre
  59. QR4DsGnmoRYlUlHdHFTTJpReDjWm+vH3T756yDdFAQKBgQD2/sP5dM/aEW7Z1TgS
  60. TG4ts1t8Rhe9escHxKZQR81dfOxBeCJMBDm6ySfR8rvyUM4VsogxBL/RhRQXsjJM
  61. 7wN08MhdiXG0J5yy/oNo8W6euD8m8Mk1UmqcZjSgV4vA7zQkvkr6DRJdybKsT9mE
  62. jouEwev8sceS6iBpPw/+Ws8z1QKBgQDG6uYHMfMcS844xKQQWhargdN2XBzeG6TV
  63. YXfNFstNpD84d9zIbpG/AKJF8fKrseUhXkJhkDjFGJTriD3QQsntOFaDOrHMnveV
  64. zGzvC4OTFUUFHe0SVJ0HuLf8YCHoZ+DXEeCKCN6zBXnUue+bt3NvLOf2yN5o9kYx
  65. SIa8O1vIwQKBgEdONXWG65qg/ceVbqKZvhUjen3eHmxtTZhIhVsX34nlzq73567a
  66. aXArMnvB/9Bs05IgAIFmRZpPOQW+RBdByVWxTabzTwgbh3mFUJqzWKQpvNGZIf1q
  67. 1axhNUA1BfulEwCojyyxKWQ6HoLwanOCU3T4JxDEokEfpku8EPn1bWwhAoGAAN8A
  68. eOGYHfSbB5ac3VF3rfKYmXkXy0U1uJV/r888vq9Mc5PazKnnS33WOBYyKNxTk4zV
  69. H5ZBGWPdKxbipmnUdox7nIGCS9IaZXaKt5VGUzuRnM8fvafPNDxz2dAV9e2Wh3qV
  70. kCUvzHrmqK7TxMvN3pvEvEju6GjDr+2QYXylD0ECgYAGK5r+y+EhtKkYFLeYReUt
  71. znvSsWq+JCQH/cmtZLaVOldCaMRL625hSl3XPPcMIHE14xi3d4njoXWzvzPcg8L6
  72. vNXk3GiNldACS+vwk4CwEqe5YlZRm5doD07wIdsg2zRlnKsnXNM152OwgmcchDul
  73. rLTt0TTazzwBCgCD0Jkoqg==
  74. -----END PRIVATE KEY-----`
  75. func tearDown(tmpDir string) {
  76. err := os.RemoveAll(tmpDir)
  77. if err != nil {
  78. fmt.Printf("Error in cleaning up test: %v", err)
  79. }
  80. }
  81. func write(path, contents string, t *testing.T) {
  82. f, err := os.Create(path)
  83. if err != nil {
  84. t.Fatalf("Failed to create %v.", path)
  85. }
  86. defer f.Close()
  87. _, err = f.WriteString(contents)
  88. if err != nil {
  89. t.Fatalf("Failed to write to %v.", path)
  90. }
  91. }
  92. func writeKeyPair(tmpDirPath, key, cert string, t *testing.T) (keyPath, certPath string) {
  93. keyPath = path.Join(tmpDirPath, "tls.key")
  94. certPath = path.Join(tmpDirPath, "tls.cert")
  95. write(keyPath, key, t)
  96. write(certPath, cert, t)
  97. return
  98. }
  99. func TestSecretForTLSGenerate(t *testing.T) {
  100. invalidCertTmpDir := utiltesting.MkTmpdirOrDie("tls-test")
  101. defer tearDown(invalidCertTmpDir)
  102. invalidKeyPath, invalidCertPath := writeKeyPair(invalidCertTmpDir, "test", "test", t)
  103. validCertTmpDir := utiltesting.MkTmpdirOrDie("tls-test")
  104. defer tearDown(validCertTmpDir)
  105. validKeyPath, validCertPath := writeKeyPair(validCertTmpDir, rsaKeyPEM, rsaCertPEM, t)
  106. mismatchCertTmpDir := utiltesting.MkTmpdirOrDie("tls-mismatch-test")
  107. defer tearDown(mismatchCertTmpDir)
  108. mismatchKeyPath, mismatchCertPath := writeKeyPair(mismatchCertTmpDir, mismatchRSAKeyPEM, rsaCertPEM, t)
  109. tests := []struct {
  110. name string
  111. params map[string]interface{}
  112. expected *v1.Secret
  113. expectErr bool
  114. }{
  115. {
  116. name: "test-valid-tls-secret",
  117. params: map[string]interface{}{
  118. "name": "foo",
  119. "key": validKeyPath,
  120. "cert": validCertPath,
  121. },
  122. expected: &v1.Secret{
  123. ObjectMeta: metav1.ObjectMeta{
  124. Name: "foo",
  125. },
  126. Data: map[string][]byte{
  127. v1.TLSCertKey: []byte(rsaCertPEM),
  128. v1.TLSPrivateKeyKey: []byte(rsaKeyPEM),
  129. },
  130. Type: v1.SecretTypeTLS,
  131. },
  132. expectErr: false,
  133. },
  134. {
  135. name: "test-valid-tls-secret-append-hash",
  136. params: map[string]interface{}{
  137. "name": "foo",
  138. "key": validKeyPath,
  139. "cert": validCertPath,
  140. "append-hash": true,
  141. },
  142. expected: &v1.Secret{
  143. ObjectMeta: metav1.ObjectMeta{
  144. Name: "foo-272h6tt825",
  145. },
  146. Data: map[string][]byte{
  147. v1.TLSCertKey: []byte(rsaCertPEM),
  148. v1.TLSPrivateKeyKey: []byte(rsaKeyPEM),
  149. },
  150. Type: v1.SecretTypeTLS,
  151. },
  152. expectErr: false,
  153. },
  154. {
  155. name: "test-invalid-key-pair",
  156. params: map[string]interface{}{
  157. "name": "foo",
  158. "key": invalidKeyPath,
  159. "cert": invalidCertPath,
  160. },
  161. expected: &v1.Secret{
  162. ObjectMeta: metav1.ObjectMeta{
  163. Name: "foo",
  164. },
  165. Data: map[string][]byte{
  166. v1.TLSCertKey: []byte("test"),
  167. v1.TLSPrivateKeyKey: []byte("test"),
  168. },
  169. Type: v1.SecretTypeTLS,
  170. },
  171. expectErr: true,
  172. },
  173. {
  174. name: "test-mismatched-key-pair",
  175. params: map[string]interface{}{
  176. "name": "foo",
  177. "key": mismatchKeyPath,
  178. "cert": mismatchCertPath,
  179. },
  180. expected: &v1.Secret{
  181. ObjectMeta: metav1.ObjectMeta{
  182. Name: "foo",
  183. },
  184. Data: map[string][]byte{
  185. v1.TLSCertKey: []byte(rsaCertPEM),
  186. v1.TLSPrivateKeyKey: []byte(mismatchRSAKeyPEM),
  187. },
  188. Type: v1.SecretTypeTLS,
  189. },
  190. expectErr: true,
  191. },
  192. {
  193. name: "test-missing-required-param",
  194. params: map[string]interface{}{
  195. "name": "foo",
  196. "key": "/tmp/foo.key",
  197. },
  198. expectErr: true,
  199. },
  200. }
  201. generator := SecretForTLSGeneratorV1{}
  202. for _, tt := range tests {
  203. t.Run(tt.name, func(t *testing.T) {
  204. obj, err := generator.Generate(tt.params)
  205. if !tt.expectErr && err != nil {
  206. t.Errorf("unexpected error: %v", err)
  207. }
  208. if tt.expectErr && err != nil {
  209. return
  210. }
  211. if !reflect.DeepEqual(obj.(*v1.Secret), tt.expected) {
  212. t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", tt.expected, obj.(*v1.Secret))
  213. }
  214. })
  215. }
  216. }