common.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  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 common
  12. import (
  13. "context"
  14. "fmt"
  15. "time"
  16. "github.com/onsi/gomega"
  17. v1 "k8s.io/api/core/v1"
  18. "k8s.io/apimachinery/pkg/api/errors"
  19. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  20. "sigs.k8s.io/controller-runtime/pkg/client"
  21. "github.com/external-secrets/external-secrets-e2e/framework"
  22. esv1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
  23. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  24. )
  25. const (
  26. // Constants.
  27. dockerConfigExampleName = "docker-config-example"
  28. dockerConfigJSONKey = ".dockerconfigjson"
  29. mysecretToStringTemplating = "{{ .mysecret }}"
  30. sshPrivateKey = "ssh-privatekey"
  31. secretValue1 = "{\"foo1\":\"foo1-val\",\"bar1\":\"bar1-val\"}"
  32. secretValue2 = "{\"foo2\":\"foo2-val\",\"bar2\":\"bar2-val\"}"
  33. )
  34. // This case creates one secret with json values and syncs them using a single .Spec.DataFrom block.
  35. func SyncV1Alpha1(f *framework.Framework) (string, func(*framework.TestCase)) {
  36. return "[common] should sync secrets from v1alpha1 spec", func(tc *framework.TestCase) {
  37. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  38. targetSecretKey1 := "alpha-name"
  39. targetSecretValue1 := "alpha-great-name"
  40. targetSecretKey2 := "alpha-surname"
  41. targetSecretValue2 := "alpha-great-surname"
  42. secretValue := fmt.Sprintf("{ %q: %q, %q: %q }", targetSecretKey1, targetSecretValue1, targetSecretKey2, targetSecretValue2)
  43. tc.Secrets = map[string]framework.SecretEntry{
  44. secretKey1: {Value: secretValue},
  45. }
  46. tc.ExpectedSecret = &v1.Secret{
  47. Type: v1.SecretTypeOpaque,
  48. Data: map[string][]byte{
  49. targetSecretKey1: []byte(targetSecretValue1),
  50. targetSecretKey2: []byte(targetSecretValue2),
  51. },
  52. }
  53. tc.ExternalSecretV1Alpha1 = &esv1alpha1.ExternalSecret{
  54. ObjectMeta: metav1.ObjectMeta{
  55. Name: "e2e-es",
  56. Namespace: f.Namespace.Name,
  57. },
  58. Spec: esv1alpha1.ExternalSecretSpec{
  59. RefreshInterval: &metav1.Duration{Duration: time.Second * 5},
  60. SecretStoreRef: esv1alpha1.SecretStoreRef{
  61. Name: f.Namespace.Name,
  62. },
  63. Target: esv1alpha1.ExternalSecretTarget{
  64. Name: framework.TargetSecretName,
  65. },
  66. DataFrom: []esv1alpha1.ExternalSecretDataRemoteRef{
  67. {
  68. Key: secretKey1,
  69. },
  70. },
  71. },
  72. }
  73. }
  74. }
  75. // This case creates multiple secrets with simple key/value pairs and syncs them using multiple .Spec.Data blocks.
  76. // Not supported by: vault.
  77. func SimpleDataSync(f *framework.Framework) (string, func(*framework.TestCase)) {
  78. return "[common] should sync simple secrets from .Data[]", func(tc *framework.TestCase) {
  79. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  80. secretKey2 := fmt.Sprintf("%s-%s", f.Namespace.Name, "other")
  81. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  82. remoteRefKey2 := f.MakeRemoteRefKey(secretKey2)
  83. secretValue := "bar"
  84. tc.Secrets = map[string]framework.SecretEntry{
  85. remoteRefKey1: {Value: secretValue},
  86. remoteRefKey2: {Value: secretValue},
  87. }
  88. tc.ExpectedSecret = &v1.Secret{
  89. Type: v1.SecretTypeOpaque,
  90. Data: map[string][]byte{
  91. secretKey1: []byte(secretValue),
  92. secretKey2: []byte(secretValue),
  93. },
  94. }
  95. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  96. {
  97. SecretKey: secretKey1,
  98. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  99. Key: remoteRefKey1,
  100. },
  101. },
  102. {
  103. SecretKey: secretKey2,
  104. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  105. Key: remoteRefKey2,
  106. },
  107. },
  108. }
  109. }
  110. }
  111. // This case creates a secret with empty target name to test if it defaults to external secret name.
  112. // Not supported by: vault.
  113. func SyncWithoutTargetName(f *framework.Framework) (string, func(*framework.TestCase)) {
  114. return "[common] should sync with empty target name.", func(tc *framework.TestCase) {
  115. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  116. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  117. secretValue := "bar"
  118. tc.Secrets = map[string]framework.SecretEntry{
  119. remoteRefKey1: {Value: secretValue},
  120. }
  121. tc.ExpectedSecret = &v1.Secret{
  122. Type: v1.SecretTypeOpaque,
  123. Data: map[string][]byte{
  124. secretKey1: []byte(secretValue),
  125. },
  126. }
  127. tc.ExternalSecret.Spec.Target.Name = ""
  128. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  129. {
  130. SecretKey: secretKey1,
  131. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  132. Key: remoteRefKey1,
  133. },
  134. },
  135. }
  136. }
  137. }
  138. // This case creates multiple secrets with json values and syncs them using multiple .Spec.Data blocks.
  139. // The data is extracted from the JSON key using ref.Property.
  140. func JSONDataWithProperty(f *framework.Framework) (string, func(*framework.TestCase)) {
  141. return "[common] should sync multiple secrets from .Data[]", func(tc *framework.TestCase) {
  142. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  143. secretKey2 := fmt.Sprintf("%s-%s", f.Namespace.Name, "two")
  144. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  145. remoteRefKey2 := f.MakeRemoteRefKey(secretKey2)
  146. tc.Secrets = map[string]framework.SecretEntry{
  147. remoteRefKey1: {Value: secretValue1},
  148. remoteRefKey2: {Value: secretValue2},
  149. }
  150. tc.ExpectedSecret = &v1.Secret{
  151. Type: v1.SecretTypeOpaque,
  152. Data: map[string][]byte{
  153. secretKey1: []byte("foo1-val"),
  154. secretKey2: []byte("bar2-val"),
  155. },
  156. }
  157. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  158. {
  159. SecretKey: secretKey1,
  160. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  161. Key: remoteRefKey1,
  162. Property: "foo1",
  163. },
  164. },
  165. {
  166. SecretKey: secretKey2,
  167. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  168. Key: remoteRefKey2,
  169. Property: "bar2",
  170. },
  171. },
  172. }
  173. }
  174. }
  175. // This case creates a secret with empty target name to test if it defaults to external secret name.
  176. // The data is extracted from the JSON key using ref.Property.
  177. func JSONDataWithoutTargetName(f *framework.Framework) (string, func(*framework.TestCase)) {
  178. return "[common] should sync with empty target name, using json.", func(tc *framework.TestCase) {
  179. secretKey := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  180. remoteRefKey := f.MakeRemoteRefKey(secretKey)
  181. secretValue := "{\"foo\":\"foo-val\",\"bar\":\"bar-val\"}"
  182. tc.Secrets = map[string]framework.SecretEntry{
  183. remoteRefKey: {Value: secretValue},
  184. }
  185. tc.ExpectedSecret = &v1.Secret{
  186. Type: v1.SecretTypeOpaque,
  187. Data: map[string][]byte{
  188. secretKey: []byte("foo-val"),
  189. },
  190. }
  191. tc.ExternalSecret.Spec.Target.Name = ""
  192. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  193. {
  194. SecretKey: secretKey,
  195. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  196. Key: remoteRefKey,
  197. Property: "foo",
  198. },
  199. },
  200. }
  201. }
  202. }
  203. // This case creates multiple secrets with json values and renders a template.
  204. // The data is extracted from the JSON key using ref.Property.
  205. func JSONDataWithTemplate(f *framework.Framework) (string, func(*framework.TestCase)) {
  206. return "[common] should sync json secrets with template", func(tc *framework.TestCase) {
  207. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  208. secretKey2 := fmt.Sprintf("%s-%s", f.Namespace.Name, "other")
  209. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  210. remoteRefKey2 := f.MakeRemoteRefKey(secretKey2)
  211. tc.Secrets = map[string]framework.SecretEntry{
  212. remoteRefKey1: {Value: secretValue1},
  213. remoteRefKey2: {Value: secretValue2},
  214. }
  215. tc.ExpectedSecret = &v1.Secret{
  216. Type: v1.SecretTypeOpaque,
  217. ObjectMeta: metav1.ObjectMeta{
  218. Annotations: map[string]string{
  219. "example": "annotation",
  220. },
  221. Labels: map[string]string{
  222. "example": "label",
  223. },
  224. },
  225. Data: map[string][]byte{
  226. "my-data": []byte(`executed: foo1-val|bar2-val`),
  227. },
  228. }
  229. tc.ExternalSecret.Spec.Target.Template = &esv1beta1.ExternalSecretTemplate{
  230. Metadata: esv1beta1.ExternalSecretTemplateMetadata{
  231. Annotations: map[string]string{
  232. "example": "annotation",
  233. },
  234. Labels: map[string]string{
  235. "example": "label",
  236. },
  237. },
  238. Data: map[string]string{
  239. "my-data": "executed: {{ .one }}|{{ .two }}",
  240. },
  241. }
  242. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  243. {
  244. SecretKey: "one",
  245. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  246. Key: remoteRefKey1,
  247. Property: "foo1",
  248. },
  249. },
  250. {
  251. SecretKey: "two",
  252. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  253. Key: remoteRefKey2,
  254. Property: "bar2",
  255. },
  256. },
  257. }
  258. }
  259. }
  260. // This case creates multiple secrets with json values and renders a template from string.
  261. // The data is extracted from the JSON key using ref.Property.
  262. func JSONDataWithTemplateFromLiteral(f *framework.Framework) (string, func(*framework.TestCase)) {
  263. return "[common] should sync json secrets with template", func(tc *framework.TestCase) {
  264. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  265. secretKey2 := fmt.Sprintf("%s-%s", f.Namespace.Name, "other")
  266. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  267. remoteRefKey2 := f.MakeRemoteRefKey(secretKey2)
  268. tc.Secrets = map[string]framework.SecretEntry{
  269. remoteRefKey1: {Value: secretValue1},
  270. remoteRefKey2: {Value: secretValue2},
  271. }
  272. tc.ExpectedSecret = &v1.Secret{
  273. Type: v1.SecretTypeOpaque,
  274. Data: map[string][]byte{
  275. "executed-foo1-val": []byte(`bar2-val`),
  276. },
  277. }
  278. tplString := `executed-{{ .one }}: {{ .two }}`
  279. tc.ExternalSecret.Spec.Target.Template = &esv1beta1.ExternalSecretTemplate{
  280. TemplateFrom: []esv1beta1.TemplateFrom{
  281. {
  282. Literal: &tplString,
  283. Target: esv1beta1.TemplateTargetData,
  284. },
  285. },
  286. }
  287. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  288. {
  289. SecretKey: "one",
  290. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  291. Key: remoteRefKey1,
  292. Property: "foo1",
  293. },
  294. },
  295. {
  296. SecretKey: "two",
  297. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  298. Key: remoteRefKey2,
  299. Property: "bar2",
  300. },
  301. },
  302. }
  303. }
  304. }
  305. // This case creates multiple secrets with json values and renders a template from string.
  306. // The data is extracted from the JSON key using ref.Property.
  307. func TemplateFromConfigmaps(f *framework.Framework) (string, func(*framework.TestCase)) {
  308. return "[common] should sync from templateFrom Configmaps", func(tc *framework.TestCase) {
  309. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  310. secretKey2 := fmt.Sprintf("%s-%s", f.Namespace.Name, "other")
  311. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  312. remoteRefKey2 := f.MakeRemoteRefKey(secretKey2)
  313. tc.AdditionalObjects = []client.Object{
  314. &v1.ConfigMap{
  315. ObjectMeta: metav1.ObjectMeta{
  316. Name: "test",
  317. Namespace: f.Namespace.Name,
  318. },
  319. Data: map[string]string{
  320. "config.json": `executed-{{ .one}}-{{ .two}}`,
  321. "templated": `executed-{{ .one}}: {{ .two}}`,
  322. },
  323. },
  324. }
  325. tc.Secrets = map[string]framework.SecretEntry{
  326. remoteRefKey1: {Value: secretValue1},
  327. remoteRefKey2: {Value: secretValue2},
  328. }
  329. tc.ExpectedSecret = &v1.Secret{
  330. Type: v1.SecretTypeOpaque,
  331. Data: map[string][]byte{
  332. "executed-foo1-val": []byte(`bar2-val`),
  333. "config.json": []byte(`executed-foo1-val-bar2-val`),
  334. },
  335. }
  336. tc.ExternalSecret.Spec.Target.Template = &esv1beta1.ExternalSecretTemplate{
  337. TemplateFrom: []esv1beta1.TemplateFrom{
  338. {
  339. ConfigMap: &esv1beta1.TemplateRef{
  340. Name: "test",
  341. Items: []esv1beta1.TemplateRefItem{
  342. {
  343. Key: "config.json",
  344. TemplateAs: esv1beta1.TemplateScopeValues,
  345. },
  346. {
  347. Key: "templated",
  348. TemplateAs: esv1beta1.TemplateScopeKeysAndValues,
  349. },
  350. },
  351. },
  352. Target: esv1beta1.TemplateTargetData,
  353. },
  354. },
  355. }
  356. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  357. {
  358. SecretKey: "one",
  359. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  360. Key: remoteRefKey1,
  361. Property: "foo1",
  362. },
  363. },
  364. {
  365. SecretKey: "two",
  366. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  367. Key: remoteRefKey2,
  368. Property: "bar2",
  369. },
  370. },
  371. }
  372. }
  373. }
  374. // This case creates one secret with json values and syncs them using a single .Spec.DataFrom block.
  375. func JSONDataFromSync(f *framework.Framework) (string, func(*framework.TestCase)) {
  376. return "[common] should sync secrets with dataFrom", func(tc *framework.TestCase) {
  377. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  378. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  379. targetSecretKey1 := "name"
  380. targetSecretValue1 := "great-name"
  381. targetSecretKey2 := "surname"
  382. targetSecretValue2 := "great-surname"
  383. secretValue := fmt.Sprintf("{ %q: %q, %q: %q }", targetSecretKey1, targetSecretValue1, targetSecretKey2, targetSecretValue2)
  384. tc.Secrets = map[string]framework.SecretEntry{
  385. remoteRefKey1: {Value: secretValue},
  386. }
  387. tc.ExpectedSecret = &v1.Secret{
  388. Type: v1.SecretTypeOpaque,
  389. Data: map[string][]byte{
  390. targetSecretKey1: []byte(targetSecretValue1),
  391. targetSecretKey2: []byte(targetSecretValue2),
  392. },
  393. }
  394. tc.ExternalSecret.Spec.DataFrom = []esv1beta1.ExternalSecretDataFromRemoteRef{
  395. {
  396. Extract: &esv1beta1.ExternalSecretDataRemoteRef{
  397. Key: remoteRefKey1,
  398. },
  399. },
  400. }
  401. }
  402. }
  403. // This case creates one secret with json values and syncs them using a single .Spec.DataFrom block.
  404. func JSONDataFromRewrite(f *framework.Framework) (string, func(*framework.TestCase)) {
  405. return "[common] should sync and rewrite secrets with dataFrom", func(tc *framework.TestCase) {
  406. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  407. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  408. targetSecretKey1 := "username"
  409. targetSecretValue1 := "myuser.name"
  410. targetSecretKey2 := "address"
  411. targetSecretValue2 := "happy street"
  412. secretValue := fmt.Sprintf("{ %q: %q, %q: %q }", targetSecretKey1, targetSecretValue1, targetSecretKey2, targetSecretValue2)
  413. tc.Secrets = map[string]framework.SecretEntry{
  414. remoteRefKey1: {Value: secretValue},
  415. }
  416. tc.ExpectedSecret = &v1.Secret{
  417. Type: v1.SecretTypeOpaque,
  418. Data: map[string][]byte{
  419. "my_username": []byte(targetSecretValue1),
  420. "my_address": []byte(targetSecretValue2),
  421. },
  422. }
  423. tc.ExternalSecret.Spec.DataFrom = []esv1beta1.ExternalSecretDataFromRemoteRef{
  424. {
  425. Extract: &esv1beta1.ExternalSecretDataRemoteRef{
  426. Key: remoteRefKey1,
  427. },
  428. Rewrite: []esv1beta1.ExternalSecretRewrite{
  429. {
  430. Regexp: &esv1beta1.ExternalSecretRewriteRegexp{
  431. Source: "(.*)",
  432. Target: "my_$1",
  433. },
  434. },
  435. },
  436. },
  437. }
  438. }
  439. }
  440. // This case creates a secret with a nested json value. It is synced into two secrets.
  441. // The values from the nested data are extracted using gjson.
  442. // not supported by: vault.
  443. func NestedJSONWithGJSON(f *framework.Framework) (string, func(*framework.TestCase)) {
  444. return "[common] should sync nested json secrets and get inner keys", func(tc *framework.TestCase) {
  445. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  446. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  447. targetSecretKey1 := "firstname"
  448. targetSecretValue1 := "Tom"
  449. targetSecretKey2 := "first_friend"
  450. targetSecretValue2 := "Roger"
  451. secretValue := fmt.Sprintf(
  452. `{
  453. "name": {"first": "%s", "last": "Anderson"},
  454. "friends":
  455. [
  456. {"first": "Dale", "last": "Murphy"},
  457. {"first": "%s", "last": "Craig"},
  458. {"first": "Jane", "last": "Murphy"}
  459. ]
  460. }`, targetSecretValue1, targetSecretValue2)
  461. tc.Secrets = map[string]framework.SecretEntry{
  462. remoteRefKey1: {Value: secretValue},
  463. }
  464. tc.ExpectedSecret = &v1.Secret{
  465. Type: v1.SecretTypeOpaque,
  466. Data: map[string][]byte{
  467. targetSecretKey1: []byte(targetSecretValue1),
  468. targetSecretKey2: []byte(targetSecretValue2),
  469. },
  470. }
  471. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  472. {
  473. SecretKey: targetSecretKey1,
  474. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  475. Key: remoteRefKey1,
  476. Property: "name.first",
  477. },
  478. },
  479. {
  480. SecretKey: targetSecretKey2,
  481. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  482. Key: remoteRefKey1,
  483. Property: "friends.1.first",
  484. },
  485. },
  486. }
  487. }
  488. }
  489. // This case creates a secret with a Docker json configuration value.
  490. // The values from the nested data are extracted using gjson.
  491. // not supported by: vault.
  492. func DockerJSONConfig(f *framework.Framework) (string, func(*framework.TestCase)) {
  493. return "[common] should sync docker configurated json secrets with template simple", func(tc *framework.TestCase) {
  494. cloudSecretName := fmt.Sprintf("%s-%s", f.Namespace.Name, dockerConfigExampleName)
  495. cloudRemoteRefKey := f.MakeRemoteRefKey(cloudSecretName)
  496. dockerconfig := `{"auths":{"https://index.docker.io/v1/":{"auth":"c3R...zE2"}}}`
  497. cloudSecretValue := fmt.Sprintf(`{"dockerconfig": %s}`, dockerconfig)
  498. tc.Secrets = map[string]framework.SecretEntry{
  499. cloudRemoteRefKey: {Value: cloudSecretValue},
  500. }
  501. tc.ExpectedSecret = &v1.Secret{
  502. Type: v1.SecretTypeOpaque,
  503. Data: map[string][]byte{
  504. dockerConfigJSONKey: []byte(dockerconfig),
  505. },
  506. }
  507. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  508. {
  509. SecretKey: "mysecret",
  510. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  511. Key: cloudRemoteRefKey,
  512. Property: "dockerconfig",
  513. },
  514. },
  515. }
  516. tc.ExternalSecret.Spec.Target.Template = &esv1beta1.ExternalSecretTemplate{
  517. Data: map[string]string{
  518. dockerConfigJSONKey: mysecretToStringTemplating,
  519. },
  520. }
  521. }
  522. }
  523. // This case creates a secret with a Docker json configuration value.
  524. // The values from the nested data are extracted using gjson.
  525. // Need to have a key holding dockerconfig to be supported by vault.
  526. func DataPropertyDockerconfigJSON(f *framework.Framework) (string, func(*framework.TestCase)) {
  527. return "[common] should sync docker configurated json secrets with template", func(tc *framework.TestCase) {
  528. cloudSecretName := fmt.Sprintf("%s-%s", f.Namespace.Name, dockerConfigExampleName)
  529. cloudRemoteRefKey := f.MakeRemoteRefKey(cloudSecretName)
  530. dockerconfigString := `"{\"auths\":{\"https://index.docker.io/v1/\": {\"auth\": \"c3R...zE2\"}}}"`
  531. dockerconfig := `{"auths":{"https://index.docker.io/v1/": {"auth": "c3R...zE2"}}}`
  532. cloudSecretValue := fmt.Sprintf(`{"dockerconfig": %s}`, dockerconfigString)
  533. tc.Secrets = map[string]framework.SecretEntry{
  534. cloudRemoteRefKey: {Value: cloudSecretValue},
  535. }
  536. tc.ExpectedSecret = &v1.Secret{
  537. Type: v1.SecretTypeDockerConfigJson,
  538. Data: map[string][]byte{
  539. dockerConfigJSONKey: []byte(dockerconfig),
  540. },
  541. }
  542. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  543. {
  544. SecretKey: "mysecret",
  545. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  546. Key: cloudRemoteRefKey,
  547. Property: "dockerconfig",
  548. },
  549. },
  550. }
  551. tc.ExternalSecret.Spec.Target.Template = &esv1beta1.ExternalSecretTemplate{
  552. Type: v1.SecretTypeDockerConfigJson,
  553. Data: map[string]string{
  554. dockerConfigJSONKey: mysecretToStringTemplating,
  555. },
  556. }
  557. }
  558. }
  559. // This case adds an ssh private key secret and synchronizes it.
  560. // Not supported by: vault. Json parsing error.
  561. func SSHKeySync(f *framework.Framework) (string, func(*framework.TestCase)) {
  562. return "[common] should sync ssh key secret", func(tc *framework.TestCase) {
  563. sshSecretName := fmt.Sprintf("%s-%s", f.Namespace.Name, "ssh-priv-key-example")
  564. sshSecretValue := `-----BEGIN OPENSSH PRIVATE KEY-----
  565. b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
  566. NhAAAAAwEAAQAAAYEAsARoZUqo6L5dd0WRjZ2QPq/kKlbjtUY1njzJ01UtdC1u1eSJFUnV
  567. K1J+9b1kEqI4lgAaItaYbpJNSgCe97z6DRxEMTUQ3VhB+X+mPfcN2/I0bYklRxh59OTJcL
  568. FsPX0oCR/5eLXz9MCmelxDX7H8XDh9hP6PThooYP60oaDt0xsZvEyo6OQ43n5FuorSg4vL
  569. aMIQYK/znhBq9kR6XKMO8mULoDa+LnhOWsAY8kJ3fowF/UsQmh6PY/w4DJaypm85+a6Sak
  570. Lpn80ur7L6nV7yTqufYqXa4hgNsJHmJ7NGKqOxT/8vcvVRqRadNLl79g9bRRavBiYt/8fy
  571. DJGxOuutcVTzYlzS593Vo95In853cT+HuK4guaWkQdTrThG7jHAi0wVueaEDCTnDkuTk2h
  572. 7PXFBkYTUwE3y+NHo1X+nTE3LhiUJ0RBr3aaj5UBYKHK1uMo1C4zZH3GMvB5K2KmXwG/oB
  573. gCcD1j5hlp6QwOzBVfXsXBF4ewtf7g3RQF8DS3mBAAAFkDc7Drc3Ow63AAAAB3NzaC1yc2
  574. EAAAGBALAEaGVKqOi+XXdFkY2dkD6v5CpW47VGNZ48ydNVLXQtbtXkiRVJ1StSfvW9ZBKi
  575. OJYAGiLWmG6STUoAnve8+g0cRDE1EN1YQfl/pj33DdvyNG2JJUcYefTkyXCxbD19KAkf+X
  576. i18/TApnpcQ1+x/Fw4fYT+j04aKGD+tKGg7dMbGbxMqOjkON5+RbqK0oOLy2jCEGCv854Q
  577. avZEelyjDvJlC6A2vi54TlrAGPJCd36MBf1LEJoej2P8OAyWsqZvOfmukmpC6Z/NLq+y+p
  578. 1e8k6rn2Kl2uIYDbCR5iezRiqjsU//L3L1UakWnTS5e/YPW0UWrwYmLf/H8gyRsTrrrXFU
  579. 82Jc0ufd1aPeSJ/Od3E/h7iuILmlpEHU604Ru4xwItMFbnmhAwk5w5Lk5Noez1xQZGE1MB
  580. N8vjR6NV/p0xNy4YlCdEQa92mo+VAWChytbjKNQuM2R9xjLweStipl8Bv6AYAnA9Y+YZae
  581. kMDswVX17FwReHsLX+4N0UBfA0t5gQAAAAMBAAEAAAGAey4agQiGvJq8fkPJYPnrgHNHkf
  582. nM0YeY7mxMMgFiFfPVpQqShLtu2yqYfxFTf1bXkuHvaIIVmwv32tokZetycspdTrJ8Yurp
  583. ANo8VREYOdx+pEleNSsD7kZOUvdXcJCt+/TMeZWcbKSF3QvEeqvsl/1Qmkorr9TOfVLCxn
  584. oA9cP5drWPX6yXv91OnwWX3UdvyphFLeT08KE8uauilkHmq+va/vxQi+TVsNzOmHu7dGw5
  585. pNFrhO/uGWLhNq4fyCn9l33vpHZdMe2h/N32MnKZgjFOWLqyHy2Cx5BDJTfXyHwjVTqGN1
  586. 8fzrC+o3OuFsR1pPugwlYUW8B9XaxPI6h+Ke6GIxacNtVvOe67GrkdYbQkyrs4/EMqbXTl
  587. /BG/JZIMuchk0Da0TKDDjBwchMjAiwjsFp/wawlL9Y0dJIG0muEuHXxjInEa7xQoisAUCf
  588. B7lasXeUPOy/Z76qFwjVvyfkiVgWygncjGL44b0rgEC81L/dTZUyvNoCM9Bn7wSbuBAAAA
  589. wQDHw6NkJCvGOYa9lt2lMou6hSudokHejOo+J9jJCJdUlMXIbHhBUzrmSh47OSkgpAo4qf
  590. iVGHvBO55pZ5pI7o4woTQxaPFM8a/5BhMWcZ2LDMqU5iov9C2Dz8yKUyQmAodNkOGacQJU
  591. MDAVBJYeBFJSu04bj2EEhEd+9rIazeqVl91qkV1uGTz4aJ360PSmLuLAFT12BYGjIBfHrS
  592. yom+1HbBoUziG4a/kzzbJGTC7U66YTjpHAMEtz4mbpU0AhNg4AAADBANgTs8yjrEkL4pcC
  593. gfUr9oR42/BVl3ZxaFQ7PAvs9m0aut7b/ZRmsSF8F2TAl0H4H9M8uUKTTOhqRtdnTtDqm9
  594. QBUIQBzA6Blb5oP+yL+Eiez4gMFd9HumFXG3JoRu/JmDE19KviHaldV47QcvG6B3p0eb5Q
  595. hgVcNsrOGyBUZA0kBmzQBwv6gUoo++ETQMH89BlljZVCiPW7F6FCrPxHp7EB5txYJ62Qpu
  596. 2U40qgb2ONiUOuiI84EYRAgmDTbboMPQAAAMEA0Inn71l7LsYv81vstbmMQz0qLvhHkBcp
  597. mMhh6tyzI0dvLZabBLTPhIT4R/0VDMJGsH5X1cEaap47XDpu0/g3mfOV6PToUfYA2Ugw7N
  598. bs23UlVH1n0zL2x0QOMHX/Fkfc3OdIuc97ZHoMeW6Nf7Ii0iH7slIpH4hPVYcGXk/bX6wt
  599. PKDc8xGEXdd4A6jnwJBifJs+UpPrHAh0c63KfjO3rryDycvmxeWRnyU1yRCUjIuH31vi+L
  600. OkcGfqTaOoz2KVAAAAFGtpYW5AREVTS1RPUC1TNFI5S1JQAQIDBAUG
  601. -----END OPENSSH PRIVATE KEY-----`
  602. sshRemoteRefKey := f.MakeRemoteRefKey(sshSecretName)
  603. tc.Secrets = map[string]framework.SecretEntry{
  604. sshRemoteRefKey: {Value: sshSecretValue},
  605. }
  606. tc.ExpectedSecret = &v1.Secret{
  607. Type: v1.SecretTypeSSHAuth,
  608. Data: map[string][]byte{
  609. sshPrivateKey: []byte(sshSecretValue),
  610. },
  611. }
  612. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  613. {
  614. SecretKey: "mysecret",
  615. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  616. Key: sshRemoteRefKey,
  617. },
  618. },
  619. }
  620. tc.ExternalSecret.Spec.Target.Template = &esv1beta1.ExternalSecretTemplate{
  621. Type: v1.SecretTypeSSHAuth,
  622. Data: map[string]string{
  623. sshPrivateKey: mysecretToStringTemplating,
  624. },
  625. }
  626. }
  627. }
  628. // This case adds an ssh private key secret and syncs it.
  629. func SSHKeySyncDataProperty(f *framework.Framework) (string, func(*framework.TestCase)) {
  630. return "[common] should sync ssh key with provider.", func(tc *framework.TestCase) {
  631. cloudSecretName := fmt.Sprintf("%s-%s", f.Namespace.Name, dockerConfigExampleName)
  632. cloudRemoteRefKey := f.MakeRemoteRefKey(cloudSecretName)
  633. SSHKey := `-----BEGIN OPENSSH PRIVATE KEY-----
  634. b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
  635. NhAAAAAwEAAQAAAYEAsARoZUqo6L5dd0WRjZ2QPq/kKlbjtUY1njzJ01UtdC1u1eSJFUnV
  636. K1J+9b1kEqI4lgAaItaYbpJNSgCe97z6DRxEMTUQ3VhB+X+mPfcN2/I0bYklRxh59OTJcL
  637. FsPX0oCR/5eLXz9MCmelxDX7H8XDh9hP6PThooYP60oaDt0xsZvEyo6OQ43n5FuorSg4vL
  638. aMIQYK/znhBq9kR6XKMO8mULoDa+LnhOWsAY8kJ3fowF/UsQmh6PY/w4DJaypm85+a6Sak
  639. Lpn80ur7L6nV7yTqufYqXa4hgNsJHmJ7NGKqOxT/8vcvVRqRadNLl79g9bRRavBiYt/8fy
  640. DJGxOuutcVTzYlzS593Vo95In853cT+HuK4guaWkQdTrThG7jHAi0wVueaEDCTnDkuTk2h
  641. 7PXFBkYTUwE3y+NHo1X+nTE3LhiUJ0RBr3aaj5UBYKHK1uMo1C4zZH3GMvB5K2KmXwG/oB
  642. gCcD1j5hlp6QwOzBVfXsXBF4ewtf7g3RQF8DS3mBAAAFkDc7Drc3Ow63AAAAB3NzaC1yc2
  643. EAAAGBALAEaGVKqOi+XXdFkY2dkD6v5CpW47VGNZ48ydNVLXQtbtXkiRVJ1StSfvW9ZBKi
  644. OJYAGiLWmG6STUoAnve8+g0cRDE1EN1YQfl/pj33DdvyNG2JJUcYefTkyXCxbD19KAkf+X
  645. i18/TApnpcQ1+x/Fw4fYT+j04aKGD+tKGg7dMbGbxMqOjkON5+RbqK0oOLy2jCEGCv854Q
  646. avZEelyjDvJlC6A2vi54TlrAGPJCd36MBf1LEJoej2P8OAyWsqZvOfmukmpC6Z/NLq+y+p
  647. 1e8k6rn2Kl2uIYDbCR5iezRiqjsU//L3L1UakWnTS5e/YPW0UWrwYmLf/H8gyRsTrrrXFU
  648. 82Jc0ufd1aPeSJ/Od3E/h7iuILmlpEHU604Ru4xwItMFbnmhAwk5w5Lk5Noez1xQZGE1MB
  649. N8vjR6NV/p0xNy4YlCdEQa92mo+VAWChytbjKNQuM2R9xjLweStipl8Bv6AYAnA9Y+YZae
  650. kMDswVX17FwReHsLX+4N0UBfA0t5gQAAAAMBAAEAAAGAey4agQiGvJq8fkPJYPnrgHNHkf
  651. nM0YeY7mxMMgFiFfPVpQqShLtu2yqYfxFTf1bXkuHvaIIVmwv32tokZetycspdTrJ8Yurp
  652. ANo8VREYOdx+pEleNSsD7kZOUvdXcJCt+/TMeZWcbKSF3QvEeqvsl/1Qmkorr9TOfVLCxn
  653. oA9cP5drWPX6yXv91OnwWX3UdvyphFLeT08KE8uauilkHmq+va/vxQi+TVsNzOmHu7dGw5
  654. pNFrhO/uGWLhNq4fyCn9l33vpHZdMe2h/N32MnKZgjFOWLqyHy2Cx5BDJTfXyHwjVTqGN1
  655. 8fzrC+o3OuFsR1pPugwlYUW8B9XaxPI6h+Ke6GIxacNtVvOe67GrkdYbQkyrs4/EMqbXTl
  656. /BG/JZIMuchk0Da0TKDDjBwchMjAiwjsFp/wawlL9Y0dJIG0muEuHXxjInEa7xQoisAUCf
  657. B7lasXeUPOy/Z76qFwjVvyfkiVgWygncjGL44b0rgEC81L/dTZUyvNoCM9Bn7wSbuBAAAA
  658. wQDHw6NkJCvGOYa9lt2lMou6hSudokHejOo+J9jJCJdUlMXIbHhBUzrmSh47OSkgpAo4qf
  659. iVGHvBO55pZ5pI7o4woTQxaPFM8a/5BhMWcZ2LDMqU5iov9C2Dz8yKUyQmAodNkOGacQJU
  660. MDAVBJYeBFJSu04bj2EEhEd+9rIazeqVl91qkV1uGTz4aJ360PSmLuLAFT12BYGjIBfHrS
  661. yom+1HbBoUziG4a/kzzbJGTC7U66YTjpHAMEtz4mbpU0AhNg4AAADBANgTs8yjrEkL4pcC
  662. gfUr9oR42/BVl3ZxaFQ7PAvs9m0aut7b/ZRmsSF8F2TAl0H4H9M8uUKTTOhqRtdnTtDqm9
  663. QBUIQBzA6Blb5oP+yL+Eiez4gMFd9HumFXG3JoRu/JmDE19KviHaldV47QcvG6B3p0eb5Q
  664. hgVcNsrOGyBUZA0kBmzQBwv6gUoo++ETQMH89BlljZVCiPW7F6FCrPxHp7EB5txYJ62Qpu
  665. 2U40qgb2ONiUOuiI84EYRAgmDTbboMPQAAAMEA0Inn71l7LsYv81vstbmMQz0qLvhHkBcp
  666. mMhh6tyzI0dvLZabBLTPhIT4R/0VDMJGsH5X1cEaap47XDpu0/g3mfOV6PToUfYA2Ugw7N
  667. bs23UlVH1n0zL2x0QOMHX/Fkfc3OdIuc97ZHoMeW6Nf7Ii0iH7slIpH4hPVYcGXk/bX6wt
  668. PKDc8xGEXdd4A6jnwJBifJs+UpPrHAh0c63KfjO3rryDycvmxeWRnyU1yRCUjIuH31vi+L
  669. OkcGfqTaOoz2KVAAAAFGtpYW5AREVTS1RPUC1TNFI5S1JQAQIDBAUG
  670. -----END OPENSSH PRIVATE KEY-----`
  671. cloudSecretValue := fmt.Sprintf(`{"ssh-auth": %q}`, SSHKey)
  672. tc.Secrets = map[string]framework.SecretEntry{
  673. cloudRemoteRefKey: {Value: cloudSecretValue},
  674. }
  675. tc.ExpectedSecret = &v1.Secret{
  676. Type: v1.SecretTypeSSHAuth,
  677. Data: map[string][]byte{
  678. sshPrivateKey: []byte(SSHKey),
  679. },
  680. }
  681. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  682. {
  683. SecretKey: "mysecret",
  684. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  685. Key: cloudRemoteRefKey,
  686. Property: "ssh-auth",
  687. },
  688. },
  689. }
  690. tc.ExternalSecret.Spec.Target.Template = &esv1beta1.ExternalSecretTemplate{
  691. Type: v1.SecretTypeSSHAuth,
  692. Data: map[string]string{
  693. sshPrivateKey: mysecretToStringTemplating,
  694. },
  695. }
  696. }
  697. }
  698. func DeletionPolicyDelete(f *framework.Framework) (string, func(*framework.TestCase)) {
  699. return "[common] should delete secret when provider secret was deleted using .data[]", func(tc *framework.TestCase) {
  700. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  701. secretKey2 := fmt.Sprintf("%s-%s", f.Namespace.Name, "other")
  702. remoteRefKey1 := f.MakeRemoteRefKey(secretKey1)
  703. remoteRefKey2 := f.MakeRemoteRefKey(secretKey2)
  704. secretValue := "bazz"
  705. tc.Secrets = map[string]framework.SecretEntry{
  706. remoteRefKey1: {Value: secretValue},
  707. remoteRefKey2: {Value: secretValue},
  708. }
  709. tc.ExpectedSecret = &v1.Secret{
  710. Type: v1.SecretTypeOpaque,
  711. Data: map[string][]byte{
  712. secretKey1: []byte(secretValue),
  713. secretKey2: []byte(secretValue),
  714. },
  715. }
  716. tc.ExternalSecret.Spec.Target.DeletionPolicy = esv1beta1.DeletionPolicyDelete
  717. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  718. {
  719. SecretKey: secretKey1,
  720. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  721. Key: remoteRefKey1,
  722. },
  723. },
  724. {
  725. SecretKey: secretKey2,
  726. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  727. Key: remoteRefKey2,
  728. },
  729. },
  730. }
  731. tc.AfterSync = func(prov framework.SecretStoreProvider, secret *v1.Secret) {
  732. prov.DeleteSecret(remoteRefKey1)
  733. prov.DeleteSecret(remoteRefKey2)
  734. gomega.Eventually(func() bool {
  735. _, err := f.KubeClientSet.CoreV1().Secrets(f.Namespace.Name).Get(context.Background(), secret.Name, metav1.GetOptions{})
  736. return errors.IsNotFound(err)
  737. }, time.Minute*5, time.Second*5).Should(gomega.BeTrue())
  738. }
  739. }
  740. }
  741. func DecodingPolicySync(f *framework.Framework) (string, func(*framework.TestCase)) {
  742. return "[common] should decode secrets with data and dataFrom", func(tc *framework.TestCase) {
  743. secretKey1 := fmt.Sprintf("%s-%s", f.Namespace.Name, "one")
  744. targetSecretKey1 := "name"
  745. targetSecretValue1 := "Z3JlYXQtbmFtZQ=="
  746. targetSecretKey2 := "surname"
  747. targetSecretValue2 := "Z3JlYXQtc3VybmFtZQ=="
  748. targetSecretKey3 := "address"
  749. targetSecretValue3 := "happy calm street No. 1"
  750. secretValue := fmt.Sprintf("{ %q: %q, %q: %q, %q: %q }", targetSecretKey1, targetSecretValue1, targetSecretKey2, targetSecretValue2, targetSecretKey3, targetSecretValue3)
  751. tc.Secrets = map[string]framework.SecretEntry{
  752. secretKey1: {Value: secretValue},
  753. }
  754. tc.ExpectedSecret = &v1.Secret{
  755. Type: v1.SecretTypeOpaque,
  756. Data: map[string][]byte{
  757. targetSecretKey1: []byte("great-name"),
  758. targetSecretKey2: []byte("great-surname"),
  759. targetSecretKey3: []byte(targetSecretValue3),
  760. "base64": []byte("great-name"),
  761. "none": []byte(targetSecretValue1),
  762. },
  763. }
  764. tc.ExternalSecret.Spec.DataFrom = []esv1beta1.ExternalSecretDataFromRemoteRef{
  765. {
  766. Extract: &esv1beta1.ExternalSecretDataRemoteRef{
  767. Key: secretKey1,
  768. DecodingStrategy: esv1beta1.ExternalSecretDecodeAuto,
  769. },
  770. },
  771. }
  772. tc.ExternalSecret.Spec.Data = []esv1beta1.ExternalSecretData{
  773. {
  774. SecretKey: "base64",
  775. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  776. Key: secretKey1,
  777. Property: targetSecretKey1,
  778. DecodingStrategy: esv1beta1.ExternalSecretDecodeBase64,
  779. },
  780. },
  781. {
  782. SecretKey: "none",
  783. RemoteRef: esv1beta1.ExternalSecretDataRemoteRef{
  784. Key: secretKey1,
  785. Property: targetSecretKey1,
  786. DecodingStrategy: esv1beta1.ExternalSecretDecodeNone,
  787. },
  788. },
  789. }
  790. }
  791. }