Skip to content

Commit

Permalink
add origin annotation for resources generated by generators (#4341)
Browse files Browse the repository at this point in the history
* add origin annotation for resources generated by builtin and custom generators

* decouple origin data from generator data and account for inline generators
  • Loading branch information
natasha41575 committed Dec 23, 2021
1 parent 233f1a3 commit 964bb38
Show file tree
Hide file tree
Showing 8 changed files with 717 additions and 21 deletions.
10 changes: 7 additions & 3 deletions api/internal/plugins/loader/loader.go
Expand Up @@ -53,14 +53,18 @@ func (l *Loader) SetWorkDir(wd string) {
}

func (l *Loader) LoadGenerators(
ldr ifc.Loader, v ifc.Validator, rm resmap.ResMap) ([]resmap.Generator, error) {
var result []resmap.Generator
ldr ifc.Loader, v ifc.Validator, rm resmap.ResMap) (
result []*resmap.GeneratorWithProperties, err error) {
for _, res := range rm.Resources() {
g, err := l.LoadGenerator(ldr, v, res)
if err != nil {
return nil, err
}
result = append(result, g)
generatorOrigin, err := resource.OriginFromCustomPlugin(res)
if err != nil {
return nil, err
}
result = append(result, &resmap.GeneratorWithProperties{Generator: g, Origin: generatorOrigin})
}
return result, nil
}
Expand Down
48 changes: 35 additions & 13 deletions api/internal/target/kusttarget.go
Expand Up @@ -29,6 +29,7 @@ import (
// KustTarget encapsulates the entirety of a kustomization build.
type KustTarget struct {
kustomization *types.Kustomization
kustFileName string
ldr ifc.Loader
validator ifc.Validator
rFactory *resmap.Factory
Expand All @@ -53,7 +54,7 @@ func NewKustTarget(

// Load attempts to load the target's kustomization file.
func (kt *KustTarget) Load() error {
content, err := loadKustFile(kt.ldr)
content, kustFileName, err := loadKustFile(kt.ldr)
if err != nil {
return err
}
Expand All @@ -74,6 +75,7 @@ func (kt *KustTarget) Load() error {
strings.Join(errs, "\n"), kt.ldr.Root())
}
kt.kustomization = &k
kt.kustFileName = kustFileName
return nil
}

Expand All @@ -85,23 +87,25 @@ func (kt *KustTarget) Kustomization() types.Kustomization {
return result
}

func loadKustFile(ldr ifc.Loader) ([]byte, error) {
func loadKustFile(ldr ifc.Loader) ([]byte, string, error) {
var content []byte
match := 0
var kustFileName string
for _, kf := range konfig.RecognizedKustomizationFileNames() {
c, err := ldr.Load(kf)
if err == nil {
match += 1
content = c
kustFileName = kf
}
}
switch match {
case 0:
return nil, NewErrMissingKustomization(ldr.Root())
return nil, "", NewErrMissingKustomization(ldr.Root())
case 1:
return content, nil
return content, kustFileName, nil
default:
return nil, fmt.Errorf(
return nil, "", fmt.Errorf(
"Found multiple kustomization files under: %s\n", ldr.Root())
}
}
Expand Down Expand Up @@ -206,7 +210,7 @@ func (kt *KustTarget) accumulateTarget(ra *accumulator.ResAccumulator, origin *r
return nil, errors.Wrapf(
err, "merging CRDs %v", crdTc)
}
err = kt.runGenerators(ra)
err = kt.runGenerators(ra, origin)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -244,23 +248,31 @@ func (kt *KustTarget) IgnoreLocal(ra *accumulator.ResAccumulator) error {
}

func (kt *KustTarget) runGenerators(
ra *accumulator.ResAccumulator) error {
var generators []resmap.Generator
gs, err := kt.configureBuiltinGenerators()
ra *accumulator.ResAccumulator, origin *resource.Origin) error {
var generators []*resmap.GeneratorWithProperties
gs, err := kt.configureBuiltinGenerators(origin)
if err != nil {
return err
}
generators = append(generators, gs...)
gs, err = kt.configureExternalGenerators()

gs, err = kt.configureExternalGenerators(origin)
if err != nil {
return errors.Wrap(err, "loading generator plugins")
}
generators = append(generators, gs...)
for _, g := range generators {

for i, g := range generators {
resMap, err := g.Generate()
if err != nil {
return err
}
if resMap != nil {
err = resMap.AddOriginAnnotation(generators[i].Origin)
if err != nil {
return errors.Wrapf(err, "adding origin annotations for generator %v", g)
}
}
err = ra.AbsorbAll(resMap)
if err != nil {
return errors.Wrapf(err, "merging from generator %v", g)
Expand All @@ -269,7 +281,8 @@ func (kt *KustTarget) runGenerators(
return nil
}

func (kt *KustTarget) configureExternalGenerators() ([]resmap.Generator, error) {
func (kt *KustTarget) configureExternalGenerators(origin *resource.Origin) (
[]*resmap.GeneratorWithProperties, error) {
ra := accumulator.MakeEmptyAccumulator()
var generatorPaths []string
for _, p := range kt.kustomization.Generators {
Expand All @@ -279,10 +292,19 @@ func (kt *KustTarget) configureExternalGenerators() ([]resmap.Generator, error)
// not an inline config
generatorPaths = append(generatorPaths, p)
continue
} else {
// inline config, track the origin
if origin != nil {
resources := rm.Resources()
for _, r := range resources {
r.SetOrigin(origin.Append(kt.kustFileName))
rm.Replace(r)
}
}
}
ra.AppendAll(rm)
}
ra, err := kt.accumulateResources(ra, generatorPaths, &resource.Origin{})
ra, err := kt.accumulateResources(ra, generatorPaths, origin)
if err != nil {
return nil, err
}
Expand Down
27 changes: 24 additions & 3 deletions api/internal/target/kusttarget_configplugin.go
Expand Up @@ -5,11 +5,14 @@ package target

import (
"fmt"
"path/filepath"

"sigs.k8s.io/kustomize/api/internal/plugins/builtinconfig"
"sigs.k8s.io/kustomize/api/internal/plugins/builtinhelpers"
"sigs.k8s.io/kustomize/api/resmap"
"sigs.k8s.io/kustomize/api/resource"
"sigs.k8s.io/kustomize/api/types"
"sigs.k8s.io/kustomize/kyaml/yaml"
)

// Functions dedicated to configuring the builtin
Expand All @@ -27,8 +30,8 @@ import (
// image tag transforms. In these cases, we'll need
// N plugin instances with differing configurations.

func (kt *KustTarget) configureBuiltinGenerators() (
result []resmap.Generator, err error) {
func (kt *KustTarget) configureBuiltinGenerators(origin *resource.Origin) (
result []*resmap.GeneratorWithProperties, err error) {
for _, bpt := range []builtinhelpers.BuiltinPluginType{
builtinhelpers.ConfigMapGenerator,
builtinhelpers.SecretGenerator,
Expand All @@ -39,7 +42,25 @@ func (kt *KustTarget) configureBuiltinGenerators() (
if err != nil {
return nil, err
}
result = append(result, r...)

var generatorOrigin *resource.Origin
if origin != nil {
generatorOrigin = &resource.Origin{
Repo: origin.Repo,
Ref: origin.Ref,
ConfiguredIn: filepath.Join(origin.Path, kt.kustFileName),
ConfiguredBy: yaml.ResourceIdentifier{
TypeMeta: yaml.TypeMeta{
APIVersion: "builtin",
Kind: bpt.String(),
},
},
}
}

for i := range r {
result = append(result, &resmap.GeneratorWithProperties{Generator: r[i], Origin: generatorOrigin})
}
}
return result, nil
}
Expand Down

0 comments on commit 964bb38

Please sign in to comment.