Просмотр исходного кода

Making Fake provider have in-memory store.

Signed-off-by: Gustavo Carvalho <gustavo.carvalho@container-solutions.com>
Co-authored-by: William Young <will.young@engineerbetter.com>
Co-authored-by: Dominic Meddick <dom.meddick@engineerbetter.com>
Gustavo Carvalho 4 лет назад
Родитель
Сommit
e53d9661a0
1 измененных файлов с 53 добавлено и 31 удалено
  1. 53 31
      pkg/provider/fake/fake.go

+ 53 - 31
pkg/provider/fake/fake.go

@@ -30,9 +30,23 @@ var (
 	errMissingValueField   = "at least one of value or valueMap must be set in data %v"
 )
 
+type SourceOrigin string
+
+const (
+	FakeSecretStore SourceOrigin = "SecretStore"
+	FakeSetSecret   SourceOrigin = "SetSecret"
+)
+
+type Data struct {
+	Value    string
+	Version  string
+	ValueMap map[string]string
+	Origin   SourceOrigin
+}
+type Config map[string]*Data
 type Provider struct {
-	config   *esv1beta1.FakeProvider
-	database map[string]*esv1beta1.FakeProvider
+	config   Config
+	database map[string]Config
 }
 
 // Capabilities return the provider supported capabilities (ReadOnly, WriteOnly, ReadWrite).
@@ -42,21 +56,29 @@ func (p *Provider) Capabilities() esv1beta1.SecretStoreCapabilities {
 
 func (p *Provider) NewClient(ctx context.Context, store esv1beta1.GenericStore, kube client.Client, namespace string) (esv1beta1.SecretsClient, error) {
 	if p.database == nil {
-		p.database = make(map[string]*esv1beta1.FakeProvider)
+		p.database = make(map[string]Config)
 	}
-	cfg, err := getProvider(store)
+	c, err := getProvider(store)
 	if err != nil {
 		return nil, err
 	}
-	prov, ok := p.database[store.GetName()]
-	if !ok {
-		p.database[store.GetName()] = cfg
-		return &Provider{
-			config: cfg,
-		}, nil
+	cfg := p.database[store.GetName()]
+	if cfg == nil {
+		cfg = Config{}
+	}
+	for _, data := range c.Data {
+		mapKey := fmt.Sprintf("%v%v", data.Key, data.Version)
+		cfg[mapKey] = &Data{
+			Value:   data.Value,
+			Version: data.Version,
+			Origin:  FakeSecretStore,
+		}
+		if data.ValueMap != nil {
+			cfg[mapKey].ValueMap = data.ValueMap
+		}
 	}
 	return &Provider{
-		config: prov,
+		config: cfg,
 	}, nil
 }
 
@@ -73,17 +95,18 @@ func getProvider(store esv1beta1.GenericStore) (*esv1beta1.FakeProvider, error)
 
 // Not Implemented SetSecret.
 func (p *Provider) SetSecret(key, value string) error {
-	newData := esv1beta1.FakeProviderData{
-		Key:   key,
-		Value: value,
-	}
-	for i, data := range p.config.Data {
-		if data.Key == key {
-			p.config.Data[i] = newData
-			return nil
+	currentData, ok := p.config[key]
+	if !ok {
+		p.config[key] = &Data{
+			Value:  value,
+			Origin: FakeSetSecret,
 		}
+		return nil
 	}
-	p.config.Data = append(p.config.Data, newData)
+	if currentData.Origin != FakeSetSecret {
+		return fmt.Errorf("key already exists")
+	}
+	currentData.Value = value
 	return nil
 }
 
@@ -95,23 +118,22 @@ func (p *Provider) GetAllSecrets(ctx context.Context, ref esv1beta1.ExternalSecr
 
 // GetSecret returns a single secret from the provider.
 func (p *Provider) GetSecret(ctx context.Context, ref esv1beta1.ExternalSecretDataRemoteRef) ([]byte, error) {
-	for _, data := range p.config.Data {
-		if data.Key == ref.Key && data.Version == ref.Version {
-			return []byte(data.Value), nil
-		}
+	mapKey := fmt.Sprintf("%v%v", ref.Key, ref.Version)
+	data, ok := p.config[mapKey]
+	if !ok || data.Version != ref.Version {
+		return nil, esv1beta1.NoSecretErr
 	}
-	return nil, esv1beta1.NoSecretErr
+	return []byte(data.Value), nil
 }
 
 // GetSecretMap returns multiple k/v pairs from the provider.
 func (p *Provider) GetSecretMap(ctx context.Context, ref esv1beta1.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
+	mapKey := fmt.Sprintf("%v%v", ref.Key, ref.Version)
+	data, ok := p.config[mapKey]
+	if !ok || data.Version != ref.Version || data.ValueMap == nil {
+		return nil, esv1beta1.NoSecretErr
 	}
-	return nil, esv1beta1.NoSecretErr
+	return convertMap(data.ValueMap), nil
 }
 
 func convertMap(in map[string]string) map[string][]byte {