pushsecret_controller_template.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package pushsecret
  13. import (
  14. "context"
  15. "fmt"
  16. v1 "k8s.io/api/core/v1"
  17. "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
  18. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  19. "github.com/external-secrets/external-secrets/pkg/controllers/templating"
  20. "github.com/external-secrets/external-secrets/pkg/template"
  21. "github.com/external-secrets/external-secrets/pkg/utils"
  22. _ "github.com/external-secrets/external-secrets/pkg/provider/register" // Loading registered providers.
  23. )
  24. const (
  25. errFetchTplFrom = "error fetching templateFrom data: %w"
  26. errExecTpl = "could not execute template: %w"
  27. )
  28. // applyTemplate merges template in the following order:
  29. // * template.Data (highest precedence)
  30. // * template.templateFrom
  31. // * secret via ps.data or ps.dataFrom.
  32. // Apply template modifications for the source secret. These modifications will only live in memory as we will
  33. // never modify it.
  34. func (r *Reconciler) applyTemplate(ctx context.Context, ps *v1alpha1.PushSecret, secret *v1.Secret) error {
  35. // no template: nothing to do
  36. if ps.Spec.Template == nil {
  37. return nil
  38. }
  39. if err := setMetadata(secret, ps); err != nil {
  40. return err
  41. }
  42. execute, err := template.EngineForVersion(esv1beta1.TemplateEngineV2)
  43. if err != nil {
  44. return err
  45. }
  46. p := templating.Parser{
  47. Client: r.Client,
  48. TargetSecret: secret,
  49. DataMap: secret.Data,
  50. Exec: execute,
  51. }
  52. // apply templates defined in template.templateFrom
  53. err = p.MergeTemplateFrom(ctx, ps.Namespace, ps.Spec.Template)
  54. if err != nil {
  55. return fmt.Errorf(errFetchTplFrom, err)
  56. }
  57. // explicitly defined template.Data takes precedence over templateFrom
  58. err = p.MergeMap(ps.Spec.Template.Data, esv1beta1.TemplateTargetData)
  59. if err != nil {
  60. return fmt.Errorf(errExecTpl, err)
  61. }
  62. // get template data for labels
  63. err = p.MergeMap(ps.Spec.Template.Metadata.Labels, esv1beta1.TemplateTargetLabels)
  64. if err != nil {
  65. return fmt.Errorf(errExecTpl, err)
  66. }
  67. // get template data for annotations
  68. err = p.MergeMap(ps.Spec.Template.Metadata.Annotations, esv1beta1.TemplateTargetAnnotations)
  69. if err != nil {
  70. return fmt.Errorf(errExecTpl, err)
  71. }
  72. return nil
  73. }
  74. // setMetadata sets Labels and Annotations in the source secret, but we will never write them back.
  75. // It is only set to satisfy templated changes.
  76. func setMetadata(secret *v1.Secret, ps *v1alpha1.PushSecret) error {
  77. if secret.Labels == nil {
  78. secret.Labels = make(map[string]string)
  79. }
  80. if secret.Annotations == nil {
  81. secret.Annotations = make(map[string]string)
  82. }
  83. secret.Type = ps.Spec.Template.Type
  84. utils.MergeStringMap(secret.ObjectMeta.Labels, ps.Spec.Template.Metadata.Labels)
  85. utils.MergeStringMap(secret.ObjectMeta.Annotations, ps.Spec.Template.Metadata.Annotations)
  86. return nil
  87. }