@@ -21,6 +21,7 @@ import (
2121
2222 "github.com/oracle/oci-go-sdk/v56/common"
2323 "github.com/oracle/oci-go-sdk/v56/common/auth"
24+ "github.com/oracle/oci-go-sdk/v56/keymanagement"
2425 "github.com/oracle/oci-go-sdk/v56/secrets"
2526 "github.com/tidwall/gjson"
2627 corev1 "k8s.io/api/core/v1"
@@ -59,14 +60,19 @@ var _ esv1beta1.SecretsClient = &VaultManagementService{}
5960var _ esv1beta1.Provider = & VaultManagementService {}
6061
6162type VaultManagementService struct {
62- Client VMInterface
63- vault string
63+ Client VMInterface
64+ KmsVaultClient KmsVCInterface
65+ vault string
6466}
6567
6668type VMInterface interface {
6769 GetSecretBundleByName (ctx context.Context , request secrets.GetSecretBundleByNameRequest ) (secrets.GetSecretBundleByNameResponse , error )
6870}
6971
72+ type KmsVCInterface interface {
73+ GetVault (ctx context.Context , request keymanagement.GetVaultRequest ) (response keymanagement.GetVaultResponse , err error )
74+ }
75+
7076// Empty GetAllSecrets.
7177func (vms * VaultManagementService ) GetAllSecrets (ctx context.Context , ref esv1beta1.ExternalSecretFind ) (map [string ][]byte , error ) {
7278 // TO be implemented
@@ -160,9 +166,17 @@ func (vms *VaultManagementService) NewClient(ctx context.Context, store esv1beta
160166
161167 secretManagementService .SetRegion (oracleSpec .Region )
162168
169+ kmsVaultClient , err := keymanagement .NewKmsVaultClientWithConfigurationProvider (configurationProvider )
170+ if err != nil {
171+ return nil , fmt .Errorf (errOracleClient , err )
172+ }
173+
174+ kmsVaultClient .SetRegion (oracleSpec .Region )
175+
163176 return & VaultManagementService {
164- Client : secretManagementService ,
165- vault : oracleSpec .Vault ,
177+ Client : secretManagementService ,
178+ KmsVaultClient : kmsVaultClient ,
179+ vault : oracleSpec .Vault ,
166180 }, nil
167181}
168182
@@ -226,6 +240,37 @@ func (vms *VaultManagementService) Close(ctx context.Context) error {
226240}
227241
228242func (vms * VaultManagementService ) Validate () (esv1beta1.ValidationResult , error ) {
243+ _ , err := vms .KmsVaultClient .GetVault (
244+ context .Background (), keymanagement.GetVaultRequest {
245+ VaultId : & vms .vault ,
246+ },
247+ )
248+ if err != nil {
249+ failure , ok := common .IsServiceError (err )
250+ if ok {
251+ code := failure .GetCode ()
252+ switch code {
253+ case "NotAuthenticated" :
254+ return esv1beta1 .ValidationResultError , err
255+ case "NotAuthorizedOrNotFound" :
256+ // User authentication was successful, but user might not have a permission like:
257+ //
258+ // Allow group external_secrets to read vaults in tenancy
259+ //
260+ // Which is fine, because to read secrets we only need:
261+ //
262+ // Allow group external_secrets to read secret-family in tenancy
263+ //
264+ // But we can't test for this permission without knowing the name of a secret
265+ return esv1beta1 .ValidationResultUnknown , err
266+ default :
267+ return esv1beta1 .ValidationResultError , err
268+ }
269+ } else {
270+ return esv1beta1 .ValidationResultError , err
271+ }
272+ }
273+
229274 return esv1beta1 .ValidationResultReady , nil
230275}
231276
0 commit comments