|
|
@@ -16,6 +16,7 @@ package fake
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "fmt"
|
|
|
|
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
|
|
|
|
@@ -24,80 +25,72 @@ import (
|
|
|
"github.com/external-secrets/external-secrets/pkg/provider/schema"
|
|
|
)
|
|
|
|
|
|
-var _ provider.Provider = &Client{}
|
|
|
+var (
|
|
|
+ errNotFound = fmt.Errorf("secret value not found")
|
|
|
+ errMissingStore = fmt.Errorf("missing store provider")
|
|
|
+ errMissingFakeProvider = fmt.Errorf("missing store provider fake")
|
|
|
+)
|
|
|
|
|
|
-// Client is a fake client for testing.
|
|
|
-type Client struct {
|
|
|
- NewFn func(context.Context, esv1alpha1.GenericStore, client.Client,
|
|
|
- string) (provider.SecretsClient, error)
|
|
|
- GetSecretFn func(context.Context, esv1alpha1.ExternalSecretDataRemoteRef) ([]byte, error)
|
|
|
- GetSecretMapFn func(context.Context, esv1alpha1.ExternalSecretDataRemoteRef) (map[string][]byte, error)
|
|
|
+type Provider struct {
|
|
|
+ config *esv1alpha1.FakeProvider
|
|
|
}
|
|
|
|
|
|
-// New returns a fake provider/client.
|
|
|
-func New() *Client {
|
|
|
- v := &Client{
|
|
|
- GetSecretFn: func(context.Context, esv1alpha1.ExternalSecretDataRemoteRef) ([]byte, error) {
|
|
|
- return nil, nil
|
|
|
- },
|
|
|
- GetSecretMapFn: func(context.Context, esv1alpha1.ExternalSecretDataRemoteRef) (map[string][]byte, error) {
|
|
|
- return nil, nil
|
|
|
- },
|
|
|
- }
|
|
|
-
|
|
|
- v.NewFn = func(context.Context, esv1alpha1.GenericStore, client.Client, string) (provider.SecretsClient, error) {
|
|
|
- return v, nil
|
|
|
+func (p *Provider) NewClient(ctx context.Context, store esv1alpha1.GenericStore, kube client.Client, namespace string) (provider.SecretsClient, error) {
|
|
|
+ cfg, err := getProvider(store)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
}
|
|
|
-
|
|
|
- return v
|
|
|
-}
|
|
|
-
|
|
|
-// RegisterAs registers the fake client in the schema.
|
|
|
-func (v *Client) RegisterAs(provider *esv1alpha1.SecretStoreProvider) {
|
|
|
- schema.ForceRegister(v, provider)
|
|
|
+ return &Provider{
|
|
|
+ config: cfg,
|
|
|
+ }, nil
|
|
|
}
|
|
|
|
|
|
-// GetSecret implements the provider.Provider interface.
|
|
|
-func (v *Client) GetSecret(ctx context.Context, ref esv1alpha1.ExternalSecretDataRemoteRef) ([]byte, error) {
|
|
|
- return v.GetSecretFn(ctx, ref)
|
|
|
+func getProvider(store esv1alpha1.GenericStore) (*esv1alpha1.FakeProvider, error) {
|
|
|
+ if store == nil {
|
|
|
+ return nil, errMissingStore
|
|
|
+ }
|
|
|
+ spc := store.GetSpec()
|
|
|
+ if spc == nil || spc.Provider == nil || spc.Provider.Fake == nil {
|
|
|
+ return nil, errMissingFakeProvider
|
|
|
+ }
|
|
|
+ return spc.Provider.Fake, nil
|
|
|
}
|
|
|
|
|
|
-// WithGetSecret wraps secret data returned by this provider.
|
|
|
-func (v *Client) WithGetSecret(secData []byte, err error) *Client {
|
|
|
- v.GetSecretFn = func(context.Context, esv1alpha1.ExternalSecretDataRemoteRef) ([]byte, error) {
|
|
|
- return secData, err
|
|
|
+// GetSecret returns a single secret from the provider.
|
|
|
+func (p *Provider) GetSecret(ctx context.Context, ref esv1alpha1.ExternalSecretDataRemoteRef) ([]byte, error) {
|
|
|
+ for _, data := range p.config.Data {
|
|
|
+ if data.Key == ref.Key && data.Version == ref.Version {
|
|
|
+ return []byte(data.Value), nil
|
|
|
+ }
|
|
|
}
|
|
|
- return v
|
|
|
+ return nil, errNotFound
|
|
|
}
|
|
|
|
|
|
-// GetSecretMap imeplements the provider.Provider interface.
|
|
|
-func (v *Client) GetSecretMap(ctx context.Context, ref esv1alpha1.ExternalSecretDataRemoteRef) (map[string][]byte, error) {
|
|
|
- return v.GetSecretMapFn(ctx, ref)
|
|
|
-}
|
|
|
-func (v *Client) Close(ctx context.Context) error {
|
|
|
- return nil
|
|
|
+// GetSecretMap returns multiple k/v pairs from the provider.
|
|
|
+func (p *Provider) GetSecretMap(ctx context.Context, ref esv1alpha1.ExternalSecretDataRemoteRef) (map[string][]byte, error) {
|
|
|
+ for _, data := range p.config.Data {
|
|
|
+ if data.Key != ref.Key || data.Version != ref.Version || data.ValueMap == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ return convertMap(data.ValueMap), nil
|
|
|
+ }
|
|
|
+ return nil, errNotFound
|
|
|
}
|
|
|
|
|
|
-// WithGetSecretMap wraps the secret data map returned by this fake provider.
|
|
|
-func (v *Client) WithGetSecretMap(secData map[string][]byte, err error) *Client {
|
|
|
- v.GetSecretMapFn = func(context.Context, esv1alpha1.ExternalSecretDataRemoteRef) (map[string][]byte, error) {
|
|
|
- return secData, err
|
|
|
+func convertMap(in map[string]string) map[string][]byte {
|
|
|
+ m := make(map[string][]byte)
|
|
|
+ for k, v := range in {
|
|
|
+ m[k] = []byte(v)
|
|
|
}
|
|
|
- return v
|
|
|
+ return m
|
|
|
}
|
|
|
|
|
|
-// WithNew wraps the fake provider factory function.
|
|
|
-func (v *Client) WithNew(f func(context.Context, esv1alpha1.GenericStore, client.Client,
|
|
|
- string) (provider.SecretsClient, error)) *Client {
|
|
|
- v.NewFn = f
|
|
|
- return v
|
|
|
+func (p *Provider) Close(ctx context.Context) error {
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
-// NewClient returns a new fake provider.
|
|
|
-func (v *Client) NewClient(ctx context.Context, store esv1alpha1.GenericStore, kube client.Client, namespace string) (provider.SecretsClient, error) {
|
|
|
- c, err := v.NewFn(ctx, store, kube, namespace)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- return c, nil
|
|
|
+func init() {
|
|
|
+ schema.Register(&Provider{}, &esv1alpha1.SecretStoreProvider{
|
|
|
+ Fake: &esv1alpha1.FakeProvider{},
|
|
|
+ })
|
|
|
}
|