Browse Source

fix: unmarshal JSON error when empty secrets in Vault (#1512)

Signed-off-by: Sebastián Gómez <sebastiangomezcorrea@gmail.com>
Sebastián Gómez 3 years ago
parent
commit
cef547e473
2 changed files with 22 additions and 3 deletions
  1. 13 2
      pkg/provider/vault/vault.go
  2. 9 1
      pkg/provider/vault/vault_test.go

+ 13 - 2
pkg/provider/vault/vault.go

@@ -397,7 +397,9 @@ func (v *client) findSecretsFromTags(ctx context.Context, candidates []string, t
 			if err != nil {
 				return nil, err
 			}
-			secrets[name] = secret
+			if secret != nil {
+				secrets[name] = secret
+			}
 		}
 	}
 	return secrets, nil
@@ -416,7 +418,9 @@ func (v *client) findSecretsFromName(ctx context.Context, candidates []string, r
 			if err != nil {
 				return nil, err
 			}
-			secrets[name] = secret
+			if secret != nil {
+				secrets[name] = secret
+			}
 		}
 	}
 	return secrets, nil
@@ -497,6 +501,10 @@ func (v *client) GetSecret(ctx context.Context, ref esv1beta1.ExternalSecretData
 	if err != nil {
 		return nil, err
 	}
+	// Return nil if secret value is null
+	if data == nil {
+		return nil, nil
+	}
 	jsonStr, err := json.Marshal(data)
 	if err != nil {
 		return nil, err
@@ -697,6 +705,9 @@ func (v *client) readSecret(ctx context.Context, path, version string) (map[stri
 		if !ok {
 			return nil, errors.New(errDataField)
 		}
+		if dataInt == nil {
+			return nil, nil
+		}
 		secretData, ok = dataInt.(map[string]interface{})
 		if !ok {
 			return nil, errors.New(errJSONUnmarshall)

+ 9 - 1
pkg/provider/vault/vault_test.go

@@ -959,6 +959,14 @@ func TestGetAllSecrets(t *testing.T) {
 				"access_secret": "access_secret2",
 			},
 		},
+		"secret3": map[string]interface{}{
+			"metadata": map[string]interface{}{
+				"custom_metadata": map[string]interface{}{
+					"foo": "baz",
+				},
+			},
+			"data": nil,
+		},
 		"tag": map[string]interface{}{
 			"metadata": map[string]interface{}{
 				"custom_metadata": map[string]interface{}{
@@ -997,7 +1005,7 @@ func TestGetAllSecrets(t *testing.T) {
 				"empty": "true",
 			},
 			"metadata": map[string]interface{}{
-				"keys": []interface{}{"secret1", "secret2", "tag", "path/"},
+				"keys": []interface{}{"secret1", "secret2", "secret3", "tag", "path/"},
 			},
 		},
 		"path/": map[string]interface{}{