Skip to content

Commit

Permalink
implement ResourceGenerator and change call the accumulateResources f…
Browse files Browse the repository at this point in the history
…unction to ResourceGenerator
  • Loading branch information
koba1t committed Aug 10, 2023
1 parent 8a195ab commit 42759d6
Show file tree
Hide file tree
Showing 13 changed files with 178 additions and 70 deletions.
33 changes: 33 additions & 0 deletions api/export/target.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package export

import (
"fmt"

"sigs.k8s.io/kustomize/api/internal/accumulator"
"sigs.k8s.io/kustomize/api/internal/target"
"sigs.k8s.io/kustomize/api/resmap"
)

type KustTarget target.KustTarget

func (kt *KustTarget) AccumulateTarget() (*accumulator.ResAccumulator, error) {
internalKt := (*target.KustTarget)(kt)
ra, err := internalKt.AccumulateTarget()
if err != nil {
return nil, fmt.Errorf("%w", err)
}
return ra, nil
}

func (kt *KustTarget) Accumulate() (resmap.ResMap, error) {
internalKt := (*target.KustTarget)(kt)
_, err := internalKt.AccumulateTarget()
if err != nil {
return nil, fmt.Errorf("%w", err)
}
resmap, err := internalKt.MakeCustomizedResMap()
if err != nil {
return nil, fmt.Errorf("%w", err)
}
return resmap, nil
}
5 changes: 2 additions & 3 deletions api/internal/accumulator/resaccumulator.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@ import (
"sigs.k8s.io/kustomize/kyaml/resid"
)

