keyvault_test.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  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. )
  94. func getTagMap() map[string]*string {
  95. tag1 := "tagname"
  96. tag2 := "tagname2"
  97. value1 := "tagvalue"
  98. value2 := "tagvalue2"
  99. tagMap := make(map[string]*string)
  100. tagMap[tag1] = &value1
  101. tagMap[tag2] = &value2
  102. return tagMap
  103. }
  104. func newKVJWK(b []byte) *keyvault.JSONWebKey {
  105. var key keyvault.JSONWebKey
  106. err := json.Unmarshal(b, &key)
  107. if err != nil {
  108. panic(err)
  109. }
  110. return &key
  111. }
  112. // test the sm<->azurekv interface
  113. // make sure correct values are passed and errors are handled accordingly.
  114. func TestAzureKeyVaultSecretManagerGetSecret(t *testing.T) {
  115. secretString := "changedvalue"
  116. secretCertificate := "certificate_value"
  117. tagMap := getTagMap()
  118. // good case
  119. setSecretString := func(smtc *secretManagerTestCase) {
  120. smtc.expectedSecret = secretString
  121. smtc.secretOutput = keyvault.SecretBundle{
  122. Value: &secretString,
  123. }
  124. }
  125. setSecretStringWithVersion := func(smtc *secretManagerTestCase) {
  126. smtc.expectedSecret = secretString
  127. smtc.secretOutput = keyvault.SecretBundle{
  128. Value: &secretString,
  129. }
  130. smtc.ref.Version = "v1"
  131. smtc.secretVersion = smtc.ref.Version
  132. }
  133. setSecretWithProperty := func(smtc *secretManagerTestCase) {
  134. jsonString := jsonTestString
  135. smtc.expectedSecret = "External"
  136. smtc.secretOutput = keyvault.SecretBundle{
  137. Value: &jsonString,
  138. }
  139. smtc.ref.Property = "Name"
  140. }
  141. badSecretWithProperty := func(smtc *secretManagerTestCase) {
  142. jsonString := jsonTestString
  143. smtc.expectedSecret = ""
  144. smtc.secretOutput = keyvault.SecretBundle{
  145. Value: &jsonString,
  146. }
  147. smtc.ref.Property = "Age"
  148. smtc.expectError = fmt.Sprintf("property %s does not exist in key %s", smtc.ref.Property, smtc.ref.Key)
  149. smtc.apiErr = errors.New(smtc.expectError)
  150. }
  151. // // good case: key set
  152. setPubRSAKey := func(smtc *secretManagerTestCase) {
  153. smtc.secretName = keyName
  154. smtc.expectedSecret = jwkPubRSA
  155. smtc.keyOutput = keyvault.KeyBundle{
  156. Key: newKVJWK([]byte(jwkPubRSA)),
  157. }
  158. smtc.ref.Key = smtc.secretName
  159. }
  160. // // good case: key set
  161. setPubECKey := func(smtc *secretManagerTestCase) {
  162. smtc.secretName = keyName
  163. smtc.expectedSecret = jwkPubEC
  164. smtc.keyOutput = keyvault.KeyBundle{
  165. Key: newKVJWK([]byte(jwkPubEC)),
  166. }
  167. smtc.ref.Key = smtc.secretName
  168. }
  169. // // good case: key set
  170. setCertificate := func(smtc *secretManagerTestCase) {
  171. byteArrString := []byte(secretCertificate)
  172. smtc.secretName = certName
  173. smtc.expectedSecret = secretCertificate
  174. smtc.certOutput = keyvault.CertificateBundle{
  175. Cer: &byteArrString,
  176. }
  177. smtc.ref.Key = smtc.secretName
  178. }
  179. badSecretType := func(smtc *secretManagerTestCase) {
  180. smtc.secretName = "name"
  181. smtc.expectedSecret = ""
  182. smtc.expectError = fmt.Sprintf("unknown Azure Keyvault object Type for %s", smtc.secretName)
  183. smtc.ref.Key = fmt.Sprintf("dummy/%s", smtc.secretName)
  184. }
  185. setSecretWithTag := func(smtc *secretManagerTestCase) {
  186. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  187. smtc.ref.Property = tagname
  188. smtc.secretOutput = keyvault.SecretBundle{
  189. Value: &secretString, Tags: tagMap,
  190. }
  191. smtc.expectedSecret = tagvalue
  192. }
  193. badSecretWithTag := func(smtc *secretManagerTestCase) {
  194. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  195. smtc.ref.Property = something
  196. smtc.expectedSecret = ""
  197. smtc.expectError = errorNoTag
  198. smtc.apiErr = errors.New(smtc.expectError)
  199. }
  200. setSecretWithNoSpecificTag := func(smtc *secretManagerTestCase) {
  201. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  202. smtc.secretOutput = keyvault.SecretBundle{
  203. Value: &secretString, Tags: tagMap,
  204. }
  205. smtc.expectedSecret = jsonTagTestString
  206. }
  207. setSecretWithNoTags := func(smtc *secretManagerTestCase) {
  208. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  209. smtc.secretOutput = keyvault.SecretBundle{}
  210. smtc.expectedSecret = "{}"
  211. }
  212. setCertWithTag := func(smtc *secretManagerTestCase) {
  213. byteArrString := []byte(secretCertificate)
  214. smtc.secretName = certName
  215. smtc.certOutput = keyvault.CertificateBundle{
  216. Cer: &byteArrString, Tags: tagMap,
  217. }
  218. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  219. smtc.ref.Property = tagname
  220. smtc.expectedSecret = tagvalue
  221. smtc.ref.Key = smtc.secretName
  222. }
  223. badCertWithTag := func(smtc *secretManagerTestCase) {
  224. byteArrString := []byte(secretCertificate)
  225. smtc.secretName = certName
  226. smtc.ref.Key = smtc.secretName
  227. smtc.certOutput = keyvault.CertificateBundle{
  228. Cer: &byteArrString,
  229. }
  230. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  231. smtc.ref.Property = something
  232. smtc.expectedSecret = ""
  233. smtc.expectError = errorNoTag
  234. smtc.apiErr = errors.New(smtc.expectError)
  235. }
  236. setCertWithNoSpecificTag := func(smtc *secretManagerTestCase) {
  237. byteArrString := []byte(secretCertificate)
  238. smtc.secretName = certName
  239. smtc.ref.Key = smtc.secretName
  240. smtc.certOutput = keyvault.CertificateBundle{
  241. Cer: &byteArrString, Tags: tagMap,
  242. }
  243. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  244. smtc.expectedSecret = jsonTagTestString
  245. }
  246. setCertWithNoTags := func(smtc *secretManagerTestCase) {
  247. byteArrString := []byte(secretCertificate)
  248. smtc.secretName = certName
  249. smtc.ref.Key = smtc.secretName
  250. smtc.certOutput = keyvault.CertificateBundle{
  251. Cer: &byteArrString,
  252. }
  253. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  254. smtc.expectedSecret = "{}"
  255. }
  256. setKeyWithTag := func(smtc *secretManagerTestCase) {
  257. smtc.secretName = keyName
  258. smtc.keyOutput = keyvault.KeyBundle{
  259. Key: newKVJWK([]byte(jwkPubRSA)), Tags: tagMap,
  260. }
  261. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  262. smtc.ref.Property = tagname
  263. smtc.expectedSecret = tagvalue
  264. smtc.ref.Key = smtc.secretName
  265. }
  266. badKeyWithTag := func(smtc *secretManagerTestCase) {
  267. smtc.secretName = keyName
  268. smtc.ref.Key = smtc.secretName
  269. smtc.keyOutput = keyvault.KeyBundle{
  270. Key: newKVJWK([]byte(jwkPubRSA)), Tags: tagMap,
  271. }
  272. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  273. smtc.ref.Property = something
  274. smtc.expectedSecret = ""
  275. smtc.expectError = errorNoTag
  276. smtc.apiErr = errors.New(smtc.expectError)
  277. }
  278. setKeyWithNoSpecificTag := func(smtc *secretManagerTestCase) {
  279. smtc.secretName = keyName
  280. smtc.ref.Key = smtc.secretName
  281. smtc.keyOutput = keyvault.KeyBundle{
  282. Key: newKVJWK([]byte(jwkPubRSA)), Tags: tagMap,
  283. }
  284. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  285. smtc.expectedSecret = jsonTagTestString
  286. }
  287. setKeyWithNoTags := func(smtc *secretManagerTestCase) {
  288. smtc.secretName = keyName
  289. smtc.ref.Key = smtc.secretName
  290. smtc.keyOutput = keyvault.KeyBundle{
  291. Key: newKVJWK([]byte(jwkPubRSA)),
  292. }
  293. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  294. smtc.expectedSecret = "{}"
  295. }
  296. badPropertyTag := func(smtc *secretManagerTestCase) {
  297. smtc.ref.Property = tagname
  298. smtc.expectedSecret = ""
  299. smtc.expectError = "property tagname does not exist in key test-secret"
  300. smtc.apiErr = errors.New(smtc.expectError)
  301. }
  302. successCases := []*secretManagerTestCase{
  303. makeValidSecretManagerTestCase(),
  304. makeValidSecretManagerTestCaseCustom(setSecretString),
  305. makeValidSecretManagerTestCaseCustom(setSecretStringWithVersion),
  306. makeValidSecretManagerTestCaseCustom(setSecretWithProperty),
  307. makeValidSecretManagerTestCaseCustom(badSecretWithProperty),
  308. makeValidSecretManagerTestCaseCustom(setPubRSAKey),
  309. makeValidSecretManagerTestCaseCustom(setPubECKey),
  310. makeValidSecretManagerTestCaseCustom(setCertificate),
  311. makeValidSecretManagerTestCaseCustom(badSecretType),
  312. makeValidSecretManagerTestCaseCustom(setSecretWithTag),
  313. makeValidSecretManagerTestCaseCustom(badSecretWithTag),
  314. makeValidSecretManagerTestCaseCustom(setSecretWithNoSpecificTag),
  315. makeValidSecretManagerTestCaseCustom(setSecretWithNoTags),
  316. makeValidSecretManagerTestCaseCustom(setCertWithTag),
  317. makeValidSecretManagerTestCaseCustom(badCertWithTag),
  318. makeValidSecretManagerTestCaseCustom(setCertWithNoSpecificTag),
  319. makeValidSecretManagerTestCaseCustom(setCertWithNoTags),
  320. makeValidSecretManagerTestCaseCustom(setKeyWithTag),
  321. makeValidSecretManagerTestCaseCustom(badKeyWithTag),
  322. makeValidSecretManagerTestCaseCustom(setKeyWithNoSpecificTag),
  323. makeValidSecretManagerTestCaseCustom(setKeyWithNoTags),
  324. makeValidSecretManagerTestCaseCustom(badPropertyTag),
  325. }
  326. sm := Azure{
  327. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  328. }
  329. for k, v := range successCases {
  330. sm.baseClient = v.mockClient
  331. out, err := sm.GetSecret(context.Background(), *v.ref)
  332. if !utils.ErrorContains(err, v.expectError) {
  333. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  334. }
  335. if string(out) != v.expectedSecret {
  336. t.Errorf("[%d] unexpected secret: expected %s, got %s", k, v.expectedSecret, string(out))
  337. }
  338. }
  339. }
  340. func TestAzureKeyVaultSecretManagerGetSecretMap(t *testing.T) {
  341. secretString := "changedvalue"
  342. secretCertificate := "certificate_value"
  343. tagMap := getTagMap()
  344. badSecretString := func(smtc *secretManagerTestCase) {
  345. smtc.expectedSecret = secretString
  346. smtc.secretOutput = keyvault.SecretBundle{
  347. Value: &secretString,
  348. }
  349. smtc.expectError = "error unmarshalling json data: invalid character 'c' looking for beginning of value"
  350. }
  351. setSecretJSON := func(smtc *secretManagerTestCase) {
  352. jsonString := jsonSingleTestString
  353. smtc.secretOutput = keyvault.SecretBundle{
  354. Value: &jsonString,
  355. }
  356. smtc.expectedData["Name"] = []byte("External")
  357. smtc.expectedData["LastName"] = []byte("Secret")
  358. }
  359. setSecretJSONWithProperty := func(smtc *secretManagerTestCase) {
  360. jsonString := jsonTestString
  361. smtc.secretOutput = keyvault.SecretBundle{
  362. Value: &jsonString,
  363. }
  364. smtc.ref.Property = "Address"
  365. smtc.expectedData["Street"] = []byte("Myroad st.")
  366. smtc.expectedData["CP"] = []byte("J4K4T4")
  367. }
  368. badSecretWithProperty := func(smtc *secretManagerTestCase) {
  369. jsonString := jsonTestString
  370. smtc.expectedSecret = ""
  371. smtc.secretOutput = keyvault.SecretBundle{
  372. Value: &jsonString,
  373. }
  374. smtc.ref.Property = "Age"
  375. smtc.expectError = fmt.Sprintf("property %s does not exist in key %s", smtc.ref.Property, smtc.ref.Key)
  376. smtc.apiErr = errors.New(smtc.expectError)
  377. }
  378. badPubRSAKey := func(smtc *secretManagerTestCase) {
  379. smtc.secretName = keyName
  380. smtc.expectedSecret = jwkPubRSA
  381. smtc.keyOutput = keyvault.KeyBundle{
  382. Key: newKVJWK([]byte(jwkPubRSA)),
  383. }
  384. smtc.ref.Key = smtc.secretName
  385. smtc.expectError = "cannot get use dataFrom to get key secret"
  386. }
  387. badCertificate := func(smtc *secretManagerTestCase) {
  388. byteArrString := []byte(secretCertificate)
  389. smtc.secretName = certName
  390. smtc.expectedSecret = secretCertificate
  391. smtc.certOutput = keyvault.CertificateBundle{
  392. Cer: &byteArrString,
  393. }
  394. smtc.ref.Key = smtc.secretName
  395. smtc.expectError = "cannot get use dataFrom to get certificate secret"
  396. }
  397. badSecretType := func(smtc *secretManagerTestCase) {
  398. smtc.secretName = "name"
  399. smtc.expectedSecret = ""
  400. smtc.expectError = fmt.Sprintf("unknown Azure Keyvault object Type for %s", smtc.secretName)
  401. smtc.ref.Key = fmt.Sprintf("dummy/%s", smtc.secretName)
  402. }
  403. setSecretTags := func(smtc *secretManagerTestCase) {
  404. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  405. smtc.secretOutput = keyvault.SecretBundle{
  406. Tags: tagMap,
  407. }
  408. smtc.expectedData[testsecret+"_"+tagname] = []byte(tagvalue)
  409. smtc.expectedData[testsecret+"_"+tagname2] = []byte(tagvalue2)
  410. }
  411. setSecretWithJSONTag := func(smtc *secretManagerTestCase) {
  412. tagJSONMap := make(map[string]*string)
  413. tagJSONData := `{"keyname":"keyvalue","x":"y"}`
  414. tagJSONMap["json"] = &tagJSONData
  415. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  416. smtc.secretOutput = keyvault.SecretBundle{
  417. Value: &secretString, Tags: tagJSONMap,
  418. }
  419. smtc.expectedData[testsecret+"_json_keyname"] = []byte("keyvalue")
  420. smtc.expectedData[testsecret+"_json_x"] = []byte("y")
  421. }
  422. setSecretWithNoTags := func(smtc *secretManagerTestCase) {
  423. smtc.ref.MetadataPolicy = esv1beta1.ExternalSecretMetadataPolicyFetch
  424. tagMapTestEmpty := make(map[string]*string)
  425. smtc.secretOutput = keyvault.SecretBundle{
  426. Tags: tagMapTestEmpty,
  427. }
  428. smtc.expectedSecret = ""
  429. }
  430. successCases := []*secretManagerTestCase{
  431. makeValidSecretManagerTestCaseCustom(badSecretString),
  432. makeValidSecretManagerTestCaseCustom(setSecretJSON),
  433. makeValidSecretManagerTestCaseCustom(setSecretJSONWithProperty),
  434. makeValidSecretManagerTestCaseCustom(badSecretWithProperty),
  435. makeValidSecretManagerTestCaseCustom(badPubRSAKey),
  436. makeValidSecretManagerTestCaseCustom(badCertificate),
  437. makeValidSecretManagerTestCaseCustom(badSecretType),
  438. makeValidSecretManagerTestCaseCustom(setSecretTags),
  439. makeValidSecretManagerTestCaseCustom(setSecretWithJSONTag),
  440. makeValidSecretManagerTestCaseCustom(setSecretWithNoTags),
  441. }
  442. sm := Azure{
  443. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  444. }
  445. for k, v := range successCases {
  446. sm.baseClient = v.mockClient
  447. out, err := sm.GetSecretMap(context.Background(), *v.ref)
  448. if !utils.ErrorContains(err, v.expectError) {
  449. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  450. }
  451. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  452. t.Errorf("[%d] unexpected secret data: expected %#v, got %#v", k, v.expectedData, out)
  453. }
  454. }
  455. }
  456. func TestAzureKeyVaultSecretManagerGetAllSecrets(t *testing.T) {
  457. secretString := secretString
  458. secretName := secretName
  459. wrongName := "not-valid"
  460. environment := "dev"
  461. author := "seb"
  462. enabled := true
  463. getNextPage := func(ctx context.Context, list keyvault.SecretListResult) (result keyvault.SecretListResult, err error) {
  464. return keyvault.SecretListResult{
  465. Value: nil,
  466. NextLink: nil,
  467. }, nil
  468. }
  469. setOneSecretByName := func(smtc *secretManagerTestCase) {
  470. enabledAtt := keyvault.SecretAttributes{
  471. Enabled: &enabled,
  472. }
  473. secretItem := keyvault.SecretItem{
  474. ID: &secretName,
  475. Attributes: &enabledAtt,
  476. }
  477. secretList := make([]keyvault.SecretItem, 0)
  478. secretList = append(secretList, secretItem)
  479. list := keyvault.SecretListResult{
  480. Value: &secretList,
  481. }
  482. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  483. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  484. smtc.expectedSecret = secretString
  485. smtc.secretOutput = keyvault.SecretBundle{
  486. Value: &secretString,
  487. }
  488. smtc.expectedData[secretName] = []byte(secretString)
  489. }
  490. setTwoSecretsByName := func(smtc *secretManagerTestCase) {
  491. enabledAtt := keyvault.SecretAttributes{
  492. Enabled: &enabled,
  493. }
  494. secretItemOne := keyvault.SecretItem{
  495. ID: &secretName,
  496. Attributes: &enabledAtt,
  497. }
  498. secretItemTwo := keyvault.SecretItem{
  499. ID: &wrongName,
  500. Attributes: &enabledAtt,
  501. }
  502. secretList := make([]keyvault.SecretItem, 1)
  503. secretList = append(secretList, secretItemOne, secretItemTwo)
  504. list := keyvault.SecretListResult{
  505. Value: &secretList,
  506. }
  507. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  508. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  509. smtc.expectedSecret = secretString
  510. smtc.secretOutput = keyvault.SecretBundle{
  511. Value: &secretString,
  512. }
  513. smtc.expectedData[secretName] = []byte(secretString)
  514. }
  515. setOneSecretByTag := func(smtc *secretManagerTestCase) {
  516. enabledAtt := keyvault.SecretAttributes{
  517. Enabled: &enabled,
  518. }
  519. secretItem := keyvault.SecretItem{
  520. ID: &secretName,
  521. Attributes: &enabledAtt,
  522. Tags: map[string]*string{"environment": &environment},
  523. }
  524. secretList := make([]keyvault.SecretItem, 0)
  525. secretList = append(secretList, secretItem)
  526. list := keyvault.SecretListResult{
  527. Value: &secretList,
  528. }
  529. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  530. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  531. smtc.expectedSecret = secretString
  532. smtc.secretOutput = keyvault.SecretBundle{
  533. Value: &secretString,
  534. }
  535. smtc.refFind.Tags = map[string]string{"environment": environment}
  536. smtc.expectedData[secretName] = []byte(secretString)
  537. }
  538. setTwoSecretsByTag := func(smtc *secretManagerTestCase) {
  539. enabled := true
  540. enabledAtt := keyvault.SecretAttributes{
  541. Enabled: &enabled,
  542. }
  543. secretItem := keyvault.SecretItem{
  544. ID: &secretName,
  545. Attributes: &enabledAtt,
  546. Tags: map[string]*string{"environment": &environment, "author": &author},
  547. }
  548. secretList := make([]keyvault.SecretItem, 0)
  549. secretList = append(secretList, secretItem)
  550. list := keyvault.SecretListResult{
  551. Value: &secretList,
  552. }
  553. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  554. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  555. smtc.expectedSecret = secretString
  556. smtc.secretOutput = keyvault.SecretBundle{
  557. Value: &secretString,
  558. }
  559. smtc.refFind.Tags = map[string]string{"environment": environment, "author": author}
  560. smtc.expectedData[secretName] = []byte(secretString)
  561. }
  562. successCases := []*secretManagerTestCase{
  563. makeValidSecretManagerTestCaseCustom(setOneSecretByName),
  564. makeValidSecretManagerTestCaseCustom(setTwoSecretsByName),
  565. makeValidSecretManagerTestCaseCustom(setOneSecretByTag),
  566. makeValidSecretManagerTestCaseCustom(setTwoSecretsByTag),
  567. }
  568. sm := Azure{
  569. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  570. }
  571. for k, v := range successCases {
  572. sm.baseClient = v.mockClient
  573. out, err := sm.GetAllSecrets(context.Background(), *v.refFind)
  574. if !utils.ErrorContains(err, v.expectError) {
  575. t.Errorf(unexpectedError, k, err.Error(), v.expectError)
  576. }
  577. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  578. t.Errorf(unexpectedSecretData, k, v.expectedData, out)
  579. }
  580. }
  581. }
  582. func makeValidRef() *esv1beta1.ExternalSecretDataRemoteRef {
  583. return &esv1beta1.ExternalSecretDataRemoteRef{
  584. Key: "test-secret",
  585. Version: "default",
  586. Property: "",
  587. }
  588. }
  589. func makeValidFind() *esv1beta1.ExternalSecretFind {
  590. return &esv1beta1.ExternalSecretFind{
  591. Name: &esv1beta1.FindName{
  592. RegExp: "^example",
  593. },
  594. Tags: map[string]string{},
  595. }
  596. }
  597. func TestValidateStore(t *testing.T) {
  598. type args struct {
  599. auth esv1beta1.AzureKVAuth
  600. }
  601. tests := []struct {
  602. name string
  603. args args
  604. wantErr bool
  605. }{
  606. {
  607. name: "empty auth",
  608. wantErr: false,
  609. },
  610. {
  611. name: "empty client id",
  612. wantErr: false,
  613. args: args{
  614. auth: esv1beta1.AzureKVAuth{},
  615. },
  616. },
  617. {
  618. name: "invalid client id",
  619. wantErr: true,
  620. args: args{
  621. auth: esv1beta1.AzureKVAuth{
  622. ClientID: &v1.SecretKeySelector{
  623. Namespace: pointer.StringPtr("invalid"),
  624. },
  625. },
  626. },
  627. },
  628. {
  629. name: "invalid client secret",
  630. wantErr: true,
  631. args: args{
  632. auth: esv1beta1.AzureKVAuth{
  633. ClientSecret: &v1.SecretKeySelector{
  634. Namespace: pointer.StringPtr("invalid"),
  635. },
  636. },
  637. },
  638. },
  639. }
  640. for _, tt := range tests {
  641. t.Run(tt.name, func(t *testing.T) {
  642. a := &Azure{}
  643. store := &esv1beta1.SecretStore{
  644. Spec: esv1beta1.SecretStoreSpec{
  645. Provider: &esv1beta1.SecretStoreProvider{
  646. AzureKV: &esv1beta1.AzureKVProvider{
  647. AuthSecretRef: &tt.args.auth,
  648. },
  649. },
  650. },
  651. }
  652. if err := a.ValidateStore(store); (err != nil) != tt.wantErr {
  653. t.Errorf("Azure.ValidateStore() error = %v, wantErr %v", err, tt.wantErr)
  654. }
  655. })
  656. }
  657. }