keyvault_test.go 25 KB

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