// ResAccumulator accumulates resources and the rules
// used to customize those resources. It's a ResMap
// plus stuff needed to modify the ResMap.
// ResAccumulator accumulates resources and the rules used to customize those resources.
// It's a ResMap plus stuff needed to modify the ResMap.
type ResAccumulator struct {
resMap resmap.ResMap
tConfig *builtinconfig.TransformerConfig
Expand Down
20 changes: 14 additions & 6 deletions api/internal/builtins/ResourceGenerator.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions api/internal/plugins/execplugin/execplugin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func TestExecPluginConfig(t *testing.T) {
err := fSys.WriteFile("sed-input.txt", []byte(`
s/$FOO/foo/g
s/$BAR/bar baz/g
\ \ \
\ \ \
`))
require.NoError(t, err)
ldr, err := fLdr.NewLoader(
Expand Down Expand Up @@ -65,7 +65,7 @@ s/$BAR/bar baz/g
t.Fatalf("unexpected err: %v", err)
}
err = p.Config(
resmap.NewPluginHelpers(ldr, pvd.GetFieldValidator(), rf, pc),
resmap.NewPluginHelpers(ldr, pvd.GetFieldValidator(), rf, pc, nil), //TODO
yaml)
require.NoError(t, err)

Expand Down
2 changes: 1 addition & 1 deletion api/internal/plugins/loader/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ func (l *Loader) loadAndConfigurePlugin(
if err != nil {
return nil, errors.WrapPrefixf(err, "marshalling yaml from res %s", res.OrgId())
}
err = c.Config(resmap.NewPluginHelpers(ldr, v, l.rf, l.pc), yaml)
err = c.Config(resmap.NewPluginHelpers(ldr, v, l.rf, l.pc, nil), yaml) //TODO
if err != nil {
return nil, errors.WrapPrefixf(
err, "plugin %s fails configuration", res.OrgId())
Expand Down
89 changes: 52 additions & 37 deletions api/internal/target/kusttarget.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type KustTarget struct {
ldr ifc.Loader
validator ifc.Validator
rFactory *resmap.Factory
pLdr *loader.Loader
pLdr *loader.Loader // plugin loader
origin *resource.Origin
}

Expand Down Expand Up @@ -176,6 +176,15 @@ func (kt *KustTarget) addHashesToNames(
return ra.Transform(p)
}

// AccumulateResource fills the given resourceAccumulator with resources read from the given path from external package.
func (kt *KustTarget) AccumulateResource(path string) (rm resmap.ResMap, err error) {
ra := accumulator.MakeEmptyAccumulator()
if err := kt.accumulateResource(ra, path); err != nil {
return nil, fmt.Errorf("failed to accumulateResource: %w", err)
}
return ra.ResMap(), nil
}

// AccumulateTarget returns a new ResAccumulator,
// holding customized resources and the data/rules used
// to do so. The name back references and vars are
Expand All @@ -197,11 +206,6 @@ func (kt *KustTarget) AccumulateTarget() (
// ra should be empty when this KustTarget is a Kustomization, or the ra of the parent if this KustTarget is a Component
// (or empty if the Component does not have a parent).
func (kt *KustTarget) accumulateTarget(ra *accumulator.ResAccumulator) (resRa *accumulator.ResAccumulator, err error) {
// read `resources`
ra, err = kt.accumulateResources(ra, kt.kustomization.Resources) // it needs to remove
if err != nil {
return nil, errors.WrapPrefixf(err, "accumulating resources")
}

tConfig, err := builtinconfig.MakeTransformerConfig(
kt.ldr, kt.kustomization.Configurations)
Expand Down Expand Up @@ -419,40 +423,51 @@ func (kt *KustTarget) removeValidatedByLabel(rm resmap.ResMap) error {
func (kt *KustTarget) accumulateResources(
ra *accumulator.ResAccumulator, paths []string) (*accumulator.ResAccumulator, error) {
for _, path := range paths {
// try loading resource as file then as base (directory or git repository)
if errF := kt.accumulateFile(ra, path); errF != nil {
// not much we can do if the error is an HTTP error so we bail out
if errors.Is(errF, load.ErrHTTP) {
return nil, errF
}
ldr, err := kt.ldr.New(path)
if err != nil {
if kusterr.IsMalformedYAMLError(errF) { // Some error occurred while tyring to decode YAML file
return nil, errF
}
return nil, errors.WrapPrefixf(
err, "accumulation err='%s'", errF.Error())
}
// store the origin, we'll need it later
origin := kt.origin.Copy()
if kt.origin != nil {
kt.origin = kt.origin.Append(path)
ra, err = kt.accumulateDirectory(ra, ldr, false)
// after we are done recursing through the directory, reset the origin
kt.origin = &origin
} else {
ra, err = kt.accumulateDirectory(ra, ldr, false)
if err := kt.accumulateResource(ra, path); err != nil {
return nil, err
}
}
return ra, nil
}

// accumulateResource fills the given resourceAccumulator with resources read from the given path.
func (kt *KustTarget) accumulateResource(ra *accumulator.ResAccumulator, path string) error {
// try loading resource as file then as base (directory or git repository)
if errF := kt.accumulateFile(ra, path); errF != nil {
// not much we can do if the error is an HTTP error so we bail out
if errors.Is(errF, load.ErrHTTP) {
return errF
}
ldr, err := kt.ldr.New(path)
if err != nil {
// Some error occurred while tyring to decode YAML file
if kusterr.IsMalformedYAMLError(errF) {

return errF
}
if err != nil {
if kusterr.IsMalformedYAMLError(errF) { // Some error occurred while tyring to decode YAML file
return nil, errF
}
return nil, errors.WrapPrefixf(
err, "accumulation err='%s'", errF.Error())
return errors.WrapPrefixf(
err, "accumulation err='%s'", errF.Error())
}
// store the origin, we'll need it later
origin := kt.origin.Copy()
if kt.origin != nil {
kt.origin = kt.origin.Append(path)
ra, err = kt.accumulateDirectory(ra, ldr, false)
// after we are done recursing through the directory, reset the origin
kt.origin = &origin
} else {
ra, err = kt.accumulateDirectory(ra, ldr, false)
}
if err != nil {
// Some error occurred while tyring to decode YAML file
if kusterr.IsMalformedYAMLError(errF) {
return errF
}
return errors.WrapPrefixf(
err, "accumulation err='%s'", errF.Error())
}
}
return ra, nil
return nil
}

// accumulateResources fills the given resourceAccumulator
Expand Down Expand Up @@ -570,7 +585,7 @@ func (kt *KustTarget) configureBuiltinPlugin(
}
err = p.Config(
resmap.NewPluginHelpers(
kt.ldr, kt.validator, kt.rFactory, kt.pLdr.Config()),
kt.ldr, kt.validator, kt.rFactory, kt.pLdr.Config(), kt),
y)
if err != nil {
return errors.WrapPrefixf(
Expand Down
10 changes: 8 additions & 2 deletions api/internal/target/kusttarget_configplugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,18 +109,24 @@ func (kt *KustTarget) configureBuiltinTransformers(tc *builtinconfig.Transformer

type gFactory func() resmap.GeneratorPlugin

type ResourceArgs struct {
Resource string `json:"resource,omitempty" yaml:"resource,omitempty"`
Kt *KustTarget `json:"kusttarget,omitempty" yaml:"kusttarget,omitempty"`
}

var generatorConfigurators = map[builtinhelpers.BuiltinPluginType]func(
kt *KustTarget,
bpt builtinhelpers.BuiltinPluginType,
factory gFactory) (result []resmap.Generator, err error){
builtinhelpers.ResourceGenerator: func(kt *KustTarget, bpt builtinhelpers.BuiltinPluginType, f gFactory) (
result []resmap.Generator, err error) {
var c struct {
resource string
Resource string `json:"resource" yaml:"resource"`
}
for _, args := range kt.kustomization.Resources {
c.resource = args
c.Resource = args
p := f()

if err := kt.configureBuiltinPlugin(p, c, bpt); err != nil {
return nil, err
}
Expand Down
4 changes: 4 additions & 0 deletions api/resmap/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,7 @@ func (rmF *Factory) NewResMapFromRNodeSlice(s []*yaml.RNode) (ResMap, error) {
}
return newResMapFromResourceSlice(rs)
}

// func (rmF *Factory) FromResourceEntry(loader ifc.Loader, resource string, ktInterface interface{}) (ResMap, error) {
// return nil, nil
// }
17 changes: 14 additions & 3 deletions api/resmap/resmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ type Configurable interface {

// NewPluginHelpers makes an instance of PluginHelpers.
func NewPluginHelpers(
ldr ifc.Loader, v ifc.Validator, rf *Factory,
pc *types.PluginConfig) *PluginHelpers {
return &PluginHelpers{ldr: ldr, v: v, rf: rf, pc: pc}
ldr ifc.Loader, v ifc.Validator, rf *Factory, pc *types.PluginConfig, kt KustTargetInterface,
) *PluginHelpers {
return &PluginHelpers{ldr: ldr, v: v, rf: rf, pc: pc, kt: kt}
}

// PluginHelpers holds things that any or all plugins might need.
Expand All @@ -62,6 +62,17 @@ type PluginHelpers struct {
v ifc.Validator
rf *Factory
pc *types.PluginConfig
kt KustTargetInterface
}

// KustTargetInterface is the interface for exec accumulate functions from external packages.
type KustTargetInterface interface {
AccumulateResource(path string) (ResMap, error)
}

// AccumulateResources exec target.(*KustTarget).AccumulateResource()
func (c *PluginHelpers) AccumulateResource(path string) (ResMap, error) {
return c.kt.AccumulateResource(path)
}

func (c *PluginHelpers) GeneralConfig() *types.PluginConfig {
Expand Down
4 changes: 2 additions & 2 deletions cmd/pluginator/internal/krmfunction/funcwrappersrc/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ import (
"sigs.k8s.io/kustomize/kyaml/fn/framework"
)

//nolint
// nolint
func main() {
var plugin resmap.Configurable
p := provider.NewDefaultDepProvider()
resmapFactory := resmap.NewFactory(p.GetResourceFactory())
pluginHelpers := resmap.NewPluginHelpers(
nil, p.GetFieldValidator(), resmapFactory, types.DisabledPluginConfig())
nil, p.GetFieldValidator(), resmapFactory, types.DisabledPluginConfig(), nil) //TODO

processor := framework.ResourceListProcessorFunc(func(resourceList *framework.ResourceList) error {
resMap, err := resmapFactory.NewResMapFromRNodeSlice(resourceList.Items)
Expand Down
22 changes: 14 additions & 8 deletions plugin/builtin/resourcegenerator/ResourceGenerator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,29 @@
package main

import (
"fmt"

"sigs.k8s.io/kustomize/api/resmap"
"sigs.k8s.io/kustomize/kyaml/yaml"
)

type plugin struct {
h *resmap.PluginHelpers
resource string
Resource string `json:"resource" yaml:"resource"`
}

var KustomizePlugin plugin //nolint:gochecknoglobals

func (p *plugin) Config(h *resmap.PluginHelpers, config []byte) (err error) {
func (p *plugin) Config(h *resmap.PluginHelpers, config []byte) error {
p.h = h
return
if err := yaml.Unmarshal(config, p); err != nil {
return fmt.Errorf("failed to unmarshal ResourceGenerator config: %w", err)
}
return nil
}

func (p *plugin) Generate() (resmap.ResMap, error) {

resourceBytes := []byte(p.resource) //idiot
return p.h.ResmapFactory().NewResMapFromBytes(resourceBytes)
resmap, err := p.h.AccumulateResource(p.Resource)
if err != nil {
return nil, fmt.Errorf("failed to Accumulate: %w", err)
}
return resmap, nil
}
36 changes: 31 additions & 5 deletions plugin/builtin/resourcegenerator/ResourceGenerator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,35 @@

package main_test

import (
"testing"
)
// func TestResourceGenerator(t *testing.T) {
// th := kusttest_test.MakeEnhancedHarness(t).
// PrepBuiltin("ResourceGenerator")
// defer th.Reset()

func TestResourceGenerator(t *testing.T) {
}
// th.WriteF("config.yaml", `
// apiVersion: v1
// kind: ConfigMap
// metadata:
// name: myMap
// data:
// COLOR: red
// FRUIT: apple
// `)
// rm := th.LoadAndRunGenerator(`
// apiVersion: builtin
// kind: ResourceGenerator
// metadata:
// name: myMap
// resource: config.yaml
// `)

// th.AssertActualEqualsExpected(rm, `
// apiVersion: v1
// kind: ConfigMap
// metadata:
// name: myMap
// data:
// COLOR: red
// FRUIT: apple
// `)
// }
Loading

0 comments on commit 42759d6

Please sign in to comment.