keyvault_test.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935
  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. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package keyvault
  13. import (
  14. "context"
  15. "encoding/json"
  16. "errors"
  17. "fmt"
  18. "reflect"
  19. "testing"
  20. "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault"
  21. "k8s.io/utils/pointer"
  22. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  23. v1 "github.com/external-secrets/external-secrets/apis/meta/v1"
  24. fake "github.com/external-secrets/external-secrets/pkg/provider/azure/keyvault/fake"
  25. utils "github.com/external-secrets/external-secrets/pkg/utils"
  26. )
  27. type secretManagerTestCase struct {
  28. mockClient *fake.AzureMockClient
  29. secretName string
  30. secretVersion string
  31. serviceURL string
  32. ref *esv1beta1.ExternalSecretDataRemoteRef
  33. refFind *esv1beta1.ExternalSecretFind
  34. apiErr error
  35. secretOutput keyvault.SecretBundle
  36. keyOutput keyvault.KeyBundle
  37. certOutput keyvault.CertificateBundle
  38. listOutput keyvault.SecretListResultIterator
  39. expectError string
  40. expectedSecret string
  41. // for testing secretmap
  42. expectedData map[string][]byte
  43. }
  44. func makeValidSecretManagerTestCase() *secretManagerTestCase {
  45. secretString := "Hello World!"
  46. smtc := secretManagerTestCase{
  47. mockClient: &fake.AzureMockClient{},
  48. secretName: "MySecret",
  49. secretVersion: "",
  50. ref: makeValidRef(),
  51. refFind: makeValidFind(),
  52. secretOutput: keyvault.SecretBundle{Value: &secretString},
  53. serviceURL: "",
  54. apiErr: nil,
  55. expectError: "",
  56. expectedSecret: secretString,
  57. expectedData: map[string][]byte{},
  58. }
  59. smtc.mockClient.WithValue(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.secretOutput, smtc.apiErr)
  60. return &smtc
  61. }
  62. func makeValidSecretManagerTestCaseCustom(tweaks ...func(smtc *secretManagerTestCase)) *secretManagerTestCase {
  63. smtc := makeValidSecretManagerTestCase()
  64. for _, fn := range tweaks {
  65. fn(smtc)
  66. }
  67. smtc.mockClient.WithValue(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.secretOutput, smtc.apiErr)
  68. smtc.mockClient.WithKey(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.keyOutput, smtc.apiErr)
  69. smtc.mockClient.WithCertificate(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.certOutput, smtc.apiErr)
  70. smtc.mockClient.WithList(smtc.serviceURL, smtc.listOutput, smtc.apiErr)
  71. return smtc
  72. }
  73. const (
  74. jwkPubRSA = `{"kid":"ex","kty":"RSA","key_ops":["sign","verify","wrapKey","unwrapKey","encrypt","decrypt"],"n":"p2VQo8qCfWAZmdWBVaYuYb-a-tWWm78K6Sr9poCvNcmv8rUPSLACxitQWR8gZaSH1DklVkqz-Ed8Cdlf8lkDg4Ex5tkB64jRdC1Uvn4CDpOH6cp-N2s8hTFLqy9_YaDmyQS7HiqthOi9oVjil1VMeWfaAbClGtFt6UnKD0Vb_DvLoWYQSqlhgBArFJi966b4E1pOq5Ad02K8pHBDThlIIx7unibLehhDU6q3DCwNH_OOLx6bgNtmvGYJDd1cywpkLQ3YzNCUPWnfMBJRP3iQP_WI21uP6cvo0DqBPBM4wvVzHbCT0vnIflwkbgEWkq1FprqAitZlop9KjLqzjp9vyQ","e":"AQAB"}`
  75. jwkPubEC = `{"kid":"https://example.vault.azure.net/keys/ec-p-521/e3d0e9c179b54988860c69c6ae172c65","kty":"EC","key_ops":["sign","verify"],"crv":"P-521","x":"AedOAtb7H7Oz1C_cPKI_R4CN_eai5nteY6KFW07FOoaqgQfVCSkQDK22fCOiMT_28c8LZYJRsiIFz_IIbQUW7bXj","y":"AOnchHnmBphIWXvanmMAmcCDkaED6ycW8GsAl9fQ43BMVZTqcTkJYn6vGnhn7MObizmkNSmgZYTwG-vZkIg03HHs"}`
  76. jsonTestString = `{"Name": "External", "LastName": "Secret", "Address": { "Street": "Myroad st.", "CP": "J4K4T4" } }`
  77. jsonSingleTestString = `{"Name": "External", "LastName": "Secret" }`
  78. jsonTagTestString = `{"tagname":"tagvalue","tagname2":"tagvalue2"}`
  79. keyName = "key/keyname"
  80. certName = "cert/certname"
  81. secretString = "changedvalue"
  82. unexpectedError = "[%d] unexpected error: %s, expected: '%s'"
  83. unexpectedSecretData = "[%d] unexpected secret data: expected %#v, got %#v"
  84. errorNoTag = "tag something does not exist"
  85. something = "something"
  86. tagname = "tagname"
  87. tagname2 = "tagname2"
  88. tagvalue = "tagvalue"
  89. tagvalue2 = "tagvalue2"
  90. secretName = "example-1"
  91. testsecret = "test-secret"
  92. fakeURL = "noop"
  93. foo = "foo"
  94. bar = "bar"
  95. errStore = "Azure.ValidateStore() error = %v, wantErr %v"
  96. )
  97. func getTagMap() map[string]*string {
  98. tag1 := "tagname"
  99. tag2 := "tagname2"
  100. value1 := "tagvalue"
  101. value2 := "tagvalue2"
  102. tagMap := make(map[string]*string)
  103. tagMap[tag1] = &value1
  104. tagMap[tag2] = &value2
  105. return tagMap
  106. }
  107. func newKVJWK(b []byte) *keyvault.JSONWebKey {
  108. var key keyvault.JSONWebKey
  109. err := json.Unmarshal(b, &key)
  110. if err != nil {
  111. panic(err)
  112. }
  113. return &key
  114. }
  115. // test the sm<->azurekv interface
  116. // make sure correct values are passed and errors are handled accordingly.
  117. func TestAzureKeyVaultSecretManagerGetSecret(t *testing.T) {
  118. secretString := "changedvalue"
  119. secretCertificate := "certificate_value"
  120. tagMap := getTagMap()
  121. // good case
  122. setSecretString := func(smtc *secretManagerTestCase) {
  123. smtc.expectedSecret = secretString
  124. smtc.secretOutput = keyvault.SecretBundle{
  125. Value: &secretString,
  126. }
  127. }
  128. setSecretStringWithVersion := func(smtc *secretManagerTestCase) {
  129. smtc.expectedSecret = secretString
  130. smtc.secretOutput = keyvault.SecretBundle{
  131. Value: &secretString,
  132. }
  133. smtc.ref.Version = "v1"
  134. smtc.secretVersion = smtc.ref.Version
  135. }
  136. setSecretWithProperty := func(smtc *secretManagerTestCase) {
  137. jsonString := jsonTestString
  138. smtc.expectedSecret = "External"
  139. smtc.secretOutput = keyvault.SecretBundle{
  140. Value: &jsonString,
  141. }
  142. smtc.ref.Property = "Name"
  143. }
  144. badSecretWithProperty := func(smtc *secretManagerTestCase) {
  145. jsonString := jsonTestString
  146. smtc.expectedSecret = ""
  147. smtc.secretOutput = keyvault.SecretBundle{
  148. Value: &jsonString,
  149. }
  150. smtc.ref.Property = "Age"
  151. smtc.expectError = fmt.Sprintf("property %s does not exist in key %s", smtc.ref.Property, smtc.ref.Key)
  152. smtc.apiErr = errors.New(smtc.expectError)
  153. }
  154. // // good case: key set
  155. setPubRSAKey := func(smtc *secretManagerTestCase) {
  156. smtc.secretName = keyName
  157. smtc.expectedSecret = jwkPubRSA
  158. smtc.keyOutput = keyvault.KeyBundle{
  159. Key: newKVJWK([]byte(jwkPubRSA)),
  160. }
  161. smtc.ref.Key = smtc.secretName
  162. }
  163. // // good case: key set
  164. setPubECKey := func(smtc *secretManagerTestCase) {
  165. smtc.secretName = keyName
  166. smtc.expectedSecret = jwkPubEC
  167. smtc.keyOutput = keyvault.KeyBundle{
  168. Key: newKVJWK([]byte(jwkPubEC)),
  169. }
  170. smtc.ref.Key = smtc.secretName
  171. }
  172. // // good case: key set
  173. setCertificate := func(smtc *secretManagerTestCase) {
  174. byteArrString := []byte(secretCertificate)
  175. smtc.secretName = certName
  176. smtc.expectedSecret = secretCertificate
  177. smtc.certOutput = keyvault.CertificateBundle{
  178. Cer: &byteArrString,
  179. }
  180. smtc.ref.Key = smtc.secretName
  181. }
  182. badSecretType := func(smtc *secretManagerTestCase) {
  183. smtc.secretName = "name"
  184. smtc.expectedSecret = ""
  185. smtc.expectError = fmt.Sprintf("unknown Azure Keyvault object Type for %s", smtc.secretName)
  186. smtc.ref.Key = fmt.Sprintf("dummy/%s", smtc.secretName)
  187. }
  188. setSecretWithTag := func(smtc *secretManagerTestCase) {
  189. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  190. smtc.ref.Property = tagname
  191. smtc.secretOutput = keyvault.SecretBundle{
  192. Value: &secretString, Tags: tagMap,
  193. }
  194. smtc.expectedSecret = tagvalue
  195. }
  196. badSecretWithTag := func(smtc *secretManagerTestCase) {
  197. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  198. smtc.ref.Property = something
  199. smtc.expectedSecret = ""
  200. smtc.expectError = errorNoTag
  201. smtc.apiErr = errors.New(smtc.expectError)
  202. }
  203. setSecretWithNoSpecificTag := func(smtc *secretManagerTestCase) {
  204. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  205. smtc.secretOutput = keyvault.SecretBundle{
  206. Value: &secretString, Tags: tagMap,
  207. }
  208. smtc.expectedSecret = jsonTagTestString
  209. }
  210. setSecretWithNoTags := func(smtc *secretManagerTestCase) {
  211. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  212. smtc.secretOutput = keyvault.SecretBundle{}
  213. smtc.expectedSecret = "{}"
  214. }
  215. setCertWithTag := func(smtc *secretManagerTestCase) {
  216. byteArrString := []byte(secretCertificate)
  217. smtc.secretName = certName
  218. smtc.certOutput = keyvault.CertificateBundle{
  219. Cer: &byteArrString, Tags: tagMap,
  220. }
  221. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  222. smtc.ref.Property = tagname
  223. smtc.expectedSecret = tagvalue
  224. smtc.ref.Key = smtc.secretName
  225. }
  226. badCertWithTag := func(smtc *secretManagerTestCase) {
  227. byteArrString := []byte(secretCertificate)
  228. smtc.secretName = certName
  229. smtc.ref.Key = smtc.secretName
  230. smtc.certOutput = keyvault.CertificateBundle{
  231. Cer: &byteArrString,
  232. }
  233. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  234. smtc.ref.Property = something
  235. smtc.expectedSecret = ""
  236. smtc.expectError = errorNoTag
  237. smtc.apiErr = errors.New(smtc.expectError)
  238. }
  239. setCertWithNoSpecificTag := func(smtc *secretManagerTestCase) {
  240. byteArrString := []byte(secretCertificate)
  241. smtc.secretName = certName
  242. smtc.ref.Key = smtc.secretName
  243. smtc.certOutput = keyvault.CertificateBundle{
  244. Cer: &byteArrString, Tags: tagMap,
  245. }
  246. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  247. smtc.expectedSecret = jsonTagTestString
  248. }
  249. setCertWithNoTags := func(smtc *secretManagerTestCase) {
  250. byteArrString := []byte(secretCertificate)
  251. smtc.secretName = certName
  252. smtc.ref.Key = smtc.secretName
  253. smtc.certOutput = keyvault.CertificateBundle{
  254. Cer: &byteArrString,
  255. }
  256. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  257. smtc.expectedSecret = "{}"
  258. }
  259. setKeyWithTag := func(smtc *secretManagerTestCase) {
  260. smtc.secretName = keyName
  261. smtc.keyOutput = keyvault.KeyBundle{
  262. Key: newKVJWK([]byte(jwkPubRSA)), Tags: tagMap,
  263. }
  264. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  265. smtc.ref.Property = tagname
  266. smtc.expectedSecret = tagvalue
  267. smtc.ref.Key = smtc.secretName
  268. }
  269. badKeyWithTag := func(smtc *secretManagerTestCase) {
  270. smtc.secretName = keyName
  271. smtc.ref.Key = smtc.secretName
  272. smtc.keyOutput = keyvault.KeyBundle{
  273. Key: newKVJWK([]byte(jwkPubRSA)), Tags: tagMap,
  274. }
  275. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  276. smtc.ref.Property = something
  277. smtc.expectedSecret = ""
  278. smtc.expectError = errorNoTag
  279. smtc.apiErr = errors.New(smtc.expectError)
  280. }
  281. setKeyWithNoSpecificTag := func(smtc *secretManagerTestCase) {
  282. smtc.secretName = keyName
  283. smtc.ref.Key = smtc.secretName
  284. smtc.keyOutput = keyvault.KeyBundle{
  285. Key: newKVJWK([]byte(jwkPubRSA)), Tags: tagMap,
  286. }
  287. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  288. smtc.expectedSecret = jsonTagTestString
  289. }
  290. setKeyWithNoTags := func(smtc *secretManagerTestCase) {
  291. smtc.secretName = keyName
  292. smtc.ref.Key = smtc.secretName
  293. smtc.keyOutput = keyvault.KeyBundle{
  294. Key: newKVJWK([]byte(jwkPubRSA)),
  295. }
  296. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  297. smtc.expectedSecret = "{}"
  298. }
  299. badPropertyTag := func(smtc *secretManagerTestCase) {
  300. smtc.ref.Property = tagname
  301. smtc.expectedSecret = ""
  302. smtc.expectError = "property tagname does not exist in key test-secret"
  303. smtc.apiErr = errors.New(smtc.expectError)
  304. }
  305. fetchSingleTag := func(smtc *secretManagerTestCase) {
  306. jsonString := jsonTestString
  307. smtc.expectedSecret = bar
  308. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  309. secretTags := map[string]*string{}
  310. tagValue := bar
  311. secretTags[foo] = &tagValue
  312. smtc.secretOutput = keyvault.SecretBundle{
  313. Value: &jsonString,
  314. Tags: secretTags,
  315. }
  316. smtc.ref.Property = foo
  317. }
  318. fetchJSONTag := func(smtc *secretManagerTestCase) {
  319. jsonString := jsonTestString
  320. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  321. secretTags := map[string]*string{}
  322. tagValue := "{\"key\":\"value\"}"
  323. secretTags[foo] = &tagValue
  324. smtc.secretOutput = keyvault.SecretBundle{
  325. Value: &jsonString,
  326. Tags: secretTags,
  327. }
  328. smtc.ref.Property = foo
  329. smtc.expectedSecret = tagValue
  330. }
  331. fetchDottedJSONTag := func(smtc *secretManagerTestCase) {
  332. jsonString := jsonTestString
  333. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  334. secretTags := map[string]*string{}
  335. tagValue := "{\"key\":\"value\"}"
  336. secretTags[foo] = &tagValue
  337. smtc.secretOutput = keyvault.SecretBundle{
  338. Value: &jsonString,
  339. Tags: secretTags,
  340. }
  341. smtc.ref.Property = "foo.key"
  342. smtc.expectedSecret = "value"
  343. }
  344. fetchNestedJSONTag := func(smtc *secretManagerTestCase) {
  345. jsonString := jsonTestString
  346. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  347. secretTags := map[string]*string{}
  348. tagValue := "{\"key\":\"value\", \"nested\": {\"foo\":\"bar\"}}"
  349. secretTags["foo"] = &tagValue
  350. smtc.secretOutput = keyvault.SecretBundle{
  351. Value: &jsonString,
  352. Tags: secretTags,
  353. }
  354. smtc.ref.Property = "foo.nested"
  355. smtc.expectedSecret = "{\"foo\":\"bar\"}"
  356. }
  357. fetchNestedDottedJSONTag := func(smtc *secretManagerTestCase) {
  358. jsonString := jsonTestString
  359. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  360. secretTags := map[string]*string{}
  361. tagValue := "{\"key\":\"value\", \"nested\": {\"foo\":\"bar\"}}"
  362. secretTags[foo] = &tagValue
  363. smtc.secretOutput = keyvault.SecretBundle{
  364. Value: &jsonString,
  365. Tags: secretTags,
  366. }
  367. smtc.ref.Property = "foo.nested.foo"
  368. smtc.expectedSecret = bar
  369. }
  370. fetchDottedKeyJSONTag := func(smtc *secretManagerTestCase) {
  371. jsonString := jsonTestString
  372. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  373. secretTags := map[string]*string{}
  374. tagValue := "{\"foo.json\":\"bar\"}"
  375. secretTags[foo] = &tagValue
  376. smtc.secretOutput = keyvault.SecretBundle{
  377. Value: &jsonString,
  378. Tags: secretTags,
  379. }
  380. smtc.ref.Property = "foo.foo.json"
  381. smtc.expectedSecret = bar
  382. }
  383. fetchDottedSecretJSONTag := func(smtc *secretManagerTestCase) {
  384. jsonString := "{\"foo.json\":\"bar\"}"
  385. smtc.secretOutput = keyvault.SecretBundle{
  386. Value: &jsonString,
  387. }
  388. smtc.ref.Property = "foo.json"
  389. smtc.expectedSecret = bar
  390. }
  391. successCases := []*secretManagerTestCase{
  392. makeValidSecretManagerTestCase(),
  393. makeValidSecretManagerTestCaseCustom(setSecretString),
  394. makeValidSecretManagerTestCaseCustom(setSecretStringWithVersion),
  395. makeValidSecretManagerTestCaseCustom(setSecretWithProperty),
  396. makeValidSecretManagerTestCaseCustom(badSecretWithProperty),
  397. makeValidSecretManagerTestCaseCustom(setPubRSAKey),
  398. makeValidSecretManagerTestCaseCustom(setPubECKey),
  399. makeValidSecretManagerTestCaseCustom(setCertificate),
  400. makeValidSecretManagerTestCaseCustom(badSecretType),
  401. makeValidSecretManagerTestCaseCustom(setSecretWithTag),
  402. makeValidSecretManagerTestCaseCustom(badSecretWithTag),
  403. makeValidSecretManagerTestCaseCustom(setSecretWithNoSpecificTag),
  404. makeValidSecretManagerTestCaseCustom(setSecretWithNoTags),
  405. makeValidSecretManagerTestCaseCustom(setCertWithTag),
  406. makeValidSecretManagerTestCaseCustom(badCertWithTag),
  407. makeValidSecretManagerTestCaseCustom(setCertWithNoSpecificTag),
  408. makeValidSecretManagerTestCaseCustom(setCertWithNoTags),
  409. makeValidSecretManagerTestCaseCustom(setKeyWithTag),
  410. makeValidSecretManagerTestCaseCustom(badKeyWithTag),
  411. makeValidSecretManagerTestCaseCustom(setKeyWithNoSpecificTag),
  412. makeValidSecretManagerTestCaseCustom(setKeyWithNoTags),
  413. makeValidSecretManagerTestCaseCustom(badPropertyTag),
  414. makeValidSecretManagerTestCaseCustom(fetchSingleTag),
  415. makeValidSecretManagerTestCaseCustom(fetchJSONTag),
  416. makeValidSecretManagerTestCaseCustom(fetchDottedJSONTag),
  417. makeValidSecretManagerTestCaseCustom(fetchNestedJSONTag),
  418. makeValidSecretManagerTestCaseCustom(fetchNestedDottedJSONTag),
  419. makeValidSecretManagerTestCaseCustom(fetchDottedKeyJSONTag),
  420. makeValidSecretManagerTestCaseCustom(fetchDottedSecretJSONTag),
  421. }
  422. sm := Azure{
  423. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  424. }
  425. for k, v := range successCases {
  426. sm.baseClient = v.mockClient
  427. out, err := sm.GetSecret(context.Background(), *v.ref)
  428. if !utils.ErrorContains(err, v.expectError) {
  429. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  430. }
  431. if string(out) != v.expectedSecret {
  432. t.Errorf("[%d] unexpected secret: expected %s, got %s", k, v.expectedSecret, string(out))
  433. }
  434. }
  435. }
  436. func TestAzureKeyVaultSecretManagerGetSecretMap(t *testing.T) {
  437. secretString := "changedvalue"
  438. secretCertificate := "certificate_value"
  439. tagMap := getTagMap()
  440. badSecretString := func(smtc *secretManagerTestCase) {
  441. smtc.expectedSecret = secretString
  442. smtc.secretOutput = keyvault.SecretBundle{
  443. Value: &secretString,
  444. }
  445. smtc.expectError = "error unmarshalling json data: invalid character 'c' looking for beginning of value"
  446. }
  447. setSecretJSON := func(smtc *secretManagerTestCase) {
  448. jsonString := jsonSingleTestString
  449. smtc.secretOutput = keyvault.SecretBundle{
  450. Value: &jsonString,
  451. }
  452. smtc.expectedData["Name"] = []byte("External")
  453. smtc.expectedData["LastName"] = []byte("Secret")
  454. }
  455. setSecretJSONWithProperty := func(smtc *secretManagerTestCase) {
  456. jsonString := jsonTestString
  457. smtc.secretOutput = keyvault.SecretBundle{
  458. Value: &jsonString,
  459. }
  460. smtc.ref.Property = "Address"
  461. smtc.expectedData["Street"] = []byte("Myroad st.")
  462. smtc.expectedData["CP"] = []byte("J4K4T4")
  463. }
  464. badSecretWithProperty := func(smtc *secretManagerTestCase) {
  465. jsonString := jsonTestString
  466. smtc.expectedSecret = ""
  467. smtc.secretOutput = keyvault.SecretBundle{
  468. Value: &jsonString,
  469. }
  470. smtc.ref.Property = "Age"
  471. smtc.expectError = fmt.Sprintf("property %s does not exist in key %s", smtc.ref.Property, smtc.ref.Key)
  472. smtc.apiErr = errors.New(smtc.expectError)
  473. }
  474. badPubRSAKey := func(smtc *secretManagerTestCase) {
  475. smtc.secretName = keyName
  476. smtc.expectedSecret = jwkPubRSA
  477. smtc.keyOutput = keyvault.KeyBundle{
  478. Key: newKVJWK([]byte(jwkPubRSA)),
  479. }
  480. smtc.ref.Key = smtc.secretName
  481. smtc.expectError = "cannot get use dataFrom to get key secret"
  482. }
  483. badCertificate := func(smtc *secretManagerTestCase) {
  484. byteArrString := []byte(secretCertificate)
  485. smtc.secretName = certName
  486. smtc.expectedSecret = secretCertificate
  487. smtc.certOutput = keyvault.CertificateBundle{
  488. Cer: &byteArrString,
  489. }
  490. smtc.ref.Key = smtc.secretName
  491. smtc.expectError = "cannot get use dataFrom to get certificate secret"
  492. }
  493. badSecretType := func(smtc *secretManagerTestCase) {
  494. smtc.secretName = "name"
  495. smtc.expectedSecret = ""
  496. smtc.expectError = fmt.Sprintf("unknown Azure Keyvault object Type for %s", smtc.secretName)
  497. smtc.ref.Key = fmt.Sprintf("dummy/%s", smtc.secretName)
  498. }
  499. setSecretTags := func(smtc *secretManagerTestCase) {
  500. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  501. smtc.secretOutput = keyvault.SecretBundle{
  502. Tags: tagMap,
  503. }
  504. smtc.expectedData[testsecret+"_"+tagname] = []byte(tagvalue)
  505. smtc.expectedData[testsecret+"_"+tagname2] = []byte(tagvalue2)
  506. }
  507. setSecretWithJSONTag := func(smtc *secretManagerTestCase) {
  508. tagJSONMap := make(map[string]*string)
  509. tagJSONData := `{"keyname":"keyvalue","x":"y"}`
  510. tagJSONMap["json"] = &tagJSONData
  511. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  512. smtc.secretOutput = keyvault.SecretBundle{
  513. Value: &secretString, Tags: tagJSONMap,
  514. }
  515. smtc.expectedData[testsecret+"_json_keyname"] = []byte("keyvalue")
  516. smtc.expectedData[testsecret+"_json_x"] = []byte("y")
  517. }
  518. setSecretWithNoTags := func(smtc *secretManagerTestCase) {
  519. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  520. tagMapTestEmpty := make(map[string]*string)
  521. smtc.secretOutput = keyvault.SecretBundle{
  522. Tags: tagMapTestEmpty,
  523. }
  524. smtc.expectedSecret = ""
  525. }
  526. nestedJSONNoProperty := func(smtc *secretManagerTestCase) {
  527. jsonString := jsonTestString
  528. smtc.expectedSecret = ""
  529. smtc.secretOutput = keyvault.SecretBundle{
  530. Value: &jsonString,
  531. }
  532. smtc.ref.Property = ""
  533. smtc.expectedData["Name"] = []byte("External")
  534. smtc.expectedData["LastName"] = []byte("Secret")
  535. smtc.expectedData["Address"] = []byte(`{ "Street": "Myroad st.", "CP": "J4K4T4" }`)
  536. }
  537. setNestedJSONTag := func(smtc *secretManagerTestCase) {
  538. secretTags := map[string]*string{}
  539. tagValue := `{"foo":"bar","nested.tag":{"foo":"bar"}}`
  540. bug := "1137"
  541. secretTags["dev"] = &tagValue
  542. secretTags["bug"] = &bug
  543. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  544. smtc.secretOutput = keyvault.SecretBundle{
  545. Tags: secretTags,
  546. }
  547. smtc.ref.Property = "dev"
  548. smtc.expectedData[testsecret+"_dev"] = []byte(tagValue)
  549. }
  550. successCases := []*secretManagerTestCase{
  551. makeValidSecretManagerTestCaseCustom(badSecretString),
  552. makeValidSecretManagerTestCaseCustom(setSecretJSON),
  553. makeValidSecretManagerTestCaseCustom(setSecretJSONWithProperty),
  554. makeValidSecretManagerTestCaseCustom(badSecretWithProperty),
  555. makeValidSecretManagerTestCaseCustom(badPubRSAKey),
  556. makeValidSecretManagerTestCaseCustom(badCertificate),
  557. makeValidSecretManagerTestCaseCustom(badSecretType),
  558. makeValidSecretManagerTestCaseCustom(setSecretTags),
  559. makeValidSecretManagerTestCaseCustom(setSecretWithJSONTag),
  560. makeValidSecretManagerTestCaseCustom(setSecretWithNoTags),
  561. makeValidSecretManagerTestCaseCustom(nestedJSONNoProperty),
  562. makeValidSecretManagerTestCaseCustom(setNestedJSONTag),
  563. }
  564. sm := Azure{
  565. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  566. }
  567. for k, v := range successCases {
  568. sm.baseClient = v.mockClient
  569. out, err := sm.GetSecretMap(context.Background(), *v.ref)
  570. if !utils.ErrorContains(err, v.expectError) {
  571. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  572. }
  573. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  574. t.Errorf("[%d] unexpected secret data: expected %#v, got %#v", k, v.expectedData, out)
  575. }
  576. }
  577. }
  578. func TestAzureKeyVaultSecretManagerGetAllSecrets(t *testing.T) {
  579. secretString := secretString
  580. secretName := secretName
  581. wrongName := "not-valid"
  582. environment := "dev"
  583. author := "seb"
  584. enabled := true
  585. getNextPage := func(ctx context.Context, list keyvault.SecretListResult) (result keyvault.SecretListResult, err error) {
  586. return keyvault.SecretListResult{
  587. Value: nil,
  588. NextLink: nil,
  589. }, nil
  590. }
  591. setOneSecretByName := func(smtc *secretManagerTestCase) {
  592. enabledAtt := keyvault.SecretAttributes{
  593. Enabled: &enabled,
  594. }
  595. secretItem := keyvault.SecretItem{
  596. ID: &secretName,
  597. Attributes: &enabledAtt,
  598. }
  599. secretList := make([]keyvault.SecretItem, 0)
  600. secretList = append(secretList, secretItem)
  601. list := keyvault.SecretListResult{
  602. Value: &secretList,
  603. }
  604. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  605. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  606. smtc.expectedSecret = secretString
  607. smtc.secretOutput = keyvault.SecretBundle{
  608. Value: &secretString,
  609. }
  610. smtc.expectedData[secretName] = []byte(secretString)
  611. }
  612. setTwoSecretsByName := func(smtc *secretManagerTestCase) {
  613. enabledAtt := keyvault.SecretAttributes{
  614. Enabled: &enabled,
  615. }
  616. secretItemOne := keyvault.SecretItem{
  617. ID: &secretName,
  618. Attributes: &enabledAtt,
  619. }
  620. secretItemTwo := keyvault.SecretItem{
  621. ID: &wrongName,
  622. Attributes: &enabledAtt,
  623. }
  624. secretList := make([]keyvault.SecretItem, 1)
  625. secretList = append(secretList, secretItemOne, secretItemTwo)
  626. list := keyvault.SecretListResult{
  627. Value: &secretList,
  628. }
  629. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  630. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  631. smtc.expectedSecret = secretString
  632. smtc.secretOutput = keyvault.SecretBundle{
  633. Value: &secretString,
  634. }
  635. smtc.expectedData[secretName] = []byte(secretString)
  636. }
  637. setOneSecretByTag := func(smtc *secretManagerTestCase) {
  638. enabledAtt := keyvault.SecretAttributes{
  639. Enabled: &enabled,
  640. }
  641. secretItem := keyvault.SecretItem{
  642. ID: &secretName,
  643. Attributes: &enabledAtt,
  644. Tags: map[string]*string{"environment": &environment},
  645. }
  646. secretList := make([]keyvault.SecretItem, 0)
  647. secretList = append(secretList, secretItem)
  648. list := keyvault.SecretListResult{
  649. Value: &secretList,
  650. }
  651. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  652. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  653. smtc.expectedSecret = secretString
  654. smtc.secretOutput = keyvault.SecretBundle{
  655. Value: &secretString,
  656. }
  657. smtc.refFind.Tags = map[string]string{"environment": environment}
  658. smtc.expectedData[secretName] = []byte(secretString)
  659. }
  660. setTwoSecretsByTag := func(smtc *secretManagerTestCase) {
  661. enabled := true
  662. enabledAtt := keyvault.SecretAttributes{
  663. Enabled: &enabled,
  664. }
  665. secretItem := keyvault.SecretItem{
  666. ID: &secretName,
  667. Attributes: &enabledAtt,
  668. Tags: map[string]*string{"environment": &environment, "author": &author},
  669. }
  670. secretList := make([]keyvault.SecretItem, 0)
  671. secretList = append(secretList, secretItem)
  672. list := keyvault.SecretListResult{
  673. Value: &secretList,
  674. }
  675. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  676. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  677. smtc.expectedSecret = secretString
  678. smtc.secretOutput = keyvault.SecretBundle{
  679. Value: &secretString,
  680. }
  681. smtc.refFind.Tags = map[string]string{"environment": environment, "author": author}
  682. smtc.expectedData[secretName] = []byte(secretString)
  683. }
  684. successCases := []*secretManagerTestCase{
  685. makeValidSecretManagerTestCaseCustom(setOneSecretByName),
  686. makeValidSecretManagerTestCaseCustom(setTwoSecretsByName),
  687. makeValidSecretManagerTestCaseCustom(setOneSecretByTag),
  688. makeValidSecretManagerTestCaseCustom(setTwoSecretsByTag),
  689. }
  690. sm := Azure{
  691. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  692. }
  693. for k, v := range successCases {
  694. sm.baseClient = v.mockClient
  695. out, err := sm.GetAllSecrets(context.Background(), *v.refFind)
  696. if !utils.ErrorContains(err, v.expectError) {
  697. t.Errorf(unexpectedError, k, err.Error(), v.expectError)
  698. }
  699. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  700. t.Errorf(unexpectedSecretData, k, v.expectedData, out)
  701. }
  702. }
  703. }
  704. func makeValidRef() *esv1beta1.ExternalSecretDataRemoteRef {
  705. return &esv1beta1.ExternalSecretDataRemoteRef{
  706. Key: "test-secret",
  707. Version: "default",
  708. Property: "",
  709. }
  710. }
  711. func makeValidFind() *esv1beta1.ExternalSecretFind {
  712. return &esv1beta1.ExternalSecretFind{
  713. Name: &esv1beta1.FindName{
  714. RegExp: "^example",
  715. },
  716. Tags: map[string]string{},
  717. }
  718. }
  719. func TestValidateStore(t *testing.T) {
  720. type args struct {
  721. store *esv1beta1.SecretStore
  722. }
  723. tests := []struct {
  724. name string
  725. args args
  726. wantErr bool
  727. }{
  728. {
  729. name: "storeIsNil",
  730. wantErr: true,
  731. },
  732. {
  733. name: "specIsNil",
  734. wantErr: true,
  735. args: args{
  736. store: &esv1beta1.SecretStore{},
  737. },
  738. },
  739. {
  740. name: "providerIsNil",
  741. wantErr: true,
  742. args: args{
  743. store: &esv1beta1.SecretStore{
  744. Spec: esv1beta1.SecretStoreSpec{},
  745. },
  746. },
  747. },
  748. {
  749. name: "azureKVIsNil",
  750. wantErr: true,
  751. args: args{
  752. store: &esv1beta1.SecretStore{
  753. Spec: esv1beta1.SecretStoreSpec{
  754. Provider: &esv1beta1.SecretStoreProvider{},
  755. },
  756. },
  757. },
  758. },
  759. {
  760. name: "empty auth",
  761. wantErr: false,
  762. args: args{
  763. store: &esv1beta1.SecretStore{
  764. Spec: esv1beta1.SecretStoreSpec{
  765. Provider: &esv1beta1.SecretStoreProvider{
  766. AzureKV: &esv1beta1.AzureKVProvider{},
  767. },
  768. },
  769. },
  770. },
  771. },
  772. {
  773. name: "empty client id",
  774. wantErr: false,
  775. args: args{
  776. store: &esv1beta1.SecretStore{
  777. Spec: esv1beta1.SecretStoreSpec{
  778. Provider: &esv1beta1.SecretStoreProvider{
  779. AzureKV: &esv1beta1.AzureKVProvider{
  780. AuthSecretRef: &esv1beta1.AzureKVAuth{},
  781. },
  782. },
  783. },
  784. },
  785. },
  786. },
  787. {
  788. name: "invalid client id",
  789. wantErr: true,
  790. args: args{
  791. store: &esv1beta1.SecretStore{
  792. Spec: esv1beta1.SecretStoreSpec{
  793. Provider: &esv1beta1.SecretStoreProvider{
  794. AzureKV: &esv1beta1.AzureKVProvider{
  795. AuthSecretRef: &esv1beta1.AzureKVAuth{
  796. ClientID: &v1.SecretKeySelector{
  797. Namespace: pointer.StringPtr("invalid"),
  798. },
  799. },
  800. },
  801. },
  802. },
  803. },
  804. },
  805. },
  806. {
  807. name: "invalid client secret",
  808. wantErr: true,
  809. args: args{
  810. store: &esv1beta1.SecretStore{
  811. Spec: esv1beta1.SecretStoreSpec{
  812. Provider: &esv1beta1.SecretStoreProvider{
  813. AzureKV: &esv1beta1.AzureKVProvider{
  814. AuthSecretRef: &esv1beta1.AzureKVAuth{
  815. ClientSecret: &v1.SecretKeySelector{
  816. Namespace: pointer.StringPtr("invalid"),
  817. },
  818. },
  819. },
  820. },
  821. },
  822. },
  823. },
  824. },
  825. }
  826. for _, tt := range tests {
  827. t.Run(tt.name, func(t *testing.T) {
  828. a := &Azure{}
  829. if tt.name == "storeIsNil" {
  830. if err := a.ValidateStore(nil); (err != nil) != tt.wantErr {
  831. t.Errorf(errStore, err, tt.wantErr)
  832. }
  833. } else if err := a.ValidateStore(tt.args.store); (err != nil) != tt.wantErr {
  834. t.Errorf(errStore, err, tt.wantErr)
  835. }
  836. })
  837. }
  838. }