Skip to content
This repository was archived by the owner on Aug 4, 2025. It is now read-only.

Commit 6ca30a7

Browse files
authored
Implement oracle validator (external-secrets#1592)
* Implement oracle validator Signed-off-by: Martin Schimandl <[email protected]> * Add more granular OCI error handling Signed-off-by: Martin Schimandl <[email protected]> * Remove two newlines the linter does not like Signed-off-by: Martin Schimandl <[email protected]> Signed-off-by: Martin Schimandl <[email protected]>
1 parent 724bd18 commit 6ca30a7

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed

pkg/provider/oracle/oracle.go

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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{}
5960
var _ esv1beta1.Provider = &VaultManagementService{}
6061

6162
type VaultManagementService struct {
62-
Client VMInterface
63-
vault string
63+
Client VMInterface
64+
KmsVaultClient KmsVCInterface
65+
vault string
6466
}
6567

6668
type 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.
7177
func (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

228242
func (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

Comments
 (0)