|
@@ -19,129 +19,14 @@ import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
|
|
|
|
|
v1 "k8s.io/api/core/v1"
|
|
v1 "k8s.io/api/core/v1"
|
|
|
- "k8s.io/apimachinery/pkg/types"
|
|
|
|
|
- "sigs.k8s.io/controller-runtime/pkg/client"
|
|
|
|
|
|
|
|
|
|
esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
|
|
esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
|
|
|
- // Loading registered providers.
|
|
|
|
|
- _ "github.com/external-secrets/external-secrets/pkg/provider/register"
|
|
|
|
|
|
|
+ "github.com/external-secrets/external-secrets/pkg/controllers/templating"
|
|
|
|
|
+ _ "github.com/external-secrets/external-secrets/pkg/provider/register" // Loading registered providers.
|
|
|
"github.com/external-secrets/external-secrets/pkg/template"
|
|
"github.com/external-secrets/external-secrets/pkg/template"
|
|
|
"github.com/external-secrets/external-secrets/pkg/utils"
|
|
"github.com/external-secrets/external-secrets/pkg/utils"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-type Parser struct {
|
|
|
|
|
- exec template.ExecFunc
|
|
|
|
|
- dataMap map[string][]byte
|
|
|
|
|
- client client.Client
|
|
|
|
|
- targetSecret *v1.Secret
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (p *Parser) MergeConfigMap(ctx context.Context, namespace string, tpl esv1beta1.TemplateFrom) error {
|
|
|
|
|
- if tpl.ConfigMap == nil {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- var cm v1.ConfigMap
|
|
|
|
|
- err := p.client.Get(ctx, types.NamespacedName{
|
|
|
|
|
- Name: tpl.ConfigMap.Name,
|
|
|
|
|
- Namespace: namespace,
|
|
|
|
|
- }, &cm)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- for _, k := range tpl.ConfigMap.Items {
|
|
|
|
|
- val, ok := cm.Data[k.Key]
|
|
|
|
|
- out := make(map[string][]byte)
|
|
|
|
|
- if !ok {
|
|
|
|
|
- return fmt.Errorf(errTplCMMissingKey, tpl.ConfigMap.Name, k.Key)
|
|
|
|
|
- }
|
|
|
|
|
- switch k.TemplateAs {
|
|
|
|
|
- case esv1beta1.TemplateScopeValues:
|
|
|
|
|
- out[k.Key] = []byte(val)
|
|
|
|
|
- case esv1beta1.TemplateScopeKeysAndValues:
|
|
|
|
|
- out[val] = []byte(val)
|
|
|
|
|
- }
|
|
|
|
|
- err = p.exec(out, p.dataMap, k.TemplateAs, tpl.Target, p.targetSecret)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return nil
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (p *Parser) MergeSecret(ctx context.Context, namespace string, tpl esv1beta1.TemplateFrom) error {
|
|
|
|
|
- if tpl.Secret == nil {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- var sec v1.Secret
|
|
|
|
|
- err := p.client.Get(ctx, types.NamespacedName{
|
|
|
|
|
- Name: tpl.Secret.Name,
|
|
|
|
|
- Namespace: namespace,
|
|
|
|
|
- }, &sec)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- for _, k := range tpl.Secret.Items {
|
|
|
|
|
- val, ok := sec.Data[k.Key]
|
|
|
|
|
- if !ok {
|
|
|
|
|
- return fmt.Errorf(errTplSecMissingKey, tpl.Secret.Name, k.Key)
|
|
|
|
|
- }
|
|
|
|
|
- out := make(map[string][]byte)
|
|
|
|
|
- switch k.TemplateAs {
|
|
|
|
|
- case esv1beta1.TemplateScopeValues:
|
|
|
|
|
- out[k.Key] = val
|
|
|
|
|
- case esv1beta1.TemplateScopeKeysAndValues:
|
|
|
|
|
- out[string(val)] = val
|
|
|
|
|
- }
|
|
|
|
|
- err = p.exec(out, p.dataMap, k.TemplateAs, tpl.Target, p.targetSecret)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return nil
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (p *Parser) MergeLiteral(_ context.Context, tpl esv1beta1.TemplateFrom) error {
|
|
|
|
|
- if tpl.Literal == nil {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- out := make(map[string][]byte)
|
|
|
|
|
- out[*tpl.Literal] = []byte(*tpl.Literal)
|
|
|
|
|
- return p.exec(out, p.dataMap, esv1beta1.TemplateScopeKeysAndValues, tpl.Target, p.targetSecret)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (p *Parser) MergeTemplateFrom(ctx context.Context, es *esv1beta1.ExternalSecret) error {
|
|
|
|
|
- if es.Spec.Target.Template == nil {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- for _, tpl := range es.Spec.Target.Template.TemplateFrom {
|
|
|
|
|
- err := p.MergeConfigMap(ctx, es.Namespace, tpl)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- err = p.MergeSecret(ctx, es.Namespace, tpl)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- err = p.MergeLiteral(ctx, tpl)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- return nil
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func (p *Parser) MergeMap(tplMap map[string]string, target esv1beta1.TemplateTarget) error {
|
|
|
|
|
- byteMap := make(map[string][]byte)
|
|
|
|
|
- for k, v := range tplMap {
|
|
|
|
|
- byteMap[k] = []byte(v)
|
|
|
|
|
- }
|
|
|
|
|
- err := p.exec(byteMap, p.dataMap, esv1beta1.TemplateScopeValues, target, p.targetSecret)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return fmt.Errorf(errExecTpl, err)
|
|
|
|
|
- }
|
|
|
|
|
- return nil
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
// merge template in the following order:
|
|
// merge template in the following order:
|
|
|
// * template.Data (highest precedence)
|
|
// * template.Data (highest precedence)
|
|
|
// * template.templateFrom
|
|
// * template.templateFrom
|
|
@@ -167,14 +52,14 @@ func (r *Reconciler) applyTemplate(ctx context.Context, es *esv1beta1.ExternalSe
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- p := Parser{
|
|
|
|
|
- client: r.Client,
|
|
|
|
|
- targetSecret: secret,
|
|
|
|
|
- dataMap: dataMap,
|
|
|
|
|
- exec: execute,
|
|
|
|
|
|
|
+ p := templating.Parser{
|
|
|
|
|
+ Client: r.Client,
|
|
|
|
|
+ TargetSecret: secret,
|
|
|
|
|
+ DataMap: dataMap,
|
|
|
|
|
+ Exec: execute,
|
|
|
}
|
|
}
|
|
|
// apply templates defined in template.templateFrom
|
|
// apply templates defined in template.templateFrom
|
|
|
- err = p.MergeTemplateFrom(ctx, es)
|
|
|
|
|
|
|
+ err = p.MergeTemplateFrom(ctx, es.Namespace, es.Spec.Target.Template)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return fmt.Errorf(errFetchTplFrom, err)
|
|
return fmt.Errorf(errFetchTplFrom, err)
|
|
|
}
|
|
}
|
|
@@ -212,7 +97,7 @@ func setMetadata(secret *v1.Secret, es *esv1beta1.ExternalSecret) error {
|
|
|
}
|
|
}
|
|
|
// Clean up Labels and Annotations added by the operator
|
|
// Clean up Labels and Annotations added by the operator
|
|
|
// so that it won't leave outdated ones
|
|
// so that it won't leave outdated ones
|
|
|
- labelKeys, err := getManagedLabelKeys(secret, es.Name)
|
|
|
|
|
|
|
+ labelKeys, err := templating.GetManagedLabelKeys(secret, es.Name)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
@@ -220,7 +105,7 @@ func setMetadata(secret *v1.Secret, es *esv1beta1.ExternalSecret) error {
|
|
|
delete(secret.ObjectMeta.Labels, key)
|
|
delete(secret.ObjectMeta.Labels, key)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- annotationKeys, err := getManagedAnnotationKeys(secret, es.Name)
|
|
|
|
|
|
|
+ annotationKeys, err := templating.GetManagedAnnotationKeys(secret, es.Name)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
@@ -239,55 +124,3 @@ func setMetadata(secret *v1.Secret, es *esv1beta1.ExternalSecret) error {
|
|
|
utils.MergeStringMap(secret.ObjectMeta.Annotations, es.Spec.Target.Template.Metadata.Annotations)
|
|
utils.MergeStringMap(secret.ObjectMeta.Annotations, es.Spec.Target.Template.Metadata.Annotations)
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-func getManagedAnnotationKeys(secret *v1.Secret, fieldOwner string) ([]string, error) {
|
|
|
|
|
- return getManagedFieldKeys(secret, fieldOwner, func(fields map[string]interface{}) []string {
|
|
|
|
|
- metadataFields, exists := fields["f:metadata"]
|
|
|
|
|
- if !exists {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- mf, ok := metadataFields.(map[string]interface{})
|
|
|
|
|
- if !ok {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- annotationFields, exists := mf["f:annotations"]
|
|
|
|
|
- if !exists {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- af, ok := annotationFields.(map[string]interface{})
|
|
|
|
|
- if !ok {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- var keys []string
|
|
|
|
|
- for k := range af {
|
|
|
|
|
- keys = append(keys, k)
|
|
|
|
|
- }
|
|
|
|
|
- return keys
|
|
|
|
|
- })
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func getManagedLabelKeys(secret *v1.Secret, fieldOwner string) ([]string, error) {
|
|
|
|
|
- return getManagedFieldKeys(secret, fieldOwner, func(fields map[string]interface{}) []string {
|
|
|
|
|
- metadataFields, exists := fields["f:metadata"]
|
|
|
|
|
- if !exists {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- mf, ok := metadataFields.(map[string]interface{})
|
|
|
|
|
- if !ok {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- labelFields, exists := mf["f:labels"]
|
|
|
|
|
- if !exists {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- lf, ok := labelFields.(map[string]interface{})
|
|
|
|
|
- if !ok {
|
|
|
|
|
- return nil
|
|
|
|
|
- }
|
|
|
|
|
- var keys []string
|
|
|
|
|
- for k := range lf {
|
|
|
|
|
- keys = append(keys, k)
|
|
|
|
|
- }
|
|
|
|
|
- return keys
|
|
|
|
|
- })
|
|
|
|
|
-}
|
|
|