From 79fbe7c4ccfcac1002a6c897594459144ceaf99c Mon Sep 17 00:00:00 2001 From: Richard Marshall Date: Thu, 22 Aug 2019 08:06:58 -0700 Subject: [PATCH] Support resource generator options in exec plugins --- pkg/plugins/execplugin.go | 39 ++++++++++++++++++++++++++++++++++++++- pkg/resource/resource.go | 5 +++++ pkg/target/kusttarget.go | 20 ++++++-------------- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/pkg/plugins/execplugin.go b/pkg/plugins/execplugin.go index 3af9211cc..061ee8693 100644 --- a/pkg/plugins/execplugin.go +++ b/pkg/plugins/execplugin.go @@ -9,17 +9,21 @@ import ( "io/ioutil" "os" "os/exec" + "strconv" "strings" "github.com/pkg/errors" "sigs.k8s.io/kustomize/v3/pkg/ifc" "sigs.k8s.io/kustomize/v3/pkg/resid" "sigs.k8s.io/kustomize/v3/pkg/resmap" + "sigs.k8s.io/kustomize/v3/pkg/types" "sigs.k8s.io/yaml" ) const ( idAnnotation = "kustomize.config.k8s.io/id" + hashAnnotation = "kustomize.config.k8s.io/needs-hash" + behaviorAnnotation = "kustomize.config.k8s.io/behavior" tmpConfigFilePrefix = "kust-plugin-config-" ) @@ -96,7 +100,11 @@ func (p *ExecPlugin) Generate() (resmap.ResMap, error) { if err != nil { return nil, err } - return p.rf.NewResMapFromBytes(output) + rm, err := p.rf.NewResMapFromBytes(output) + if err != nil { + return nil, err + } + return p.updateResourceOptions(rm) } func (p *ExecPlugin) Transform(rm resmap.ResMap) error { @@ -223,3 +231,32 @@ func (p *ExecPlugin) updateResMapValues(output []byte, rm resmap.ResMap) error { } return nil } + +// updateResourceOptions updates the generator options for each resource in the +// given ResMap based on plugin provided annotations. +func (p *ExecPlugin) updateResourceOptions(rm resmap.ResMap) (resmap.ResMap, error) { + for _, r := range rm.Resources() { + // Disable name hashing by default and require plugin to explicitly + // request it for each resource. + annotations := r.GetAnnotations() + behavior := annotations[behaviorAnnotation] + var needsHash bool + if val, ok := annotations[hashAnnotation]; ok { + b, err := strconv.ParseBool(val) + if err != nil { + return nil, fmt.Errorf("the annotation %q contains an invalid value (%q)", hashAnnotation, val) + } + needsHash = b + } + delete(annotations, hashAnnotation) + delete(annotations, behaviorAnnotation) + if len(annotations) == 0 { + annotations = nil + } + r.SetAnnotations(annotations) + r.SetOptions(types.NewGenArgs( + &types.GeneratorArgs{Behavior: behavior}, + &types.GeneratorOptions{DisableNameSuffixHash: !needsHash})) + } + return rm, nil +} diff --git a/pkg/resource/resource.go b/pkg/resource/resource.go index fa2c87cfe..01dd4649e 100644 --- a/pkg/resource/resource.go +++ b/pkg/resource/resource.go @@ -242,6 +242,11 @@ func (r *Resource) AsYAML() ([]byte, error) { return yaml.JSONToYAML(json) } +// SetOptions updates the generator options for the resource. +func (r *Resource) SetOptions(o *types.GenArgs) { + r.options = o +} + // Behavior returns the behavior for the resource. func (r *Resource) Behavior() types.GenerationBehavior { return r.options.Behavior() diff --git a/pkg/target/kusttarget.go b/pkg/target/kusttarget.go index 3abb12972..2bbfe2b32 100644 --- a/pkg/target/kusttarget.go +++ b/pkg/target/kusttarget.go @@ -250,31 +250,23 @@ func (kt *KustTarget) AccumulateTarget() ( func (kt *KustTarget) runGenerators( ra *accumulator.ResAccumulator) error { - generators, err := kt.configureBuiltinGenerators() + var generators []resmap.Generator + gs, err := kt.configureBuiltinGenerators() if err != nil { return err } - for _, g := range generators { - resMap, err := g.Generate() - if err != nil { - return err - } - // The legacy generators allow override. - err = ra.AbsorbAll(resMap) - if err != nil { - return errors.Wrapf(err, "merging from generator %v", g) - } - } - generators, err = kt.configureExternalGenerators() + generators = append(generators, gs...) + gs, err = kt.configureExternalGenerators() if err != nil { return errors.Wrap(err, "loading generator plugins") } + generators = append(generators, gs...) for _, g := range generators { resMap, err := g.Generate() if err != nil { return err } - err = ra.AppendAll(resMap) + err = ra.AbsorbAll(resMap) if err != nil { return errors.Wrapf(err, "merging from generator %v", g) }