keyvault_test.go 19 KB

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