|
|
@@ -77,43 +77,89 @@ func New(sess *session.Session, cfg *aws.Config, referentAuth bool) (*SecretsMan
|
|
|
}, nil
|
|
|
}
|
|
|
|
|
|
-func (sm *SecretsManager) fetch(_ context.Context, ref esv1beta1.ExternalSecretDataRemoteRef) (*awssm.GetSecretValueOutput, error) {
|
|
|
+func (sm *SecretsManager) fetch(ctx context.Context, ref esv1beta1.ExternalSecretDataRemoteRef) (*awssm.GetSecretValueOutput, error) {
|
|
|
ver := "AWSCURRENT"
|
|
|
+ valueFrom := "SECRET"
|
|
|
if ref.Version != "" {
|
|
|
ver = ref.Version
|
|
|
}
|
|
|
- log.Info("fetching secret value", "key", ref.Key, "version", ver)
|
|
|
+ if ref.MetadataPolicy == esv1beta1.ExternalSecretMetadataPolicyFetch {
|
|
|
+ valueFrom = "TAG"
|
|
|
+ }
|
|
|
+
|
|
|
+ log.Info("fetching secret value", "key", ref.Key, "version", ver, "value", valueFrom)
|
|
|
|
|
|
- cacheKey := fmt.Sprintf("%s#%s", ref.Key, ver)
|
|
|
+ cacheKey := fmt.Sprintf("%s#%s#%s", ref.Key, ver, valueFrom)
|
|
|
if secretOut, found := sm.cache[cacheKey]; found {
|
|
|
log.Info("found secret in cache", "key", ref.Key, "version", ver)
|
|
|
return secretOut, nil
|
|
|
}
|
|
|
|
|
|
- var getSecretValueInput *awssm.GetSecretValueInput
|
|
|
- if strings.HasPrefix(ver, "uuid/") {
|
|
|
- versionID := strings.TrimPrefix(ver, "uuid/")
|
|
|
- getSecretValueInput = &awssm.GetSecretValueInput{
|
|
|
- SecretId: &ref.Key,
|
|
|
- VersionId: &versionID,
|
|
|
+ var secretOut *awssm.GetSecretValueOutput
|
|
|
+ var err error
|
|
|
+
|
|
|
+ if ref.MetadataPolicy == esv1beta1.ExternalSecretMetadataPolicyFetch {
|
|
|
+ describeSecretInput := &awssm.DescribeSecretInput{
|
|
|
+ SecretId: &ref.Key,
|
|
|
+ }
|
|
|
+
|
|
|
+ descOutput, err := sm.client.DescribeSecretWithContext(ctx, describeSecretInput)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ log.Info("found metadata secret", "key", ref.Key, "output", descOutput)
|
|
|
+
|
|
|
+ jsonTags, err := TagsToJSONString(descOutput.Tags)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ secretOut = &awssm.GetSecretValueOutput{
|
|
|
+ ARN: descOutput.ARN,
|
|
|
+ CreatedDate: descOutput.CreatedDate,
|
|
|
+ Name: descOutput.Name,
|
|
|
+ SecretString: &jsonTags,
|
|
|
+ VersionId: &ver,
|
|
|
}
|
|
|
} else {
|
|
|
- getSecretValueInput = &awssm.GetSecretValueInput{
|
|
|
- SecretId: &ref.Key,
|
|
|
- VersionStage: &ver,
|
|
|
+ var getSecretValueInput *awssm.GetSecretValueInput
|
|
|
+ if strings.HasPrefix(ver, "uuid/") {
|
|
|
+ versionID := strings.TrimPrefix(ver, "uuid/")
|
|
|
+ getSecretValueInput = &awssm.GetSecretValueInput{
|
|
|
+ SecretId: &ref.Key,
|
|
|
+ VersionId: &versionID,
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ getSecretValueInput = &awssm.GetSecretValueInput{
|
|
|
+ SecretId: &ref.Key,
|
|
|
+ VersionStage: &ver,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ secretOut, err = sm.client.GetSecretValue(getSecretValueInput)
|
|
|
+ var nf *awssm.ResourceNotFoundException
|
|
|
+ if errors.As(err, &nf) {
|
|
|
+ return nil, esv1beta1.NoSecretErr
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
}
|
|
|
}
|
|
|
- secretOut, err := sm.client.GetSecretValue(getSecretValueInput)
|
|
|
- var nf *awssm.ResourceNotFoundException
|
|
|
- if errors.As(err, &nf) {
|
|
|
- return nil, esv1beta1.NoSecretErr
|
|
|
+ sm.cache[cacheKey] = secretOut
|
|
|
+
|
|
|
+ return secretOut, nil
|
|
|
+}
|
|
|
+
|
|
|
+func TagsToJSONString(tags []*awssm.Tag) (string, error) {
|
|
|
+ tagMap := make(map[string]string, len(tags))
|
|
|
+ for _, tag := range tags {
|
|
|
+ tagMap[*tag.Key] = *tag.Value
|
|
|
}
|
|
|
+
|
|
|
+ byteArr, err := json.Marshal(tagMap)
|
|
|
if err != nil {
|
|
|
- return nil, err
|
|
|
+ return "", err
|
|
|
}
|
|
|
- sm.cache[cacheKey] = secretOut
|
|
|
|
|
|
- return secretOut, nil
|
|
|
+ return string(byteArr), nil
|
|
|
}
|
|
|
|
|
|
func (sm *SecretsManager) DeleteSecret(ctx context.Context, remoteRef esv1beta1.PushRemoteRef) error {
|