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 a6b2124
Show file tree
Hide file tree
Showing 14 changed files with 156 additions and 75 deletions.
1 change: 1 addition & 0 deletions api/builtins/builtins.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type (
ValueAddTransformerPlugin = internal.ValueAddTransformerPlugin
)

//nolint:gochecknoglobals
var (
NewAnnotationsTransformerPlugin = internal.NewAnnotationsTransformerPlugin
NewResourceGeneratorPlugin = internal.NewResourceGeneratorPlugin
Expand Down
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(koba1t): check to influence of kt is null
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(koba1t): check to influence of kt is null
if err != nil {
return nil, errors.WrapPrefixf(
err, "plugin %s fails configuration", res.OrgId())
Expand Down
92 changes: 52 additions & 40 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,12 +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)
if err != nil {
Expand Down Expand Up @@ -419,40 +422,50 @@ 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 { //nolint:nestif
// 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)
_, err = kt.accumulateDirectory(ra, ldr, false)
// after we are done recursing through the directory, reset the origin
kt.origin = &origin
} else {
_, 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 @@ -527,8 +540,7 @@ func (kt *KustTarget) accumulateDirectory(
return nil, errors.WrapPrefixf(
err, "recursed accumulation of path '%s'", ldr.Root())
}
err = ra.MergeAccumulator(subRa)
if err != nil {
if err := ra.MergeAccumulator(subRa); err != nil {
return nil, errors.WrapPrefixf(
err, "recursed merging from path '%s'", ldr.Root())
}
Expand Down Expand Up @@ -570,7 +582,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
// }
23 changes: 20 additions & 3 deletions api/resmap/resmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
package resmap

import (
"fmt"

"sigs.k8s.io/kustomize/api/ifc"
"sigs.k8s.io/kustomize/api/resource"
"sigs.k8s.io/kustomize/api/types"
Expand Down Expand Up @@ -49,9 +51,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 +64,21 @@ 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) {
resmap, err := c.kt.AccumulateResource(path)
if err != nil {
return nil, fmt.Errorf("failed to AccumulateResource in internal `target` pkg: %w", err)
}
return resmap, nil
}

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

//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(koba1t): check to influence of kt is null

processor := framework.ResourceListProcessorFunc(func(resourceList *framework.ResourceList) error {
resMap, err := resmapFactory.NewResMapFromRNodeSlice(resourceList.Items)
Expand Down
9 changes: 5 additions & 4 deletions hack/generateBuiltinKrmFunctions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ builtinPlugins=(AnnotationsTransformer \
PrefixSuffixTransformer \
PrefixTransformer \
SuffixTransformer \
ResourceGenerator \
ReplicaCountTransformer \
SecretGenerator \
ValueAddTransformer \
Expand All @@ -29,14 +30,14 @@ fi


# Install pluginator
pushd ../cmd/pluginator
pushd ../cmd/pluginator || exit
make install
popd
popd || exit


for pluginName in ${builtinPlugins[@]}; do
dirName=$(echo $pluginName | tr '[:upper:]' '[:lower:]')
dirName=$(echo "$pluginName" | tr '[:upper:]' '[:lower:]')
srcPath="$builtinPluginDir/$dirName/$pluginName.go"
dstPath="$KRM_FUNCTION_DIR/$dirName"
pluginator krm -i $srcPath -o $dstPath
pluginator krm -i "$srcPath" -o "$dstPath"
done
20 changes: 14 additions & 6 deletions plugin/builtin/resourcegenerator/ResourceGenerator.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,31 @@
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
}
Loading

0 comments on commit a6b2124

Please sign in to comment.