secret_test.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  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. "os"
  16. "reflect"
  17. "testing"
  18. "k8s.io/api/core/v1"
  19. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  20. )
  21. func TestSecretGenerate(t *testing.T) {
  22. tests := []struct {
  23. name string
  24. setup func(t *testing.T, params map[string]interface{}) func()
  25. params map[string]interface{}
  26. expected *v1.Secret
  27. expectErr bool
  28. }{
  29. {
  30. name: "test1",
  31. params: map[string]interface{}{
  32. "name": "foo",
  33. },
  34. expected: &v1.Secret{
  35. // this is ok because we know exactly how we want to be serialized
  36. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  37. ObjectMeta: metav1.ObjectMeta{
  38. Name: "foo",
  39. },
  40. Data: map[string][]byte{},
  41. },
  42. expectErr: false,
  43. },
  44. {
  45. name: "test2",
  46. params: map[string]interface{}{
  47. "name": "foo",
  48. "append-hash": true,
  49. },
  50. expected: &v1.Secret{
  51. // this is ok because we know exactly how we want to be serialized
  52. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  53. ObjectMeta: metav1.ObjectMeta{
  54. Name: "foo-949tdgdkgg",
  55. },
  56. Data: map[string][]byte{},
  57. },
  58. expectErr: false,
  59. },
  60. {
  61. name: "test3",
  62. params: map[string]interface{}{
  63. "name": "foo",
  64. "type": "my-type",
  65. },
  66. expected: &v1.Secret{
  67. // this is ok because we know exactly how we want to be serialized
  68. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  69. ObjectMeta: metav1.ObjectMeta{
  70. Name: "foo",
  71. },
  72. Data: map[string][]byte{},
  73. Type: "my-type",
  74. },
  75. expectErr: false,
  76. },
  77. {
  78. name: "test4",
  79. params: map[string]interface{}{
  80. "name": "foo",
  81. "type": "my-type",
  82. "append-hash": true,
  83. },
  84. expected: &v1.Secret{
  85. // this is ok because we know exactly how we want to be serialized
  86. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  87. ObjectMeta: metav1.ObjectMeta{
  88. Name: "foo-dg474f9t76",
  89. },
  90. Data: map[string][]byte{},
  91. Type: "my-type",
  92. },
  93. expectErr: false,
  94. },
  95. {
  96. name: "test5",
  97. params: map[string]interface{}{
  98. "name": "foo",
  99. "from-literal": []string{"key1=value1", "key2=value2"},
  100. },
  101. expected: &v1.Secret{
  102. // this is ok because we know exactly how we want to be serialized
  103. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  104. ObjectMeta: metav1.ObjectMeta{
  105. Name: "foo",
  106. },
  107. Data: map[string][]byte{
  108. "key1": []byte("value1"),
  109. "key2": []byte("value2"),
  110. },
  111. },
  112. expectErr: false,
  113. },
  114. {
  115. name: "test6",
  116. params: map[string]interface{}{
  117. "name": "foo",
  118. "from-literal": []string{"key1=value1", "key2=value2"},
  119. "append-hash": true,
  120. },
  121. expected: &v1.Secret{
  122. // this is ok because we know exactly how we want to be serialized
  123. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  124. ObjectMeta: metav1.ObjectMeta{
  125. Name: "foo-tf72c228m4",
  126. },
  127. Data: map[string][]byte{
  128. "key1": []byte("value1"),
  129. "key2": []byte("value2"),
  130. },
  131. },
  132. expectErr: false,
  133. },
  134. {
  135. name: "test7",
  136. params: map[string]interface{}{
  137. "name": "foo",
  138. "from-literal": []string{"key1value1"},
  139. },
  140. expectErr: true,
  141. },
  142. {
  143. name: "test8",
  144. params: map[string]interface{}{
  145. "name": "foo",
  146. "from-file": []string{"key1=/file=2"},
  147. },
  148. expectErr: true,
  149. },
  150. {
  151. name: "test9",
  152. params: map[string]interface{}{
  153. "name": "foo",
  154. "from-file": []string{"key1==value"},
  155. },
  156. expectErr: true,
  157. },
  158. {
  159. name: "test10",
  160. params: map[string]interface{}{
  161. "name": "foo",
  162. "from-literal": []string{"key1==value1"},
  163. },
  164. expected: &v1.Secret{
  165. // this is ok because we know exactly how we want to be serialized
  166. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  167. ObjectMeta: metav1.ObjectMeta{
  168. Name: "foo",
  169. },
  170. Data: map[string][]byte{
  171. "key1": []byte("=value1"),
  172. },
  173. },
  174. expectErr: false,
  175. },
  176. {
  177. name: "test11",
  178. params: map[string]interface{}{
  179. "name": "foo",
  180. "from-literal": []string{"key1==value1"},
  181. "append-hash": true,
  182. },
  183. expected: &v1.Secret{
  184. // this is ok because we know exactly how we want to be serialized
  185. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  186. ObjectMeta: metav1.ObjectMeta{
  187. Name: "foo-fdcc8tkhh5",
  188. },
  189. Data: map[string][]byte{
  190. "key1": []byte("=value1"),
  191. },
  192. },
  193. expectErr: false,
  194. },
  195. {
  196. name: "test12",
  197. setup: setupEnvFile("key1=value1", "#", "", "key2=value2"),
  198. params: map[string]interface{}{
  199. "name": "valid_env",
  200. "from-env-file": "file.env",
  201. },
  202. expected: &v1.Secret{
  203. // this is ok because we know exactly how we want to be serialized
  204. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  205. ObjectMeta: metav1.ObjectMeta{
  206. Name: "valid_env",
  207. },
  208. Data: map[string][]byte{
  209. "key1": []byte("value1"),
  210. "key2": []byte("value2"),
  211. },
  212. },
  213. expectErr: false,
  214. },
  215. {
  216. name: "test13",
  217. setup: setupEnvFile("key1=value1", "#", "", "key2=value2"),
  218. params: map[string]interface{}{
  219. "name": "valid_env",
  220. "from-env-file": "file.env",
  221. "append-hash": true,
  222. },
  223. expected: &v1.Secret{
  224. // this is ok because we know exactly how we want to be serialized
  225. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  226. ObjectMeta: metav1.ObjectMeta{
  227. Name: "valid_env-bkb2m2965h",
  228. },
  229. Data: map[string][]byte{
  230. "key1": []byte("value1"),
  231. "key2": []byte("value2"),
  232. },
  233. },
  234. expectErr: false,
  235. },
  236. {
  237. name: "test14",
  238. setup: func() func(t *testing.T, params map[string]interface{}) func() {
  239. os.Setenv("g_key1", "1")
  240. os.Setenv("g_key2", "2")
  241. return setupEnvFile("g_key1", "g_key2=")
  242. }(),
  243. params: map[string]interface{}{
  244. "name": "getenv",
  245. "from-env-file": "file.env",
  246. },
  247. expected: &v1.Secret{
  248. // this is ok because we know exactly how we want to be serialized
  249. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  250. ObjectMeta: metav1.ObjectMeta{
  251. Name: "getenv",
  252. },
  253. Data: map[string][]byte{
  254. "g_key1": []byte("1"),
  255. "g_key2": []byte(""),
  256. },
  257. },
  258. expectErr: false,
  259. },
  260. {
  261. name: "test15",
  262. setup: func() func(t *testing.T, params map[string]interface{}) func() {
  263. os.Setenv("g_key1", "1")
  264. os.Setenv("g_key2", "2")
  265. return setupEnvFile("g_key1", "g_key2=")
  266. }(),
  267. params: map[string]interface{}{
  268. "name": "getenv",
  269. "from-env-file": "file.env",
  270. "append-hash": true,
  271. },
  272. expected: &v1.Secret{
  273. // this is ok because we know exactly how we want to be serialized
  274. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  275. ObjectMeta: metav1.ObjectMeta{
  276. Name: "getenv-m7kg2khdb4",
  277. },
  278. Data: map[string][]byte{
  279. "g_key1": []byte("1"),
  280. "g_key2": []byte(""),
  281. },
  282. },
  283. expectErr: false,
  284. },
  285. {
  286. name: "test16",
  287. params: map[string]interface{}{
  288. "name": "too_many_args",
  289. "from-literal": []string{"key1=value1"},
  290. "from-env-file": "file.env",
  291. },
  292. expectErr: true,
  293. },
  294. {
  295. name: "test17",
  296. setup: setupEnvFile("key#1=value1"),
  297. params: map[string]interface{}{
  298. "name": "invalid_key",
  299. "from-env-file": "file.env",
  300. },
  301. expectErr: true,
  302. },
  303. {
  304. name: "test18",
  305. setup: setupEnvFile(" key1= value1"),
  306. params: map[string]interface{}{
  307. "name": "with_spaces",
  308. "from-env-file": "file.env",
  309. },
  310. expected: &v1.Secret{
  311. // this is ok because we know exactly how we want to be serialized
  312. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  313. ObjectMeta: metav1.ObjectMeta{
  314. Name: "with_spaces",
  315. },
  316. Data: map[string][]byte{
  317. "key1": []byte(" value1"),
  318. },
  319. },
  320. expectErr: false,
  321. },
  322. {
  323. name: "test19",
  324. setup: setupEnvFile(" key1= value1"),
  325. params: map[string]interface{}{
  326. "name": "with_spaces",
  327. "from-env-file": "file.env",
  328. "append-hash": true,
  329. },
  330. expected: &v1.Secret{
  331. // this is ok because we know exactly how we want to be serialized
  332. TypeMeta: metav1.TypeMeta{APIVersion: v1.SchemeGroupVersion.String(), Kind: "Secret"},
  333. ObjectMeta: metav1.ObjectMeta{
  334. Name: "with_spaces-4488d5b57d",
  335. },
  336. Data: map[string][]byte{
  337. "key1": []byte(" value1"),
  338. },
  339. },
  340. expectErr: false,
  341. },
  342. }
  343. generator := SecretGeneratorV1{}
  344. for i, tt := range tests {
  345. t.Run(tt.name, func(t *testing.T) {
  346. if tt.setup != nil {
  347. if teardown := tt.setup(t, tt.params); teardown != nil {
  348. defer teardown()
  349. }
  350. }
  351. obj, err := generator.Generate(tt.params)
  352. if !tt.expectErr && err != nil {
  353. t.Errorf("case %d, unexpected error: %v", i, err)
  354. return
  355. }
  356. if tt.expectErr && err != nil {
  357. return
  358. }
  359. if !reflect.DeepEqual(obj.(*v1.Secret), tt.expected) {
  360. t.Errorf("\ncase %d, expected:\n%#v\nsaw:\n%#v", i, tt.expected, obj.(*v1.Secret))
  361. }
  362. })
  363. }
  364. }