keyvault_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  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. tassert "github.com/stretchr/testify/assert"
  22. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  23. "k8s.io/utils/pointer"
  24. clientfake "sigs.k8s.io/controller-runtime/pkg/client/fake"
  25. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  26. v1 "github.com/external-secrets/external-secrets/apis/meta/v1"
  27. fake "github.com/external-secrets/external-secrets/pkg/provider/azure/keyvault/fake"
  28. "github.com/external-secrets/external-secrets/pkg/provider/schema"
  29. utils "github.com/external-secrets/external-secrets/pkg/utils"
  30. )
  31. type secretManagerTestCase struct {
  32. mockClient *fake.AzureMockClient
  33. secretName string
  34. secretVersion string
  35. serviceURL string
  36. ref *esv1beta1.ExternalSecretDataRemoteRef
  37. refFind *esv1beta1.ExternalSecretFind
  38. apiErr error
  39. secretOutput keyvault.SecretBundle
  40. keyOutput keyvault.KeyBundle
  41. certOutput keyvault.CertificateBundle
  42. listOutput keyvault.SecretListResultIterator
  43. expectError string
  44. expectedSecret string
  45. // for testing secretmap
  46. expectedData map[string][]byte
  47. }
  48. func makeValidSecretManagerTestCase() *secretManagerTestCase {
  49. secretString := "Hello World!"
  50. smtc := secretManagerTestCase{
  51. mockClient: &fake.AzureMockClient{},
  52. secretName: "MySecret",
  53. secretVersion: "",
  54. ref: makeValidRef(),
  55. refFind: makeValidFind(),
  56. secretOutput: keyvault.SecretBundle{Value: &secretString},
  57. serviceURL: "",
  58. apiErr: nil,
  59. expectError: "",
  60. expectedSecret: secretString,
  61. expectedData: map[string][]byte{},
  62. }
  63. smtc.mockClient.WithValue(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.secretOutput, smtc.apiErr)
  64. return &smtc
  65. }
  66. func makeValidSecretManagerTestCaseCustom(tweaks ...func(smtc *secretManagerTestCase)) *secretManagerTestCase {
  67. smtc := makeValidSecretManagerTestCase()
  68. for _, fn := range tweaks {
  69. fn(smtc)
  70. }
  71. smtc.mockClient.WithValue(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.secretOutput, smtc.apiErr)
  72. smtc.mockClient.WithKey(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.keyOutput, smtc.apiErr)
  73. smtc.mockClient.WithCertificate(smtc.serviceURL, smtc.secretName, smtc.secretVersion, smtc.certOutput, smtc.apiErr)
  74. smtc.mockClient.WithList(smtc.serviceURL, smtc.listOutput, smtc.apiErr)
  75. return smtc
  76. }
  77. func TestNewClientManagedIdentityNoNeedForCredentials(t *testing.T) {
  78. namespace := "internal"
  79. vaultURL := "https://local.vault.url"
  80. identityID := "1234"
  81. authType := esv1beta1.ManagedIdentity
  82. store := esv1beta1.SecretStore{
  83. ObjectMeta: metav1.ObjectMeta{
  84. Namespace: namespace,
  85. },
  86. Spec: esv1beta1.SecretStoreSpec{Provider: &esv1beta1.SecretStoreProvider{AzureKV: &esv1beta1.AzureKVProvider{
  87. AuthType: &authType,
  88. IdentityID: &identityID,
  89. VaultURL: &vaultURL,
  90. }}},
  91. }
  92. provider, err := schema.GetProvider(&store)
  93. tassert.Nil(t, err, "the return err should be nil")
  94. k8sClient := clientfake.NewClientBuilder().Build()
  95. secretClient, err := provider.NewClient(context.Background(), &store, k8sClient, namespace)
  96. if err != nil {
  97. // On non Azure environment, MSI auth not available, so this error should be returned
  98. tassert.EqualError(t, err, "failed to get oauth token from MSI: MSI not available")
  99. } else {
  100. // On Azure (where GitHub Actions are running) a secretClient is returned, as only an Authorizer is configured, but no token is requested for MI
  101. tassert.NotNil(t, secretClient)
  102. }
  103. }
  104. func TestNewClientNoCreds(t *testing.T) {
  105. namespace := "internal"
  106. vaultURL := "https://local.vault.url"
  107. tenantID := "1234"
  108. authType := esv1beta1.ServicePrincipal
  109. store := esv1beta1.SecretStore{
  110. ObjectMeta: metav1.ObjectMeta{
  111. Namespace: namespace,
  112. },
  113. Spec: esv1beta1.SecretStoreSpec{Provider: &esv1beta1.SecretStoreProvider{AzureKV: &esv1beta1.AzureKVProvider{
  114. AuthType: &authType,
  115. VaultURL: &vaultURL,
  116. TenantID: &tenantID,
  117. }}},
  118. }
  119. provider, err := schema.GetProvider(&store)
  120. tassert.Nil(t, err, "the return err should be nil")
  121. k8sClient := clientfake.NewClientBuilder().Build()
  122. _, err = provider.NewClient(context.Background(), &store, k8sClient, namespace)
  123. tassert.EqualError(t, err, "missing secretRef in provider config")
  124. store.Spec.Provider.AzureKV.AuthSecretRef = &esv1beta1.AzureKVAuth{}
  125. _, err = provider.NewClient(context.Background(), &store, k8sClient, namespace)
  126. tassert.EqualError(t, err, "missing accessKeyID/secretAccessKey in store config")
  127. store.Spec.Provider.AzureKV.AuthSecretRef.ClientID = &v1.SecretKeySelector{Name: "user"}
  128. _, err = provider.NewClient(context.Background(), &store, k8sClient, namespace)
  129. tassert.EqualError(t, err, "missing accessKeyID/secretAccessKey in store config")
  130. store.Spec.Provider.AzureKV.AuthSecretRef.ClientSecret = &v1.SecretKeySelector{Name: "password"}
  131. _, err = provider.NewClient(context.Background(), &store, k8sClient, namespace)
  132. tassert.EqualError(t, err, "could not find secret internal/user: secrets \"user\" not found")
  133. store.TypeMeta.Kind = esv1beta1.ClusterSecretStoreKind
  134. store.TypeMeta.APIVersion = esv1beta1.ClusterSecretStoreKindAPIVersion
  135. ns := "default"
  136. store.Spec.Provider.AzureKV.AuthSecretRef.ClientID.Namespace = &ns
  137. store.Spec.Provider.AzureKV.AuthSecretRef.ClientSecret.Namespace = &ns
  138. _, err = provider.NewClient(context.Background(), &store, k8sClient, namespace)
  139. tassert.EqualError(t, err, "could not find secret default/user: secrets \"user\" not found")
  140. }
  141. const (
  142. 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"}`
  143. 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"}`
  144. jsonTestString = `{"Name": "External", "LastName": "Secret", "Address": { "Street": "Myroad st.", "CP": "J4K4T4" } }`
  145. jsonSingleTestString = `{"Name": "External", "LastName": "Secret" }`
  146. keyName = "key/keyname"
  147. certName = "cert/certname"
  148. secretString = "changedvalue"
  149. unexpectedError = "[%d] unexpected error: %s, expected: '%s'"
  150. unexpectedSecretData = "[%d] unexpected secret data: expected %#v, got %#v"
  151. secretName = "example-1"
  152. fakeURL = "noop"
  153. )
  154. func newKVJWK(b []byte) *keyvault.JSONWebKey {
  155. var key keyvault.JSONWebKey
  156. err := json.Unmarshal(b, &key)
  157. if err != nil {
  158. panic(err)
  159. }
  160. return &key
  161. }
  162. // test the sm<->azurekv interface
  163. // make sure correct values are passed and errors are handled accordingly.
  164. func TestAzureKeyVaultSecretManagerGetSecret(t *testing.T) {
  165. secretString := "changedvalue"
  166. secretCertificate := "certificate_value"
  167. // good case
  168. setSecretString := func(smtc *secretManagerTestCase) {
  169. smtc.expectedSecret = secretString
  170. smtc.secretOutput = keyvault.SecretBundle{
  171. Value: &secretString,
  172. }
  173. }
  174. setSecretStringWithVersion := func(smtc *secretManagerTestCase) {
  175. smtc.expectedSecret = secretString
  176. smtc.secretOutput = keyvault.SecretBundle{
  177. Value: &secretString,
  178. }
  179. smtc.ref.Version = "v1"
  180. smtc.secretVersion = smtc.ref.Version
  181. }
  182. setSecretWithProperty := func(smtc *secretManagerTestCase) {
  183. jsonString := jsonTestString
  184. smtc.expectedSecret = "External"
  185. smtc.secretOutput = keyvault.SecretBundle{
  186. Value: &jsonString,
  187. }
  188. smtc.ref.Property = "Name"
  189. }
  190. badSecretWithProperty := func(smtc *secretManagerTestCase) {
  191. jsonString := jsonTestString
  192. smtc.expectedSecret = ""
  193. smtc.secretOutput = keyvault.SecretBundle{
  194. Value: &jsonString,
  195. }
  196. smtc.ref.Property = "Age"
  197. smtc.expectError = fmt.Sprintf("property %s does not exist in key %s", smtc.ref.Property, smtc.ref.Key)
  198. smtc.apiErr = errors.New(smtc.expectError)
  199. }
  200. // // good case: key set
  201. setPubRSAKey := func(smtc *secretManagerTestCase) {
  202. smtc.secretName = keyName
  203. smtc.expectedSecret = jwkPubRSA
  204. smtc.keyOutput = keyvault.KeyBundle{
  205. Key: newKVJWK([]byte(jwkPubRSA)),
  206. }
  207. smtc.ref.Key = smtc.secretName
  208. }
  209. // // good case: key set
  210. setPubECKey := func(smtc *secretManagerTestCase) {
  211. smtc.secretName = keyName
  212. smtc.expectedSecret = jwkPubEC
  213. smtc.keyOutput = keyvault.KeyBundle{
  214. Key: newKVJWK([]byte(jwkPubEC)),
  215. }
  216. smtc.ref.Key = smtc.secretName
  217. }
  218. // // good case: key set
  219. setCertificate := func(smtc *secretManagerTestCase) {
  220. byteArrString := []byte(secretCertificate)
  221. smtc.secretName = certName
  222. smtc.expectedSecret = secretCertificate
  223. smtc.certOutput = keyvault.CertificateBundle{
  224. Cer: &byteArrString,
  225. }
  226. smtc.ref.Key = smtc.secretName
  227. }
  228. badSecretType := func(smtc *secretManagerTestCase) {
  229. smtc.secretName = "name"
  230. smtc.expectedSecret = ""
  231. smtc.expectError = fmt.Sprintf("unknown Azure Keyvault object Type for %s", smtc.secretName)
  232. smtc.ref.Key = fmt.Sprintf("dummy/%s", smtc.secretName)
  233. }
  234. successCases := []*secretManagerTestCase{
  235. makeValidSecretManagerTestCase(),
  236. makeValidSecretManagerTestCaseCustom(setSecretString),
  237. makeValidSecretManagerTestCaseCustom(setSecretStringWithVersion),
  238. makeValidSecretManagerTestCaseCustom(setSecretWithProperty),
  239. makeValidSecretManagerTestCaseCustom(badSecretWithProperty),
  240. makeValidSecretManagerTestCaseCustom(setPubRSAKey),
  241. makeValidSecretManagerTestCaseCustom(setPubECKey),
  242. makeValidSecretManagerTestCaseCustom(setCertificate),
  243. makeValidSecretManagerTestCaseCustom(badSecretType),
  244. }
  245. sm := Azure{
  246. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  247. }
  248. for k, v := range successCases {
  249. sm.baseClient = v.mockClient
  250. out, err := sm.GetSecret(context.Background(), *v.ref)
  251. if !utils.ErrorContains(err, v.expectError) {
  252. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  253. }
  254. if string(out) != v.expectedSecret {
  255. t.Errorf("[%d] unexpected secret: expected %s, got %s", k, v.expectedSecret, string(out))
  256. }
  257. }
  258. }
  259. func TestAzureKeyVaultSecretManagerGetSecretMap(t *testing.T) {
  260. secretString := "changedvalue"
  261. secretCertificate := "certificate_value"
  262. badSecretString := func(smtc *secretManagerTestCase) {
  263. smtc.expectedSecret = secretString
  264. smtc.secretOutput = keyvault.SecretBundle{
  265. Value: &secretString,
  266. }
  267. smtc.expectError = "error unmarshalling json data: invalid character 'c' looking for beginning of value"
  268. }
  269. setSecretJSON := func(smtc *secretManagerTestCase) {
  270. jsonString := jsonSingleTestString
  271. smtc.secretOutput = keyvault.SecretBundle{
  272. Value: &jsonString,
  273. }
  274. smtc.expectedData["Name"] = []byte("External")
  275. smtc.expectedData["LastName"] = []byte("Secret")
  276. }
  277. setSecretJSONWithProperty := func(smtc *secretManagerTestCase) {
  278. jsonString := jsonTestString
  279. smtc.secretOutput = keyvault.SecretBundle{
  280. Value: &jsonString,
  281. }
  282. smtc.ref.Property = "Address"
  283. smtc.expectedData["Street"] = []byte("Myroad st.")
  284. smtc.expectedData["CP"] = []byte("J4K4T4")
  285. }
  286. badSecretWithProperty := func(smtc *secretManagerTestCase) {
  287. jsonString := jsonTestString
  288. smtc.expectedSecret = ""
  289. smtc.secretOutput = keyvault.SecretBundle{
  290. Value: &jsonString,
  291. }
  292. smtc.ref.Property = "Age"
  293. smtc.expectError = fmt.Sprintf("property %s does not exist in key %s", smtc.ref.Property, smtc.ref.Key)
  294. smtc.apiErr = errors.New(smtc.expectError)
  295. }
  296. badPubRSAKey := func(smtc *secretManagerTestCase) {
  297. smtc.secretName = keyName
  298. smtc.expectedSecret = jwkPubRSA
  299. smtc.keyOutput = keyvault.KeyBundle{
  300. Key: newKVJWK([]byte(jwkPubRSA)),
  301. }
  302. smtc.ref.Key = smtc.secretName
  303. smtc.expectError = "cannot get use dataFrom to get key secret"
  304. }
  305. badCertificate := func(smtc *secretManagerTestCase) {
  306. byteArrString := []byte(secretCertificate)
  307. smtc.secretName = certName
  308. smtc.expectedSecret = secretCertificate
  309. smtc.certOutput = keyvault.CertificateBundle{
  310. Cer: &byteArrString,
  311. }
  312. smtc.ref.Key = smtc.secretName
  313. smtc.expectError = "cannot get use dataFrom to get certificate secret"
  314. }
  315. badSecretType := func(smtc *secretManagerTestCase) {
  316. smtc.secretName = "name"
  317. smtc.expectedSecret = ""
  318. smtc.expectError = fmt.Sprintf("unknown Azure Keyvault object Type for %s", smtc.secretName)
  319. smtc.ref.Key = fmt.Sprintf("dummy/%s", smtc.secretName)
  320. }
  321. successCases := []*secretManagerTestCase{
  322. makeValidSecretManagerTestCaseCustom(badSecretString),
  323. makeValidSecretManagerTestCaseCustom(setSecretJSON),
  324. makeValidSecretManagerTestCaseCustom(setSecretJSONWithProperty),
  325. makeValidSecretManagerTestCaseCustom(badSecretWithProperty),
  326. makeValidSecretManagerTestCaseCustom(badPubRSAKey),
  327. makeValidSecretManagerTestCaseCustom(badCertificate),
  328. makeValidSecretManagerTestCaseCustom(badSecretType),
  329. }
  330. sm := Azure{
  331. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  332. }
  333. for k, v := range successCases {
  334. sm.baseClient = v.mockClient
  335. out, err := sm.GetSecretMap(context.Background(), *v.ref)
  336. if !utils.ErrorContains(err, v.expectError) {
  337. t.Errorf("[%d] unexpected error: %s, expected: '%s'", k, err.Error(), v.expectError)
  338. }
  339. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  340. t.Errorf("[%d] unexpected secret data: expected %#v, got %#v", k, v.expectedData, out)
  341. }
  342. }
  343. }
  344. func TestAzureKeyVaultSecretManagerGetAllSecrets(t *testing.T) {
  345. secretString := secretString
  346. secretName := secretName
  347. wrongName := "not-valid"
  348. environment := "dev"
  349. author := "seb"
  350. enabled := true
  351. getNextPage := func(ctx context.Context, list keyvault.SecretListResult) (result keyvault.SecretListResult, err error) {
  352. return keyvault.SecretListResult{
  353. Value: nil,
  354. NextLink: nil,
  355. }, nil
  356. }
  357. setOneSecretByName := func(smtc *secretManagerTestCase) {
  358. enabledAtt := keyvault.SecretAttributes{
  359. Enabled: &enabled,
  360. }
  361. secretItem := keyvault.SecretItem{
  362. ID: &secretName,
  363. Attributes: &enabledAtt,
  364. }
  365. secretList := make([]keyvault.SecretItem, 0)
  366. secretList = append(secretList, secretItem)
  367. list := keyvault.SecretListResult{
  368. Value: &secretList,
  369. }
  370. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  371. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  372. smtc.expectedSecret = secretString
  373. smtc.secretOutput = keyvault.SecretBundle{
  374. Value: &secretString,
  375. }
  376. smtc.expectedData[secretName] = []byte(secretString)
  377. }
  378. setTwoSecretsByName := func(smtc *secretManagerTestCase) {
  379. enabledAtt := keyvault.SecretAttributes{
  380. Enabled: &enabled,
  381. }
  382. secretItemOne := keyvault.SecretItem{
  383. ID: &secretName,
  384. Attributes: &enabledAtt,
  385. }
  386. secretItemTwo := keyvault.SecretItem{
  387. ID: &wrongName,
  388. Attributes: &enabledAtt,
  389. }
  390. secretList := make([]keyvault.SecretItem, 1)
  391. secretList = append(secretList, secretItemOne, secretItemTwo)
  392. list := keyvault.SecretListResult{
  393. Value: &secretList,
  394. }
  395. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  396. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  397. smtc.expectedSecret = secretString
  398. smtc.secretOutput = keyvault.SecretBundle{
  399. Value: &secretString,
  400. }
  401. smtc.expectedData[secretName] = []byte(secretString)
  402. }
  403. setOneSecretByTag := func(smtc *secretManagerTestCase) {
  404. enabledAtt := keyvault.SecretAttributes{
  405. Enabled: &enabled,
  406. }
  407. secretItem := keyvault.SecretItem{
  408. ID: &secretName,
  409. Attributes: &enabledAtt,
  410. Tags: map[string]*string{"environment": &environment},
  411. }
  412. secretList := make([]keyvault.SecretItem, 0)
  413. secretList = append(secretList, secretItem)
  414. list := keyvault.SecretListResult{
  415. Value: &secretList,
  416. }
  417. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  418. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  419. smtc.expectedSecret = secretString
  420. smtc.secretOutput = keyvault.SecretBundle{
  421. Value: &secretString,
  422. }
  423. smtc.refFind.Tags = map[string]string{"environment": environment}
  424. smtc.expectedData[secretName] = []byte(secretString)
  425. }
  426. setTwoSecretsByTag := func(smtc *secretManagerTestCase) {
  427. enabled := true
  428. enabledAtt := keyvault.SecretAttributes{
  429. Enabled: &enabled,
  430. }
  431. secretItem := keyvault.SecretItem{
  432. ID: &secretName,
  433. Attributes: &enabledAtt,
  434. Tags: map[string]*string{"environment": &environment, "author": &author},
  435. }
  436. secretList := make([]keyvault.SecretItem, 0)
  437. secretList = append(secretList, secretItem)
  438. list := keyvault.SecretListResult{
  439. Value: &secretList,
  440. }
  441. resultPage := keyvault.NewSecretListResultPage(list, getNextPage)
  442. smtc.listOutput = keyvault.NewSecretListResultIterator(resultPage)
  443. smtc.expectedSecret = secretString
  444. smtc.secretOutput = keyvault.SecretBundle{
  445. Value: &secretString,
  446. }
  447. smtc.refFind.Tags = map[string]string{"environment": environment, "author": author}
  448. smtc.expectedData[secretName] = []byte(secretString)
  449. }
  450. successCases := []*secretManagerTestCase{
  451. makeValidSecretManagerTestCaseCustom(setOneSecretByName),
  452. makeValidSecretManagerTestCaseCustom(setTwoSecretsByName),
  453. makeValidSecretManagerTestCaseCustom(setOneSecretByTag),
  454. makeValidSecretManagerTestCaseCustom(setTwoSecretsByTag),
  455. }
  456. sm := Azure{
  457. provider: &esv1beta1.AzureKVProvider{VaultURL: pointer.StringPtr(fakeURL)},
  458. }
  459. for k, v := range successCases {
  460. sm.baseClient = v.mockClient
  461. out, err := sm.GetAllSecrets(context.Background(), *v.refFind)
  462. if !utils.ErrorContains(err, v.expectError) {
  463. t.Errorf(unexpectedError, k, err.Error(), v.expectError)
  464. }
  465. if err == nil && !reflect.DeepEqual(out, v.expectedData) {
  466. t.Errorf(unexpectedSecretData, k, v.expectedData, out)
  467. }
  468. }
  469. }
  470. func makeValidRef() *esv1beta1.ExternalSecretDataRemoteRef {
  471. return &esv1beta1.ExternalSecretDataRemoteRef{
  472. Key: "test-secret",
  473. Version: "default",
  474. Property: "",
  475. }
  476. }
  477. func makeValidFind() *esv1beta1.ExternalSecretFind {
  478. return &esv1beta1.ExternalSecretFind{
  479. Name: &esv1beta1.FindName{
  480. RegExp: "^example",
  481. },
  482. Tags: map[string]string{},
  483. }
  484. }