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 30, 2023
1 parent 358babe commit e119b01
Show file tree
Hide file tree
Showing 16 changed files with 186 additions and 78 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.

6 changes: 2 additions & 4 deletions api/internal/plugins/execplugin/execplugin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +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(
fLdr.RestrictionRootOnly, filesys.Separator, fSys)
Expand Down Expand Up @@ -65,8 +64,7 @@ s/$BAR/bar baz/g
t.Fatalf("unexpected err: %v", err)
}
err = p.Config(
resmap.NewPluginHelpers(ldr, pvd.GetFieldValidator(), rf, pc),
yaml)
resmap.NewPluginHelpers(ldr, pvd.GetFieldValidator(), rf, pc), yaml)
require.NoError(t, err)

expected := "someteam.example.com/v1/sedtransformer/SedTransformer"
Expand Down
94 changes: 53 additions & 41 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 @@ -569,8 +581,8 @@ func (kt *KustTarget) configureBuiltinPlugin(
}
}
err = p.Config(
resmap.NewPluginHelpers(
kt.ldr, kt.validator, kt.rFactory, kt.pLdr.Config()),
resmap.NewPluginHelpersWithKt(
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
2 changes: 1 addition & 1 deletion api/krusty/accumulation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ resources:
}
buildError := func(tc testcase) string {
const (
prefix = "accumulating resources"
prefix = "failed to accumulateResource"
filePrefixf = "accumulating resources from '%s'"
fileWrapperIfDirf = "accumulation err='%s'"
separator = ": "
Expand Down
30 changes: 27 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,16 @@ 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,
) *PluginHelpers {
return &PluginHelpers{ldr: ldr, v: v, rf: rf, pc: pc, kt: nil} // TODO(koba1t): check to influence of kt is null
}

// NewPluginHelpersWithKt makes an instance of PluginHelpers additional kt with args.
func NewPluginHelpersWithKt(
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 +71,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
4 changes: 2 additions & 2 deletions cmd/pluginator/internal/krmfunction/funcwrappersrc/go.mod.src
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.20

require (
github.com/spf13/cobra v1.4.0
sigs.k8s.io/kustomize/api v0.12.1
sigs.k8s.io/kustomize/kyaml v0.13.9
sigs.k8s.io/kustomize/api v0.14.0
sigs.k8s.io/kustomize/kyaml v0.14.3
sigs.k8s.io/yaml v1.2.0
)
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()) // 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
6 changes: 3 additions & 3 deletions hack/for-each-module.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ fi

cmd=$1
skip_pattern="${2-}"
expected_module_count=${3:-45}
expected_module_count=${3:-46}

seen=()
# Hack scripts must be run from the root of the repository.
Expand All @@ -25,11 +25,11 @@ export KUSTOMIZE_ROOT
# verify all modules pass validation
for i in $(find . -name go.mod -not -path "./site/*" -not -path "$skip_pattern"); do
pushd .
cd $(dirname $i);
cd $(dirname "$i");

set +x
dir=$(pwd)
module="${dir#$KUSTOMIZE_ROOT}"
module="${dir#"$KUSTOMIZE_ROOT"}"
echo -e "\n----------------------------------------------------------"
echo "Running command in $module"
echo -e "----------------------------------------------------------"
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
Loading

0 comments on commit e119b01

Please sign in to comment.